From 2fda04083135355d18f9c4c91221da0e4c08614d Mon Sep 17 00:00:00 2001 From: Susanne Date: Tue, 6 Aug 2019 17:45:27 +0300 Subject: [PATCH 1/4] new FVGeom class implementation --- .../spatial_disc/disc_util/fv1Cut_geom.cpp | 1861 +++++++++++++++++ 1 file changed, 1861 insertions(+) create mode 100644 ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.cpp diff --git a/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.cpp b/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.cpp new file mode 100644 index 000000000..8ab4e8e54 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.cpp @@ -0,0 +1,1861 @@ +/* + * Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt + * Author: Andreas Vogel + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1Cut_GEOMETRY_IMPL_ +#define __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1Cut_GEOMETRY_IMPL_ + +#include "common/util/provider.h" +#include "fv1Cut_geom.h" +#include "lib_disc/reference_element/reference_element.h" +#include "lib_disc/quadrature/quadrature.h" +#include "lib_algebra/common/operations_vec.h" + +#include "lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h" + + +namespace ug{ + +/** + * \tparam dim dimension of coordinates + * \tparam TRefElem Reference element type + * \tparam maxMid Maximum number of elements for all dimensions + */ +template +static void ComputeMidPoints(const TRefElem& rRefElem, + const MathVector vCorner[], + MathVector vvMid[][maxMid]) +{ +// compute local midpoints for all geometric objects with 0 < d <= dim + for(int d = 1; d <= dim; ++d) + { + // loop geometric objects of dimension d + for(size_t i = 0; i < rRefElem.num(d); ++i) + { + // set first node + const size_t coID0 = rRefElem.id(d, i, 0, 0); + vvMid[d][i] = vCorner[coID0]; + + // add corner coordinates of the corners of the geometric object + for(size_t j = 1; j < rRefElem.num(d, i, 0); ++j) + { + const size_t coID = rRefElem.id(d, i, 0, j); + vvMid[d][i] += vCorner[coID]; + } + + // scale for correct averaging + vvMid[d][i] *= 1./(rRefElem.num(d, i, 0)); + } + } + +// for OCTAHEDRONS: add midpoints of imaginary faces, edges and volumes +// resulting from the division into 4 tetrahedra alongside inner edge 3->1 + if (rRefElem.roid() == ROID_OCTAHEDRON) + { + // diagonal 3->1, diagonal 1->3 + VecScaleAdd(vvMid[1][rRefElem.num(1)], 0.5, vCorner[3], 0.5, vCorner[1]); + VecScaleAdd(vvMid[1][rRefElem.num(1)+1], 0.5, vCorner[1], 0.5, vCorner[3]); + + // subface 1,2,3; subface 1,3,2; subface 1,3,4; subface 1,4,3; face 1,3,5; face 1,5,3; face 1,0,3; face 1,3,0 + vvMid[2][rRefElem.num(2)] = vCorner[1]; + vvMid[2][rRefElem.num(2)] += vCorner[2]; + vvMid[2][rRefElem.num(2)] += vCorner[3]; + vvMid[2][rRefElem.num(2)] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+1] = vCorner[1]; + vvMid[2][rRefElem.num(2)+1] += vCorner[3]; + vvMid[2][rRefElem.num(2)+1] += vCorner[2]; + vvMid[2][rRefElem.num(2)+1] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+2] = vCorner[1]; + vvMid[2][rRefElem.num(2)+2] += vCorner[3]; + vvMid[2][rRefElem.num(2)+2] += vCorner[4]; + vvMid[2][rRefElem.num(2)+2] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+3] = vCorner[1]; + vvMid[2][rRefElem.num(2)+3] += vCorner[4]; + vvMid[2][rRefElem.num(2)+3] += vCorner[3]; + vvMid[2][rRefElem.num(2)+3] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+4] = vCorner[1]; + vvMid[2][rRefElem.num(2)+4] += vCorner[3]; + vvMid[2][rRefElem.num(2)+4] += vCorner[5]; + vvMid[2][rRefElem.num(2)+4] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+5] = vCorner[1]; + vvMid[2][rRefElem.num(2)+5] += vCorner[5]; + vvMid[2][rRefElem.num(2)+5] += vCorner[3]; + vvMid[2][rRefElem.num(2)+5] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+6] = vCorner[1]; + vvMid[2][rRefElem.num(2)+6] += vCorner[0]; + vvMid[2][rRefElem.num(2)+6] += vCorner[3]; + vvMid[2][rRefElem.num(2)+6] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+7] = vCorner[1]; + vvMid[2][rRefElem.num(2)+7] += vCorner[3]; + vvMid[2][rRefElem.num(2)+7] += vCorner[0]; + vvMid[2][rRefElem.num(2)+7] *= 1.0/3.0; + + // subvolume 1,2,3,5; subvolume 1,3,4,5; subvolume 1,2,3,0; subvolume 1,3,4,0 + vvMid[3][rRefElem.num(3)] = vCorner[1]; + vvMid[3][rRefElem.num(3)] += vCorner[2]; + vvMid[3][rRefElem.num(3)] += vCorner[3]; + vvMid[3][rRefElem.num(3)] += vCorner[5]; + vvMid[3][rRefElem.num(3)] *= 0.25; + + vvMid[3][rRefElem.num(3)+1] = vCorner[1]; + vvMid[3][rRefElem.num(3)+1] += vCorner[3]; + vvMid[3][rRefElem.num(3)+1] += vCorner[4]; + vvMid[3][rRefElem.num(3)+1] += vCorner[5]; + vvMid[3][rRefElem.num(3)+1] *= 0.25; + + vvMid[3][rRefElem.num(3)+2] = vCorner[1]; + vvMid[3][rRefElem.num(3)+2] += vCorner[2]; + vvMid[3][rRefElem.num(3)+2] += vCorner[3]; + vvMid[3][rRefElem.num(3)+2] += vCorner[0]; + vvMid[3][rRefElem.num(3)+2] *= 0.25; + + vvMid[3][rRefElem.num(3)+3] = vCorner[1]; + vvMid[3][rRefElem.num(3)+3] += vCorner[3]; + vvMid[3][rRefElem.num(3)+3] += vCorner[4]; + vvMid[3][rRefElem.num(3)+3] += vCorner[0]; + vvMid[3][rRefElem.num(3)+3] *= 0.25; + } +} + +/** + * \param[in] i indicates that scvf corresponds to i'th edge of ref elem + */ +template +static void ComputeSCVFMidID(const TRefElem& rRefElem, + MidID vMidID[], int i) +{ + static const int dim = TRefElem::dim; + + if (rRefElem.roid() != ROID_PYRAMID && rRefElem.roid() != ROID_OCTAHEDRON) + { + // set mid ids + { + // start at edge midpoint + vMidID[0] = MidID(1,i); + + // loop up dimension + if(dim == 2) + { + vMidID[1] = MidID(dim, 0); // center of element + } + else if (dim == 3) + { + vMidID[1] = MidID(2, rRefElem.id(1, i, 2, 0)); // side 0 + vMidID[2] = MidID(dim, 0); // center of element + vMidID[3] = MidID(2, rRefElem.id(1, i, 2, 1)); // side 1 + } + } + } +// pyramid here + else if(rRefElem.roid() == ROID_PYRAMID) + { + // start at edge midpoint + vMidID[0] = MidID(1,i/2); + + // there are 2 scvf per edge + if(i%2 == 0){ + vMidID[1] = MidID(2, rRefElem.id(1, i/2, 2, 0)); // side 0 + vMidID[2] = MidID(dim, 0); // center of element + } else { + vMidID[1] = MidID(dim, 0); // center of element + vMidID[2] = MidID(2, rRefElem.id(1, i/2, 2, 1)); // side 1 + } + } +// octahedron here (analogue to scvf ordering in pyramids but in top/bottom pairs) + else if(rRefElem.roid() == ROID_OCTAHEDRON) + { + switch (i) + { + // scvf of edge 4 (top) + case 0: vMidID[0] = MidID(1,4); // edge 4 + vMidID[1] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,4); // face 4 + break; + // scvf of edge 4 (bottom) + case 1: vMidID[0] = MidID(1,4); // edge 4 + vMidID[1] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,0); // face 0 + break; + + + // scvf of edge 5 (top) + case 2: vMidID[0] = MidID(1,5); // edge 5 + vMidID[1] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,5); // face 5 + break; + // scvf of edge 5 (bottom) + case 3: vMidID[0] = MidID(1,5); // edge 5 + vMidID[1] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,1); // face 1 + break; + + + // scvf of diagonal 3->1 (top) in subvolume 0 + case 4: vMidID[0] = MidID(1,12);// diagonal 3->1 + vMidID[1] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,13);// face 1,5,3 + break; + // scvf of diagonal 1->3 (bottom) in subvolume 2 + case 5: vMidID[0] = MidID(1,13);// diagonal 1->3 + vMidID[1] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,14);// face 1,0,3 + break; + + + // scvf of edge 8 in subvolume 0 + case 6: vMidID[0] = MidID(1,8); // edge 8 + vMidID[1] = MidID(2,4); // face 4 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,13);// face 1,5,3 + break; + // scvf of edge 0 in subvolume 2 + case 7: vMidID[0] = MidID(1,0); // edge 0 + vMidID[1] = MidID(2,15);// face 1,3,0 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,0); // face 0 + break; + + + // scvf of edge 9 + case 8: vMidID[0] = MidID(1,9); // edge 9 + vMidID[1] = MidID(2,5); // face 5 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,4); // face 4 + break; + // scvf of edge 1 + case 9: vMidID[0] = MidID(1,1); // edge 1 + vMidID[1] = MidID(2,0); // face 0 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,1); // face 1 + break; + + + // scvf of edge 10 in subvolume 0 + case 10:vMidID[0] = MidID(1,10);// edge 10 + vMidID[1] = MidID(2,12);// face 1,3,5 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,5); // face 5 + break; + // scvf of edge 2 in subvolume 2 + case 11:vMidID[0] = MidID(1,2); // edge 2 + vMidID[1] = MidID(2,1); // face 1 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,14);// face 1,0,3 + break; + + + // scvf of diagonal 1->3 (top) in subvolume 1 + case 12:vMidID[0] = MidID(1,13);// diagonal 1->3 + vMidID[1] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,12);// face 1,3,5 + break; + // scvf of diagonal 3->1 (bottom) in subvolume 3 + case 13:vMidID[0] = MidID(1,12);// diagonal 3->1 + vMidID[1] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,15);// face 1,3,0 + break; + + + // scvf of edge 6 (top) + case 14:vMidID[0] = MidID(1,6); // edge 6 + vMidID[1] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,6); // face 6 + break; + // scvf of edge 6 (bottom) + case 15:vMidID[0] = MidID(1,6); // edge 6 + vMidID[1] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,2); // face 2 + break; + + + // scvf of edge 7 (top) + case 16:vMidID[0] = MidID(1,7); // edge 7 + vMidID[1] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,7); // face 7 + break; + // scvf of edge 7 (bottom) + case 17:vMidID[0] = MidID(1,7); // edge 7 + vMidID[1] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,3); // face 3 + break; + + + // scvf of edge 8 in subvolume 1 + case 18:vMidID[0] = MidID(1,8); // edge 8 + vMidID[1] = MidID(2,13);// face 1,5,3 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,7); // face 7 + break; + // scvf of edge 0 in subvolume 3 + case 19:vMidID[0] = MidID(1,0); // edge 0 + vMidID[1] = MidID(2,3); // face 3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,15);// face 1,3,0 + break; + + + // scvf of edge 10 in subvolume 1 + case 20:vMidID[0] = MidID(1,10);// edge 10 + vMidID[1] = MidID(2,6); // face 6 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,12);// face 1,3,5 + break; + // scvf of edge 2 in subvolume 3 + case 21:vMidID[0] = MidID(1,2); // edge 2 + vMidID[1] = MidID(2,14);// face 1,0,3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,2); // face 2 + break; + + + // scvf of edge 11 in subvolume 1 + case 22:vMidID[0] = MidID(1,11);// edge 11 + vMidID[1] = MidID(2,7); // face 7 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,6); // face 6 + break; + // scvf of edge 3 in subvolume 3 + case 23:vMidID[0] = MidID(1,3); // edge 3 + vMidID[1] = MidID(2,2); // face 2 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,3); // face 3 + break; + + + default:UG_THROW("Octahedron only has 24 SCVFs (no. 0-23), but requested no. " << i << "."); + break; + } + } +} + +/** + * \param[in] i indicates that scv corresponds to i'th corner of ref elem + */ +template +static void ComputeSCVMidID(const TRefElem& rRefElem, + MidID vMidID[], int i) +{ + static const int dim = TRefElem::dim; + + if (rRefElem.roid() != ROID_PYRAMID && rRefElem.roid() != ROID_OCTAHEDRON) + { + if(dim == 1) + { + vMidID[0] = MidID(0, i); // set node as corner of scv + vMidID[1] = MidID(dim, 0); // center of element + } + else if(dim == 2) + { + vMidID[0] = MidID(0, i); // set node as corner of scv + vMidID[1] = MidID(1, rRefElem.id(0, i, 1, 0)); // edge 1 + vMidID[2] = MidID(dim, 0); // center of element + vMidID[3] = MidID(1, rRefElem.id(0, i, 1, 1)); // edge 2 + } + else if(dim == 3) + { + vMidID[0] = MidID(0, i); // set node as corner of scv + vMidID[1] = MidID(1, rRefElem.id(0, i, 1, 1)); // edge 1 + vMidID[2] = MidID(2, rRefElem.id(0, i, 2, 0)); // face 0 + vMidID[3] = MidID(1, rRefElem.id(0, i, 1, 0)); // edge 0 + vMidID[4] = MidID(1, rRefElem.id(0, i, 1, 2)); // edge 2 + vMidID[5] = MidID(2, rRefElem.id(0, i, 2, 2)); // face 2 + vMidID[6] = MidID(dim, 0); // center of element + vMidID[7] = MidID(2, rRefElem.id(0, i, 2, 1)); // face 1 + } + else {UG_THROW("Dimension higher than 3 not implemented.");} + } +// pyramid here + else if (rRefElem.roid() == ROID_PYRAMID) + { + // start at edge midpoint + vMidID[3] = MidID(1,i/4); + + // there are 2 scvf per edge + if(i%4 == 0 || i%4 == 1){ + vMidID[1] = MidID(2, rRefElem.id(1, i/4, 2, 0)); // side 0 + vMidID[2] = MidID(dim, 0); // center of element + } else { + vMidID[1] = MidID(dim, 0); // center of element + vMidID[2] = MidID(2, rRefElem.id(1, i/4, 2, 1)); // side 1 + } + + // connect to from / to corners of edge + if(i%2 == 0){ + vMidID[0] = MidID(0, rRefElem.id(1, i/4, 0, 0)); // from + } else { + vMidID[0] = MidID(0, rRefElem.id(1, i/4, 0, 1)); // to + } + } + // octahedron here (analogue to scv ordering in pyramids but in top/bottom pairs) + else if(rRefElem.roid() == ROID_OCTAHEDRON) + { + switch (i) + { + // scv of corner 1 in subvolume 0 (top) + case 0: vMidID[0] = MidID(0,1); // corner 1 + vMidID[1] = MidID(1,4); // edge 4 + vMidID[2] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[3] = MidID(1,12);// edge 3->1 + vMidID[4] = MidID(1,8); // edge 8 + vMidID[5] = MidID(2,4); // face 4 + vMidID[6] = MidID(3,1); // subvolume 0 + vMidID[7] = MidID(2,13);// face 1,5,3 + break; + // scv of corner 1 in subvolume 2 (bottom) + case 1: vMidID[0] = MidID(0,1); // corner 1 + vMidID[1] = MidID(1,13);// edge 1->3 + vMidID[2] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[3] = MidID(1,4); // edge 4 + vMidID[4] = MidID(1,0); // edge 0 + vMidID[5] = MidID(2,15);// face 1,3,0 + vMidID[6] = MidID(3,3); // subvolume 2 + vMidID[7] = MidID(2,0); // face 0 + break; + + + // scv of corner 2 in subvolume 0 (top) + case 2: vMidID[0] = MidID(0,2); // corner 2 + vMidID[1] = MidID(1,5); // edge 5 + vMidID[2] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[3] = MidID(1,4); // edge 4 + vMidID[4] = MidID(1,9); // edge 9 + vMidID[5] = MidID(2,5); // face 5 + vMidID[6] = MidID(3,1); // subvolume 0 + vMidID[7] = MidID(2,4); // face 4 + break; + // scv of corner 2 in subvolume 2 (bottom) + case 3: vMidID[0] = MidID(0,2); // corner 2 + vMidID[1] = MidID(1,4); // edge 4 + vMidID[2] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[3] = MidID(1,5); // edge 5 + vMidID[4] = MidID(1,1); // edge 1 + vMidID[5] = MidID(2,0); // face 0 + vMidID[6] = MidID(3,3); // subvolume 2 + vMidID[7] = MidID(2,1); // face 1 + break; + + + // scv of corner 3 in subvolume 0 (top) + case 4: vMidID[0] = MidID(0,3); // corner 3 + vMidID[1] = MidID(1,12);// edge 3->1 + vMidID[2] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[3] = MidID(1,5); // edge 5 + vMidID[4] = MidID(1,10);// edge 10 + vMidID[5] = MidID(2,13);// face 1,5,3 + vMidID[6] = MidID(3,1); // subvolume 0 + vMidID[7] = MidID(2,5); // face 5 + break; + // scv of corner 3 in subvolume 2 (bottom) + case 5: vMidID[0] = MidID(0,3); // corner 3 + vMidID[1] = MidID(1,5); // edge 5 + vMidID[2] = MidID(2,9); // subface 0 = 1,3,2 + vMidID[3] = MidID(1,13);// edge 1->3 + vMidID[4] = MidID(1,2); // edge 2 + vMidID[5] = MidID(2,1); // face 1 + vMidID[6] = MidID(3,3); // subvolume 2 + vMidID[7] = MidID(2,15);// face 1,3,0 + break; + + + // scv of corner 5 in subvolume 0 (top) + case 6: vMidID[0] = MidID(0,5); // corner 5 + vMidID[1] = MidID(1,9); // edge 9 + vMidID[2] = MidID(2,4); // face 4 + vMidID[3] = MidID(1,8); // edge 8 + vMidID[4] = MidID(1,10);// edge 10 + vMidID[5] = MidID(2,5); // face 5 + vMidID[6] = MidID(3,1); // subvolume 0 + vMidID[7] = MidID(2,13);// subface 1,5,3 + break; + // scv of corner 0 in subvolume 2 (bottom) + case 7: vMidID[0] = MidID(0,0); // corner 0 + vMidID[1] = MidID(1,0); // edge 0 + vMidID[2] = MidID(2,0); // face 0 + vMidID[3] = MidID(1,1); // edge 1 + vMidID[4] = MidID(1,2); // edge 2 + vMidID[5] = MidID(2,14);// subface 1,0,3 + vMidID[6] = MidID(3,3); // subvolume 2 + vMidID[7] = MidID(2,1); // face 1 + break; + + + // scv of corner 1 in subvolume 1 (top) + case 8: vMidID[0] = MidID(0,1); // corner 1 + vMidID[1] = MidID(1,13);// edge 1->3 + vMidID[2] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[3] = MidID(1,7); // edge 7 + vMidID[4] = MidID(1,8); // edge 8 + vMidID[5] = MidID(2,12);// face 1,3,5 + vMidID[6] = MidID(3,2); // subvolume 1 + vMidID[7] = MidID(2,7); // face 7 + break; + // scv of corner 1 in subvolume 3 (bottom) + case 9: vMidID[0] = MidID(0,1); // corner 1 + vMidID[1] = MidID(1,7); // edge 7 + vMidID[2] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[3] = MidID(1,12);// edge 3->1 + vMidID[4] = MidID(1,0); // edge 0 + vMidID[5] = MidID(2,3); // face 3 + vMidID[6] = MidID(3,4); // subvolume 3 + vMidID[7] = MidID(2,14);// face 1,0,3 + break; + + + // scv of corner 3 in subvolume 1 (top) + case 10:vMidID[0] = MidID(0,3); // corner 3 + vMidID[1] = MidID(1,6); // edge 6 + vMidID[2] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[3] = MidID(1,13);// edge 1->3 + vMidID[4] = MidID(1,10);// edge 10 + vMidID[5] = MidID(2,6); // face 6 + vMidID[6] = MidID(3,2); // subvolume 1 + vMidID[7] = MidID(2,12);// face 1,3,5 + break; + // scv of corner 3 in subvolume 3 (bottom) + case 11:vMidID[0] = MidID(0,3); // corner 3 + vMidID[1] = MidID(1,12);// edge 3->1 + vMidID[2] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[3] = MidID(1,6); // edge 6 + vMidID[4] = MidID(1,2); // edge 2 + vMidID[5] = MidID(2,14);// face 1,0,3 + vMidID[6] = MidID(3,4); // subvolume 3 + vMidID[7] = MidID(2,2); // face 2 + break; + + + // scv of corner 4 in subvolume 1 (top) + case 12:vMidID[0] = MidID(0,4); // corner 4 + vMidID[1] = MidID(1,7); // edge 7 + vMidID[2] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[3] = MidID(1,6); // edge 6 + vMidID[4] = MidID(1,11);// edge 11 + vMidID[5] = MidID(2,7); // face 7 + vMidID[6] = MidID(3,2); // subvolume 1 + vMidID[7] = MidID(2,6); // face 6 + break; + // scv of corner 4 in subvolume 3 (bottom) + case 13:vMidID[0] = MidID(0,4); // corner 4 + vMidID[1] = MidID(1,6); // edge 6 + vMidID[2] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[3] = MidID(1,7); // edge 7 + vMidID[4] = MidID(1,3); // edge 3 + vMidID[5] = MidID(2,2); // face 2 + vMidID[6] = MidID(3,4); // subvolume 3 + vMidID[7] = MidID(2,3); // face 3 + break; + + + // scv of corner 5 in subvolume 1 (top) + case 14:vMidID[0] = MidID(0,5); // corner 5 + vMidID[1] = MidID(1,10);// edge 10 + vMidID[2] = MidID(2,12);// subface 1,3,5 + vMidID[3] = MidID(1,8); // edge 8 + vMidID[4] = MidID(1,11);// edge 11 + vMidID[5] = MidID(2,6); // face 6 + vMidID[6] = MidID(3,2); // subvolume 1 + vMidID[7] = MidID(2,7); // face 7 + break; + // scv of corner 0 in subvolume 3 (bottom) + case 15:vMidID[0] = MidID(0,0); // corner 0 + vMidID[1] = MidID(1,0); // edge 0 + vMidID[2] = MidID(2,15);// subface 1,3,0 + vMidID[3] = MidID(1,2); // edge 2 + vMidID[4] = MidID(1,3); // edge 3 + vMidID[5] = MidID(2,3); // face 3 + vMidID[6] = MidID(3,4); // subvolume 3 + vMidID[7] = MidID(2,2); // face 2 + break; + default:UG_THROW("Octahedron only has 16 SCVs (no. 0-15), but requested no. " << i << "."); + break; + } + } +} + +/** + * \param[in] i indicates that bf corresponds to i'th corner of ref elem + */ +template +static void ComputeBFMidID(const TRefElem& rRefElem, int side, + MidID vMidID[], int co) +{ + static const int dim = TRefElem::dim; + + // number of corners of side + const int coOfSide = rRefElem.num(dim-1, side, 0); + + // set mid ids + if (dim == 1) + { + vMidID[0] = MidID(0, rRefElem.id(0, side, 0, co)); + } + else if(dim == 2) + { + vMidID[co%2] = MidID(0, rRefElem.id(1, side, 0, co)); // corner of side + vMidID[(co+1)%2] = MidID(1, side); // side midpoint + } + else if (dim == 3) + { + vMidID[0] = MidID(0, rRefElem.id(2, side, 0, co)); // corner of side + vMidID[1] = MidID(1, rRefElem.id(2, side, 1, co)); // edge co + vMidID[2] = MidID(2, side); // side midpoint + vMidID[3] = MidID(1, rRefElem.id(2, side, 1, (co -1 + coOfSide)%coOfSide)); // edge co-1 + } +} + +template +static void CopyCornerByMidID(MathVector vCorner[], + const MidID vMidID[], + MathVector vvMidPos[][maxMid], + const size_t numCo) +{ + for(size_t i = 0; i < numCo; ++i) + { + const size_t d = vMidID[i].dim; + const size_t id = vMidID[i].id; + vCorner[i] = vvMidPos[d][id]; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// FV1FT Geometry for Reference Element Type +//////////////////////////////////////////////////////////////////////////////// + +template +FV1CutGeometry:: +FV1CutGeometry() + : m_pElem(NULL), m_rRefElem(Provider::get()), + m_rTrialSpace(Provider::get()) +{ + update_local_data(); +} + +template +void FV1CutGeometry:: +update_local_data() +{ + +// set corners of element as local centers of nodes + for(size_t i = 0; i < m_rRefElem.num(0); ++i) + m_vvLocMid[0][i] = m_rRefElem.corner(i); + +// compute local midpoints + ComputeMidPoints(m_rRefElem, m_vvLocMid[0], m_vvLocMid); + +// set up local information for SubControlVolumeFaces (scvf) + for(size_t i = 0; i < num_scvf(); ++i) + { + + // this scvf separates the given nodes + if (m_rRefElem.REFERENCE_OBJECT_ID != ROID_PYRAMID && m_rRefElem.REFERENCE_OBJECT_ID != ROID_OCTAHEDRON) + { + m_vSCVF[i].From = m_rRefElem.id(1, i, 0, 0); + m_vSCVF[i].To = m_rRefElem.id(1, i, 0, 1); + } + // special case pyramid + else if(m_rRefElem.REFERENCE_OBJECT_ID == ROID_PYRAMID) + { + // map according to order defined in ComputeSCVFMidID + m_vSCVF[i].From = m_rRefElem.id(1, i/2, 0, 0); + m_vSCVF[i].To = m_rRefElem.id(1, i/2, 0, 1); + } + // special case octahedron (scvf not mappable by edges) + else if(m_rRefElem.REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + { + // map according to order defined in ComputeSCVFMidID + switch(i) + { + case 0: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 2; + break; + case 1: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 1; + break; + + + case 2: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 3; + break; + case 3: m_vSCVF[i].From = 3; + m_vSCVF[i].To = 2; + break; + + + case 4: m_vSCVF[i].From = 3; + m_vSCVF[i].To = 1; + break; + case 5: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 3; + break; + + + case 6: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 5; + break; + case 7: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 0; + break; + + + case 8: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 5; + break; + case 9: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 0; + break; + + + case 10:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 5; + break; + case 11:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 0; + break; + + + case 12:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 3; + break; + case 13:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 1; + break; + + + case 14:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 4; + break; + case 15:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 3; + break; + + + case 16:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 1; + break; + case 17:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 4; + break; + + + case 18:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 5; + break; + case 19:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 0; + break; + + + case 20:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 5; + break; + case 21:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 0; + break; + + + case 22:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 5; + break; + case 23:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 0; + break; + } + } + + // compute mid ids of the scvf + ComputeSCVFMidID(m_rRefElem, m_vSCVF[i].vMidID, i); + + // copy local corners of scvf + CopyCornerByMidID(m_vSCVF[i].vLocPos, m_vSCVF[i].vMidID, m_vvLocMid, SCVF::numCo); + + // integration point + AveragePositions(m_vSCVF[i].localIP, m_vSCVF[i].vLocPos, SCVF::numCo); + } + +// set up local informations for SubControlVolumes (scv) +// each scv is associated to one corner of the element + for(size_t i = 0; i < num_scv(); ++i) + { + // store associated node + if (m_rRefElem.REFERENCE_OBJECT_ID != ROID_PYRAMID && m_rRefElem.REFERENCE_OBJECT_ID != ROID_OCTAHEDRON) + { + m_vSCV[i].nodeId = i; + } + // special case pyramid + else if(m_rRefElem.REFERENCE_OBJECT_ID == ROID_PYRAMID) + { + // map according to order defined in ComputeSCVMidID + if(i%2 == 0){ + m_vSCV[i].nodeId = m_rRefElem.id(1, i/4, 0, 0); // from + } else { + m_vSCV[i].nodeId = m_rRefElem.id(1, i/4, 0, 1); // to + } + } + // special case octahedron (scvf not mappable by edges) + else if(m_rRefElem.REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + { + // map according to order defined in ComputeSCVMidID + switch(i) + { + case 0: m_vSCV[i].nodeId = 1; + break; + case 1: m_vSCV[i].nodeId = 1; + break; + + + case 2: m_vSCV[i].nodeId = 2; + break; + case 3: m_vSCV[i].nodeId = 2; + break; + + + case 4: m_vSCV[i].nodeId = 3; + break; + case 5: m_vSCV[i].nodeId = 3; + break; + + + case 6: m_vSCV[i].nodeId = 5; + break; + case 7: m_vSCV[i].nodeId = 0; + break; + + + case 8: m_vSCV[i].nodeId = 1; + break; + case 9: m_vSCV[i].nodeId = 1; + break; + + + case 10:m_vSCV[i].nodeId = 3; + break; + case 11:m_vSCV[i].nodeId = 3; + break; + + + case 12:m_vSCV[i].nodeId = 4; + break; + case 13:m_vSCV[i].nodeId = 4; + break; + + + case 14:m_vSCV[i].nodeId = 5; + break; + case 15:m_vSCV[i].nodeId = 0; + break; + } + } + + // compute mid ids scv + ComputeSCVMidID(m_rRefElem, m_vSCV[i].midId, i); + + // copy local corners of scv + CopyCornerByMidID(m_vSCV[i].vLocPos, m_vSCV[i].midId, m_vvLocMid, m_vSCV[i].num_corners()); + } + +// compute Shapes and Derivatives + for(size_t i = 0; i < num_scvf(); ++i) + { + m_rTrialSpace.shapes(&(m_vSCVF[i].vShape[0]), m_vSCVF[i].local_ip()); + m_rTrialSpace.grads(&(m_vSCVF[i].vLocalGrad[0]), m_vSCVF[i].local_ip()); + } + + for(size_t i = 0; i < num_scv(); ++i) + { + m_rTrialSpace.shapes(&(m_vSCV[i].vShape[0]), m_vSCV[i].local_ip()); + m_rTrialSpace.grads(&(m_vSCV[i].vLocalGrad[0]), m_vSCV[i].local_ip()); + } + +// copy ip positions in a list for Sub Control Volumes Faces (SCVF) + for(size_t i = 0; i < num_scvf(); ++i) + m_vLocSCVF_IP[i] = scvf(i).local_ip(); + + if(ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + for(size_t i = 0; i < num_scv(); ++i) + m_vLocSCV_IP[i] = scv(i).local_ip(); +} + +/// update data for given element +template +void FV1CutGeometry:: +update(GridObject* elem, const MathVector* vCornerCoords, const ISubsetHandler* ish) +{ + UG_ASSERT(dynamic_cast(elem) != NULL, "Wrong element type."); + TElem* pElem = static_cast(elem); + +// if already update for this element, do nothing + if(m_pElem == pElem) return; else m_pElem = pElem; + +// remember global position of nodes + for(size_t i = 0; i < m_rRefElem.num(0); ++i) + m_vvGloMid[0][i] = vCornerCoords[i]; + +// compute global midpoints + ComputeMidPoints(m_rRefElem, m_vvGloMid[0], m_vvGloMid); + + +// compute global informations for scvf + for(size_t i = 0; i < num_scvf(); ++i) + { + // copy local corners of scvf + CopyCornerByMidID(m_vSCVF[i].vGloPos, m_vSCVF[i].vMidID, m_vvGloMid, SCVF::numCo); + + // integration point + AveragePositions(m_vSCVF[i].globalIP, m_vSCVF[i].vGloPos, SCVF::numCo); + + // normal on scvf + traits::NormalOnSCVF(m_vSCVF[i].Normal, m_vSCVF[i].vGloPos, m_vvGloMid[0]); + } + +// compute size of scv + for(size_t i = 0; i < num_scv(); ++i) + { + // copy global corners + CopyCornerByMidID(m_vSCV[i].vGloPos, m_vSCV[i].midId, m_vvGloMid, m_vSCV[i].num_corners()); + + // compute volume of scv + m_vSCV[i].Vol = ElementSize(m_vSCV[i].vGloPos); + + /* + * Only for debug purposes testing octahedral FV1 discretization + * + MathVector baryCenter(0.0); + for(size_t j = 0; j < 8; ++j) + { + baryCenter += m_vSCV[i].vLocPos[j]; + } + + baryCenter *= 1.0/8.0; + * + */ + + } + +// Shapes and Derivatives + m_mapping.update(vCornerCoords); + +// if mapping is linear, compute jacobian only once and copy + if(ReferenceMapping::isLinear) + { + MathMatrix JtInv; + m_mapping.jacobian_transposed_inverse(JtInv, m_vSCVF[0].local_ip()); + const number detJ = m_mapping.sqrt_gram_det(m_vSCVF[0].local_ip()); + + for(size_t i = 0; i < num_scvf(); ++i) + { + m_vSCVF[i].JtInv = JtInv; + m_vSCVF[i].detj = detJ; + } + + for(size_t i = 0; i < num_scv(); ++i) + { + m_vSCV[i].JtInv = JtInv; + m_vSCV[i].detj = detJ; + } + } +// else compute jacobian for each integration point + else + { + for(size_t i = 0; i < num_scvf(); ++i) + { + m_mapping.jacobian_transposed_inverse(m_vSCVF[i].JtInv, m_vSCVF[i].local_ip()); + m_vSCVF[i].detj = m_mapping.sqrt_gram_det(m_vSCVF[i].local_ip()); + } + for(size_t i = 0; i < num_scv(); ++i) + { + m_mapping.jacobian_transposed_inverse(m_vSCV[i].JtInv, m_vSCV[i].local_ip()); + m_vSCV[i].detj = m_mapping.sqrt_gram_det(m_vSCV[i].local_ip()); + } + } + +// compute global gradients + for(size_t i = 0; i < num_scvf(); ++i) + for(size_t sh = 0 ; sh < scvf(i).num_sh(); ++sh) + MatVecMult(m_vSCVF[i].vGlobalGrad[sh], m_vSCVF[i].JtInv, m_vSCVF[i].vLocalGrad[sh]); + + for(size_t i = 0; i < num_scv(); ++i) + for(size_t sh = 0 ; sh < scv(i).num_sh(); ++sh) + MatVecMult(m_vSCV[i].vGlobalGrad[sh], m_vSCV[i].JtInv, m_vSCV[i].vLocalGrad[sh]); + +// Copy ip pos in list for SCVF + for(size_t i = 0; i < num_scvf(); ++i) + m_vGlobSCVF_IP[i] = scvf(i).global_ip(); + + if(ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + for(size_t i = 0; i < num_scv(); ++i) + m_vGlobSCV_IP[i] = scv(i).global_ip(); + +// if no boundary subsets required, return + if(num_boundary_subsets() == 0 || ish == NULL) return; + else update_boundary_faces(pElem, vCornerCoords, ish); +} + +template +void FV1CutGeometry:: +update_boundary_faces(GridObject* elem, const MathVector* vCornerCoords, const ISubsetHandler* ish) +{ + UG_ASSERT(dynamic_cast(elem) != NULL, "Wrong element type."); + TElem* pElem = static_cast(elem); + +// get grid + Grid& grid = *(ish->grid()); + +// vector of subset indices of side + std::vector vSubsetIndex; + +// get subset indices for sides (i.e. edge in 2d, faces in 3d) + if(dim == 1) { + std::vector vVertex; + CollectVertices(vVertex, grid, pElem); + vSubsetIndex.resize(vVertex.size()); + for(size_t i = 0; i < vVertex.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vVertex[i]); + } + if(dim == 2) { + std::vector vEdges; + CollectEdgesSorted(vEdges, grid, pElem); + vSubsetIndex.resize(vEdges.size()); + for(size_t i = 0; i < vEdges.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vEdges[i]); + } + if(dim == 3) { + std::vector vFaces; + CollectFacesSorted(vFaces, grid, pElem); + vSubsetIndex.resize(vFaces.size()); + for(size_t i = 0; i < vFaces.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vFaces[i]); + } + +// loop requested subset + typename std::map >::iterator it; + for (it=m_mapVectorBF.begin() ; it != m_mapVectorBF.end(); ++it) + { + // get subset index + const int bndIndex = (*it).first; + + // get vector of BF for element + std::vector& vBF = (*it).second; + + // clear vector + vBF.clear(); + + // current number of bf + size_t curr_bf = 0; + + // loop sides of element + for(size_t side = 0; side < vSubsetIndex.size(); ++side) + { + // skip non boundary sides + if(vSubsetIndex[side] != bndIndex) continue; + + // number of corners of side + const int coOfSide = m_rRefElem.num(dim-1, side, 0); + + // resize vector + vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + BF& bf = vBF[curr_bf]; + + // set node id == scv this bf belongs to + bf.nodeId = m_rRefElem.id(dim-1, side, 0, co); + + // Compute MidID for BF + ComputeBFMidID(m_rRefElem, side, bf.vMidID, co); + + // copy corners of bf + CopyCornerByMidID(bf.vLocPos, bf.vMidID, m_vvLocMid, BF::numCo); + CopyCornerByMidID(bf.vGloPos, bf.vMidID, m_vvGloMid, BF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, BF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, BF::numCo); + + // normal on scvf + traits::NormalOnBF(bf.Normal, bf.vGloPos, m_vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + m_rTrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + m_rTrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + m_mapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = m_mapping.sqrt_gram_det(bf.localIP); + + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Dim-dependent Finite Volume Geometry +//////////////////////////////////////////////////////////////////////////////// +template +void DimFV1CutGeometry:: +update_local(ReferenceObjectID roid) +{ + m_roid = roid; + +// get reference element + try + { + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + + // set corners of element as local centers of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + m_vvLocMid[0][i] = rRefElem.corner(i); + + // compute local midpoints + ComputeMidPoints, maxMid> + (rRefElem, m_vvLocMid[0], m_vvLocMid); + + // set number of scvf / scv of this roid + if(m_roid != ROID_PYRAMID && m_roid != ROID_OCTAHEDRON) + { + m_numSCV = rRefElem.num(0); + m_numSCVF = rRefElem.num(1); + } + else if(dim == 3 && m_roid == ROID_PYRAMID) + { + UG_WARNING("Pyramid Finite Volume Geometry for 1st order currently " + "implemented in DimFV1Geom EXPERIMENTATLLY. Please contact " + "Martin Stepniewski or Andreas Vogel if you see this message.") + + m_numSCV = 4*rRefElem.num(1); + m_numSCVF = 2*rRefElem.num(1); + } + else if(dim == 3 && m_roid == ROID_OCTAHEDRON) + { + // Case octahedron + m_numSCV = 16; + m_numSCVF = 24; + } + + // set up local informations for SubControlVolumeFaces (scvf) + // each scvf is associated to one edge of the element + for(size_t i = 0; i < num_scvf(); ++i) + { + // this scvf separates the given nodes + if (m_roid != ROID_PYRAMID && m_roid != ROID_OCTAHEDRON) + { + m_vSCVF[i].From = rRefElem.id(1, i, 0, 0); + m_vSCVF[i].To = rRefElem.id(1, i, 0, 1); + } + // special case pyramid (scvf not mappable by edges) + else if (dim == 3 && m_roid == ROID_PYRAMID) + { + // map according to order defined in ComputeSCVFMidID + m_vSCVF[i].From = rRefElem.id(1, i/2, 0, 0); + m_vSCVF[i].To = rRefElem.id(1, i/2, 0, 1); + } + // special case octahedron (scvf not mappable by edges) + else if(dim == 3 && m_roid == ROID_OCTAHEDRON) + { + // map according to order defined in ComputeSCVFMidID + switch(i) + { + case 0: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 2; + break; + case 1: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 1; + break; + + + case 2: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 3; + break; + case 3: m_vSCVF[i].From = 3; + m_vSCVF[i].To = 2; + break; + + + case 4: m_vSCVF[i].From = 3; + m_vSCVF[i].To = 1; + break; + case 5: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 3; + break; + + + case 6: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 5; + break; + case 7: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 0; + break; + + + case 8: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 5; + break; + case 9: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 0; + break; + + + case 10:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 5; + break; + case 11:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 0; + break; + + + case 12:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 3; + break; + case 13:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 1; + break; + + + case 14:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 4; + break; + case 15:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 3; + break; + + + case 16:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 1; + break; + case 17:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 4; + break; + + + case 18:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 5; + break; + case 19:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 0; + break; + + + case 20:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 5; + break; + case 21:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 0; + break; + + + case 22:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 5; + break; + case 23:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 0; + break; + } + } + + + // compute mid ids of the scvf + ComputeSCVFMidID(rRefElem, m_vSCVF[i].vMidID, i); + + // copy local corners of scvf + CopyCornerByMidID(m_vSCVF[i].vLocPos, m_vSCVF[i].vMidID, m_vvLocMid, SCVF::numCo); + + // integration point + AveragePositions(m_vSCVF[i].localIP, m_vSCVF[i].vLocPos, SCVF::numCo); + } + + // set up local informations for SubControlVolumes (scv) + // each scv is associated to one corner of the element + for(size_t i = 0; i < num_scv(); ++i) + { + // store associated node + if (m_roid != ROID_PYRAMID && m_roid != ROID_OCTAHEDRON) + { + m_vSCV[i].nodeId = i; + } + // special case pyramid (scv not mappable by corners) + else if(dim == 3 && m_roid == ROID_PYRAMID) + { + // map according to order defined in ComputeSCVMidID + if(i%2 == 0){ + m_vSCV[i].nodeId = rRefElem.id(1, i/4, 0, 0); // from + } else { + m_vSCV[i].nodeId = rRefElem.id(1, i/4, 0, 1); // to + } + } + // special case octahedron (scvf not mappable by edges) + else if(dim == 3 && m_roid == ROID_OCTAHEDRON) + { + // map according to order defined in ComputeSCVMidID + switch(i) + { + case 0: m_vSCV[i].nodeId = 1; + break; + case 1: m_vSCV[i].nodeId = 1; + break; + + + case 2: m_vSCV[i].nodeId = 2; + break; + case 3: m_vSCV[i].nodeId = 2; + break; + + + case 4: m_vSCV[i].nodeId = 3; + break; + case 5: m_vSCV[i].nodeId = 3; + break; + + + case 6: m_vSCV[i].nodeId = 5; + break; + case 7: m_vSCV[i].nodeId = 0; + break; + + + case 8: m_vSCV[i].nodeId = 1; + break; + case 9: m_vSCV[i].nodeId = 1; + break; + + + case 10:m_vSCV[i].nodeId = 3; + break; + case 11:m_vSCV[i].nodeId = 3; + break; + + + case 12:m_vSCV[i].nodeId = 4; + break; + case 13:m_vSCV[i].nodeId = 4; + break; + + + case 14:m_vSCV[i].nodeId = 5; + break; + case 15:m_vSCV[i].nodeId = 0; + break; + } + } + + // compute mid ids scv + ComputeSCVMidID(rRefElem, m_vSCV[i].vMidID, i); + + // copy local corners of scv + CopyCornerByMidID(m_vSCV[i].vLocPos, m_vSCV[i].vMidID, m_vvLocMid, m_vSCV[i].num_corners()); + } + + ///////////////////////// + // Shapes and Derivatives + ///////////////////////// + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + + m_nsh = TrialSpace.num_sh(); + + for(size_t i = 0; i < num_scvf(); ++i) + { + m_vSCVF[i].numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(m_vSCVF[i].vShape[0]), m_vSCVF[i].localIP); + TrialSpace.grads(&(m_vSCVF[i].vLocalGrad[0]), m_vSCVF[i].localIP); + } + + for(size_t i = 0; i < num_scv(); ++i) + { + m_vSCV[i].numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(m_vSCV[i].vShape[0]), m_vSCV[i].vLocPos[0]); + TrialSpace.grads(&(m_vSCV[i].vLocalGrad[0]), m_vSCV[i].vLocPos[0]); + } + + } + UG_CATCH_THROW("DimFV1CutGeometry: update failed."); + +// copy ip positions in a list for Sub Control Volumes Faces (SCVF) + for(size_t i = 0; i < num_scvf(); ++i) + m_vLocSCVF_IP[i] = scvf(i).local_ip(); + + if(roid == ROID_PYRAMID || roid == ROID_OCTAHEDRON) + for(size_t i = 0; i < num_scv(); ++i) + m_vLocSCV_IP[i] = scv(i).local_ip(); +} + + +/// update data for given element +template +void DimFV1CutGeometry:: +update(GridObject* pElem, const MathVector* vCornerCoords, const ISubsetHandler* ish) +{ + + set_element_modus(false); + m_vBF.clear(); + + // If already update for this element, do nothing + //if(m_pElem == pElem) return; else m_pElem = pElem; + + // FT-1: collect potentially new 'vCornerCoords' and + // set elemMode (INSIDE_DOM/OUTSIDE_DOM/CUT_BY_INTERFACE) + bool do_update_local = m_spInterfaceHandler->update_elem(pElem, vCornerCoords); + // bool do_update_local = m_spInterfaceHandler->update(pElem, vCornerCoords); + + // FT-2: If OUTSIDE_DOM: set num_co = num_ip = 0 and do nothing further + if( m_spInterfaceHandler->elementModus() == OUTSIDE_DOM) + { + if ( dim == 2 ) m_roid = ROID_TRIANGLE; + if ( dim == 3 ) m_roid = ROID_TETRAHEDRON; + + update_local(m_roid); + } + + // FT-3: refresh local data, if different roid given and reset 'm_roid' + // OR if do_update_local = true: for QUADRILATERAL twice, this is necessary. + // because data like 'm_nsh' need to be set to 4, which was set to 3 during 'remap'!! + if (do_update_local || m_roid != m_spInterfaceHandler->roid() ) + { + if( m_spInterfaceHandler->elementModus() != OUTSIDE_DOM ) + { + m_roid = m_spInterfaceHandler->roid(); + update_local(m_roid); + } + } + + if(m_spInterfaceHandler->elementModus() == CUT_BY_INTERFACE) + set_element_modus(true); + + +/* +// If already update for this element, do nothing + if(m_pElem == pElem) return; else m_pElem = pElem; + +// refresh local data, if different roid given + if(m_roid != pElem->reference_object_id()) // remember new roid and update local data + update_local ((ReferenceObjectID) pElem->reference_object_id()); +*/ +// get reference element + try{ + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + +// remember global position of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + m_vvGloMid[0][i] = m_spInterfaceHandler->corner(i); +// m_vvGloMid[0][i] = vCornerCoords[i]; + + +// compute local midpoints + ComputeMidPoints, maxMid>(rRefElem, m_vvGloMid[0], m_vvGloMid); + +// compute global informations for scvf + for(size_t i = 0; i < num_scvf(); ++i) + { + // copy local corners of scvf + CopyCornerByMidID(m_vSCVF[i].vGloPos, m_vSCVF[i].vMidID, m_vvGloMid, SCVF::numCo); + + // integration point + AveragePositions(m_vSCVF[i].globalIP, m_vSCVF[i].vGloPos, SCVF::numCo); + + // normal on scvf + traits::NormalOnSCVF(m_vSCVF[i].Normal, m_vSCVF[i].vGloPos, m_vvGloMid[0]); + } + +// compute size of scv + for(size_t i = 0; i < num_scv(); ++i) + { + // copy global corners + CopyCornerByMidID(m_vSCV[i].vGloPos, m_vSCV[i].vMidID, m_vvGloMid, m_vSCV[i].num_corners()); + + // compute volume of scv + m_vSCV[i].Vol = ElementSize(m_vSCV[i].vGloPos); + } + +// get reference mapping + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(m_roid); + rMapping.update(m_spInterfaceHandler->corners()); + //rMapping.update(vCornerCoords); + + + //\todo compute with on virt. call +// compute jacobian for linear mapping + if(rMapping.is_linear()) + { + MathMatrix JtInv; + rMapping.jacobian_transposed_inverse(JtInv, m_vSCVF[0].local_ip()); + const number detJ = rMapping.sqrt_gram_det(m_vSCVF[0].local_ip()); + + for(size_t i = 0; i < num_scvf(); ++i) + { + m_vSCVF[i].JtInv = JtInv; + m_vSCVF[i].detj = detJ; + } + + for(size_t i = 0; i < num_scv(); ++i) + { + m_vSCV[i].JtInv = JtInv; + m_vSCV[i].detj = detJ; + } + } +// else compute jacobian for each integration point + else + { + for(size_t i = 0; i < num_scvf(); ++i) + { + rMapping.jacobian_transposed_inverse(m_vSCVF[i].JtInv, m_vSCVF[i].local_ip()); + m_vSCVF[i].detj = rMapping.sqrt_gram_det(m_vSCVF[i].local_ip()); + } + for(size_t i = 0; i < num_scv(); ++i) + { + rMapping.jacobian_transposed_inverse(m_vSCV[i].JtInv, m_vSCV[i].local_ip()); + m_vSCV[i].detj = rMapping.sqrt_gram_det(m_vSCV[i].local_ip()); + } + } + +// compute global gradients + for(size_t i = 0; i < num_scvf(); ++i) + for(size_t sh = 0; sh < scvf(i).num_sh(); ++sh) + MatVecMult(m_vSCVF[i].vGlobalGrad[sh], m_vSCVF[i].JtInv, m_vSCVF[i].vLocalGrad[sh]); + + for(size_t i = 0; i < num_scv(); ++i) + for(size_t sh = 0; sh < scv(i).num_sh(); ++sh) + MatVecMult(m_vSCV[i].vGlobalGrad[sh], m_vSCV[i].JtInv, m_vSCV[i].vLocalGrad[sh]); + +// copy ip points in list (SCVF) + for(size_t i = 0; i < num_scvf(); ++i) + m_vGlobSCVF_IP[i] = scvf(i).global_ip(); + + if(m_roid == ROID_PYRAMID || m_roid == ROID_OCTAHEDRON) + for(size_t i = 0; i < num_scv(); ++i) + m_vGlobSCV_IP[i] = scv(i).global_ip(); + + } + UG_CATCH_THROW("DimFV1CutGeometry: update failed."); + +// compute boundary faces of inner boundary + if(m_spInterfaceHandler->elementModus() == CUT_BY_INTERFACE) + { + update_inner_boundary_faces(); + m_spInterfaceHandler->update_inner_boundary(m_spInterfaceHandler->corners()); + } + + +// if no boundary subsets required, return + if(num_boundary_subsets() == 0 || ish == NULL) return; + else update_boundary_faces(pElem, vCornerCoords, ish); +} + + + +// compare implementation of 'DimFV1Geometry::update_boundary_faces()' +template +void DimFV1CutGeometry:: +update_inner_boundary_faces() +{ + ///////////////////////////////////////////////////////////////////////////// + // get general data + ///////////////////////////////////////////////////////////////////////////// + try{ + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(m_roid); + rMapping.update(m_spInterfaceHandler->corners()); + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + + ///////////////////////////////////////////////////////////////////////////// + // collect boudary faces + ///////////////////////////////////////////////////////////////////////////// + + // get number of sides of element + size_t numSides = 0; + numSides = rRefElem.num(dim-1); + + // current number of bf + size_t curr_bf = 0; + + // std::vector& vBF = m_spInterfaceHandler->m_vBF; +// std::vector& vBF = m_spInterfaceHandler->get_boundary_faces(); + std::vector& vBF = get_boundary_faces(); + + vBF.clear(); + + // loop sides of element + for(size_t side = 0; side < numSides; ++side) + { + // side is no boundary face => continue + if ( !m_spInterfaceHandler->is_boundary_face(side) ) + continue; + + // number of corners of side (special case bottom side pyramid) + const int coOfSide = (m_roid != ROID_PYRAMID || side != 0) + ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; + + // resize vector + vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + BF& bf = vBF[curr_bf]; + + // set node id == scv this bf belongs to + if (m_roid != ROID_PYRAMID || side != 0){ + bf.nodeId = rRefElem.id(dim-1, side, 0, co); + } + else + { + // map according to order defined in ComputeBFMidID + bf.nodeId = rRefElem.id(dim-1, side, 0, (co % 3) + (co>3 ? 1 : 0)); + } + + // Compute MidID for BF + ComputeBFMidID(rRefElem, side, bf.vMidID, co); + + // copy corners of bf + CopyCornerByMidID(bf.vLocPos, bf.vMidID, m_vvLocMid, BF::numCo); + CopyCornerByMidID(bf.vGloPos, bf.vMidID, m_vvGloMid, BF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, BF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, BF::numCo); + + // normal on scvf + traits::NormalOnBF(bf.Normal, bf.vGloPos, m_vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + // compute shapes and grads + bf.numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + // get reference mapping + rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = rMapping.sqrt_gram_det(bf.localIP); + + // compute global gradients + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + + } // end loop of corners of side + + } // end loop sides of element + + } + UG_CATCH_THROW("DimFV1CutGeometry: update_inner_boundary() failed."); + + +} + + + +template +void DimFV1CutGeometry:: +update_boundary_faces(GridObject* pElem, const MathVector* vCornerCoords, const ISubsetHandler* ish) +{ +// get grid + Grid& grid = *(ish->grid()); + +// vector of subset indices of side + std::vector vSubsetIndex; + +// get subset indices for sides (i.e. edge in 2d, faces in 3d) + if(dim == 1) { + std::vector vVertex; + CollectVertices(vVertex, grid, pElem); + vSubsetIndex.resize(vVertex.size()); + for(size_t i = 0; i < vVertex.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vVertex[i]); + } + if(dim == 2) { + std::vector vEdges; + CollectEdgesSorted(vEdges, grid, pElem); + vSubsetIndex.resize(vEdges.size()); + for(size_t i = 0; i < vEdges.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vEdges[i]); + } + if(dim == 3) { + std::vector vFaces; + CollectFacesSorted(vFaces, grid, pElem); + vSubsetIndex.resize(vFaces.size()); + for(size_t i = 0; i < vFaces.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vFaces[i]); + } + + try{ + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(m_roid); + rMapping.update(vCornerCoords); + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + +// loop requested subset + typename std::map >::iterator it; + for (it=m_mapVectorBF.begin() ; it != m_mapVectorBF.end(); ++it) + { + // get subset index + const int bndIndex = (*it).first; + + // get vector of BF for element + std::vector& vBF = (*it).second; + + // clear vector + vBF.clear(); + + // current number of bf + size_t curr_bf = 0; + + // loop sides of element + for(size_t side = 0; side < vSubsetIndex.size(); ++side) + { + // skip non boundary sides + if(vSubsetIndex[side] != bndIndex) continue; + + // number of corners of side + const int coOfSide = rRefElem.num(dim-1, side, 0); + + // resize vector + vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + BF& bf = vBF[curr_bf]; + + // set node id == scv this bf belongs to + bf.nodeId = rRefElem.id(dim-1, side, 0, co); + + // Compute MidID for BF + ComputeBFMidID(rRefElem, side, bf.vMidID, co); + + // copy corners of bf + CopyCornerByMidID(bf.vLocPos, bf.vMidID, m_vvLocMid, BF::numCo); + CopyCornerByMidID(bf.vGloPos, bf.vMidID, m_vvGloMid, BF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, BF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, BF::numCo); + + // normal on scvf + traits::NormalOnBF(bf.Normal, bf.vGloPos, m_vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + // compute shapes and grads + bf.numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + // get reference mapping + rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = rMapping.sqrt_gram_det(bf.localIP); + + // compute global gradients + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + } + } + } + + } + UG_CATCH_THROW("DimFV1CutGeometry: update failed."); +} + +////////////////////// +// FV1CutGeometry + +template class FV1CutGeometry; +template class FV1CutGeometry; +template class FV1CutGeometry; + +template class FV1CutGeometry; +template class FV1CutGeometry; + +template class FV1CutGeometry; +template class FV1CutGeometry; + +template class FV1CutGeometry; +template class FV1CutGeometry; +template class FV1CutGeometry; +template class FV1CutGeometry; +template class FV1CutGeometry; + +////////////////////// +// DimFV1CutGeometry +template class DimFV1CutGeometry<1, 1, InterfaceHandlerLocalDiffusion<1> >; + +template class DimFV1CutGeometry<2, 2, InterfaceHandlerLocalDiffusion<2> >; + +template class DimFV1CutGeometry<3, 3, InterfaceHandlerLocalDiffusion<3> >; + + +} // end namespace ug + +#endif /* __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1Cut_GEOMETRY_IMPL_ */ From 4a59107af7ded2919de87e1c50b7821846285594 Mon Sep 17 00:00:00 2001 From: Susanne Date: Wed, 7 Aug 2019 12:25:24 +0300 Subject: [PATCH 2/4] actual status of ugcore with new class spatial_disc/immersed_util --- .../bridge/disc_bridges/multigrid_bridge.cpp | 6 +- ugbase/lib_disc/CMakeLists.txt | 2 + ugbase/lib_disc/common/geometry_util.h | 44 +- ugbase/lib_disc/lib_disc.h | 2 + .../nl_gauss_seidel/nl_gauss_seidel.h | 20 +- ugbase/lib_disc/spatial_disc/ass_tuner.h | 54 +- .../spatial_disc/disc_util/fv1Cut_geom.h | 1385 ++++++++++++ .../spatial_disc/disc_util/fv1FT_geom.cpp | 2006 +++++++++++++++++ .../spatial_disc/disc_util/fv1FT_geom.h | 1228 ++++++++++ .../lib_disc/spatial_disc/domain_disc_impl.h | 16 + .../elem_disc/elem_disc_assemble_util.h | 38 +- .../cut_element_handler/cut_element_handler.h | 693 ++++++ .../cut_element_handler_FT_impl.h | 973 ++++++++ .../cut_element_handler_immersed_impl.h | 288 +++ .../gmg_transfer/particle_transfer.h | 302 +++ .../gmg_transfer/particle_transfer_impl.h | 1483 ++++++++++++ .../immersed_util/immersed_interface_base.h | 209 ++ .../immersed_interface_base_impl.h | 174 ++ .../interface_handler_base.h | 274 +++ .../interface_handler_base_impl.h | 218 ++ .../interface_handler_base_tools.h | 1914 ++++++++++++++++ .../interface_handler_particle.h | 346 +++ .../interface_handler_particle_impl.h | 254 +++ .../interface_handler_particle_tools.h | 1408 ++++++++++++ .../interface_handler_diffusion.h | 397 ++++ .../interface_handler_diffusion_impl.h | 821 +++++++ .../interface_handler_diffusion_tools.h | 794 +++++++ .../interface_handler_diffusion_user_data.h | 231 ++ .../interface_provider_base.h | 66 + .../interface_provider_diffusion.h | 124 + .../interface_provider_particle.h | 1130 ++++++++++ ...interface_provider_particle_ellipse_impl.h | 128 ++ .../interface_provider_particle_sphere_impl.h | 127 ++ .../local_to_global/local_to_global_mapper.h | 24 +- 34 files changed, 17159 insertions(+), 20 deletions(-) create mode 100644 ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.h create mode 100644 ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.cpp create mode 100644 ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_tools.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_tools.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_tools.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_user_data.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_base.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_diffusion.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_ellipse_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_sphere_impl.h diff --git a/ugbase/bridge/disc_bridges/multigrid_bridge.cpp b/ugbase/bridge/disc_bridges/multigrid_bridge.cpp index fc1abf31f..ec4afad14 100644 --- a/ugbase/bridge/disc_bridges/multigrid_bridge.cpp +++ b/ugbase/bridge/disc_bridges/multigrid_bridge.cpp @@ -50,7 +50,7 @@ #include "lib_disc/operator/linear_operator/multi_grid_solver/mg_solver.h" #include "lib_disc/operator/linear_operator/element_gauss_seidel/element_gauss_seidel.h" #include "lib_disc/operator/linear_operator/element_gauss_seidel/component_gauss_seidel.h" -#include "lib_disc/operator/linear_operator/uzawa/uzawa.h" +//#include "lib_disc/operator/linear_operator/uzawa/uzawa.h" using namespace std; @@ -245,7 +245,7 @@ static void DomainAlgebra(Registry& reg, string grp) .set_construct_as_smart_pointer(true); reg.add_class_to_group(name, "ComponentGaussSeidel", tag); } - +/* // Uzawa (smoother/iteration) { typedef UzawaBase T; @@ -265,7 +265,7 @@ static void DomainAlgebra(Registry& reg, string grp) reg.add_class_to_group(name, "UzawaBase", tag); //std::cout <<"Registered "<< name << std::endl; } - +*/ } diff --git a/ugbase/lib_disc/CMakeLists.txt b/ugbase/lib_disc/CMakeLists.txt index 4e2a03ad2..60164d83f 100644 --- a/ugbase/lib_disc/CMakeLists.txt +++ b/ugbase/lib_disc/CMakeLists.txt @@ -93,6 +93,8 @@ set(srcDiscretization domain.cpp spatial_disc/disc_util/fe_geom.cpp spatial_disc/disc_util/fvho_geom.cpp spatial_disc/disc_util/fv1_geom.cpp + spatial_disc/disc_util/fv1FT_geom.cpp + spatial_disc/disc_util/fv1Cut_geom.cpp spatial_disc/disc_util/fvcr_geom.cpp spatial_disc/disc_util/hfv1_geom.cpp spatial_disc/disc_util/hfvcr_geom.cpp diff --git a/ugbase/lib_disc/common/geometry_util.h b/ugbase/lib_disc/common/geometry_util.h index 4ed67ed3c..929e8398b 100644 --- a/ugbase/lib_disc/common/geometry_util.h +++ b/ugbase/lib_disc/common/geometry_util.h @@ -802,7 +802,7 @@ struct ElementSideRayIntersectionWrapper // find side for(sideOut = 0; sideOut < rRefElem.num(dim-1); ++sideOut) { - // get corners + // A1. get corners p0 = rRefElem.id(dim-1, sideOut, 0, 0); p1 = rRefElem.id(dim-1, sideOut, 0, 1); p2 = rRefElem.id(dim-1, sideOut, 0, 2); @@ -819,7 +819,11 @@ struct ElementSideRayIntersectionWrapper // second triangle (only if 4 corners) if(rRefElem.num(dim-1, sideOut, 0) == 3) continue; - // get corner number 4 + // B1. get corner number 4 as p2 and replace p1 by p2 + // (In case of a quadrilateral whose corners are numbered counterclockwise by (1,2,3,4), + // we decompose it into the triangle with corners (1,2,3) and the triangle (1,3,4).) + + p1 = rRefElem.id(dim-1, sideOut, 0, 2); // added in order to create disjunct triangles filling the quadrilateral completely p2 = rRefElem.id(dim-1, sideOut, 0, 3); // if match: break @@ -830,6 +834,42 @@ struct ElementSideRayIntersectionWrapper if(bPositiv && t >= 0.0) break; else if(!bPositiv && t <= 0.0) break; } + + // repeat the procedures A. and B. but by cutting the quadrilateral + // along the other diagonal into 2 triangles + // (necessary for cases, where the 4 corners do not form a flat + // quadrilateral. In such cases it can happen, that the intersection + // point found lies outside the element formed by the two triangles.) + + // A2. get corners + p0 = rRefElem.id(dim-1, sideOut, 0, 1); + p1 = rRefElem.id(dim-1, sideOut, 0, 2); + p2 = rRefElem.id(dim-1, sideOut, 0, 3); + + // if match: break + if(RayTriangleIntersection( GlobalIntersectionPointOut, bc0, bc1, t, + vCornerCoords[p0], vCornerCoords[p1], vCornerCoords[p2], + From, Direction)) + { + if(bPositiv && t >= 0.0) break; + else if(!bPositiv && t <= 0.0) break; + } + + // second triangle (only if 4 corners) + if(rRefElem.num(dim-1, sideOut, 0) == 3) continue; + + // B2. get corner number 1 as p2 and replace p1 by p2 + p1 = rRefElem.id(dim-1, sideOut, 0, 3); // added in order to create dijunct triangles filling the quadrilateral completely + p2 = rRefElem.id(dim-1, sideOut, 0, 0); + + // if match: break + if(RayTriangleIntersection( GlobalIntersectionPointOut, bc0, bc1, t, + vCornerCoords[p0], vCornerCoords[p1], vCornerCoords[p2], + From, Direction)) + { + if(bPositiv && t >= 0.0) break; + else if(!bPositiv && t <= 0.0) break; + } } // if not found diff --git a/ugbase/lib_disc/lib_disc.h b/ugbase/lib_disc/lib_disc.h index 96a43eff6..e25557faf 100644 --- a/ugbase/lib_disc/lib_disc.h +++ b/ugbase/lib_disc/lib_disc.h @@ -108,6 +108,8 @@ #include "spatial_disc/disc_util/fe_geom.h" #include "spatial_disc/disc_util/fv1_geom.h" +#include "spatial_disc/disc_util/fv1FT_geom.h" +#include "spatial_disc/disc_util/fv1Cut_geom.h" #include "spatial_disc/disc_util/fvcr_geom.h" #include "spatial_disc/disc_util/fv_output.h" #include "spatial_disc/disc_util/fv_util.h" diff --git a/ugbase/lib_disc/operator/non_linear_operator/nl_gauss_seidel/nl_gauss_seidel.h b/ugbase/lib_disc/operator/non_linear_operator/nl_gauss_seidel/nl_gauss_seidel.h index 219bce9a5..fdb93e47d 100644 --- a/ugbase/lib_disc/operator/non_linear_operator/nl_gauss_seidel/nl_gauss_seidel.h +++ b/ugbase/lib_disc/operator/non_linear_operator/nl_gauss_seidel/nl_gauss_seidel.h @@ -68,12 +68,26 @@ class LocalToGlobalMapperNLGS : public ILocalToGlobalMapper void add_local_vec_to_global(vector_type& vec, const LocalVector& lvec, ConstSmartPtr dd); - /// adds a local matrix to the global matrix + /// sets certain entries to Dirichlet DoFs (in elem_disc_assembla_util) void add_local_mat_to_global(matrix_type& mat, const LocalMatrix& lmat, ConstSmartPtr dd); - /// modifies local solution vector for adapted defect computation - void modify_LocalSol(LocalVector& vecMod, const LocalVector& lvec, ConstSmartPtr dd){} + void adjust_mat_global(matrix_type& mat, const LocalMatrix& lmat, + ConstSmartPtr dd){}; + + /// modifies local solution vector for adapted defect computation ( in elem_disc_assemble_util) + void modify_LocalData(LocalMatrix& locJ, LocalVector& locU, ConstSmartPtr dd){}; + void modify_LocalData(LocalVectorTimeSeries& uT, LocalMatrix& locJ, LocalVector& locU, ConstSmartPtr dd){}; + + void modify_LocalData(LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, ConstSmartPtr dd){}; + void modify_LocalData(LocalVectorTimeSeries& uT, LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, + ConstSmartPtr dd, size_t t){}; + + /// modifies global solution vector for adapted defect computation (in domain_disc_impl) + void modify_GlobalSol(vector_type& vecMod, const vector_type& vec, ConstSmartPtr dd){}; + + void modify_GlobalSol(SmartPtr > vSolMod, + ConstSmartPtr > vSol, ConstSmartPtr dd) {}; /// sets assembling index void set_assembling_index(const size_t assIndex){ m_assemblingIndex = assIndex;} diff --git a/ugbase/lib_disc/spatial_disc/ass_tuner.h b/ugbase/lib_disc/spatial_disc/ass_tuner.h index e9230c357..e1a406473 100644 --- a/ugbase/lib_disc/spatial_disc/ass_tuner.h +++ b/ugbase/lib_disc/spatial_disc/ass_tuner.h @@ -37,6 +37,8 @@ #include "lib_grid/tools/selector_grid.h" #include "lib_disc/spatial_disc/local_to_global/local_to_global_mapper.h" #include "lib_disc/spatial_disc/elem_disc/elem_disc_interface.h" +#include "lib_disc/time_disc/solution_time_series.h" + namespace ug{ @@ -84,9 +86,23 @@ class LocalToGlobalMapper : public ILocalToGlobalMapper void add_local_mat_to_global(matrix_type& mat, const LocalMatrix& lmat, ConstSmartPtr dd) { AddLocalMatrixToGlobal(mat,lmat);} - /// modifies local solution vector for adapted defect computation - void modify_LocalSol(LocalVector& vecMod, const LocalVector& lvec, ConstSmartPtr dd){}; - + /// sets certain entries to Dirichlet DoFs (in elem_disc_assembla_util) + void adjust_mat_global(matrix_type& mat, const LocalMatrix& lmat, ConstSmartPtr dd){ } + + /// modifies local solution vector for adapted defect computation ( in elem_disc_assemble_util) + virtual void modify_LocalData(LocalMatrix& locJ, LocalVector& locU, ConstSmartPtr dd){}; + virtual void modify_LocalData(LocalVectorTimeSeries& uT, LocalMatrix& locJ, LocalVector& locU, ConstSmartPtr dd){}; + + virtual void modify_LocalData(LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, ConstSmartPtr dd){}; + virtual void modify_LocalData(LocalVectorTimeSeries& uT, LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, + ConstSmartPtr dd, size_t t){}; + + /// modifies global solution vector for adapted defect computation (in domain_disc_impl) + void modify_GlobalSol(vector_type& vecMod, const vector_type& vec, ConstSmartPtr dd){}; + + void modify_GlobalSol(SmartPtr > vSolMod, + ConstSmartPtr > vSol, ConstSmartPtr dd) {}; + /// destructor ~LocalToGlobalMapper() {}; }; @@ -140,9 +156,37 @@ class AssemblingTuner ConstSmartPtr dd) const { m_pMapper->add_local_mat_to_global(mat, lmat, dd);} - void modify_LocalSol(LocalVector& vecMod, const LocalVector& lvec, + /// sets certain entries to Dirichlet DoFs (in elem_disc_assembla_util) + void adjust_mat_global(matrix_type& mat, const LocalMatrix& lmat, ConstSmartPtr dd) const - { m_pMapper->modify_LocalSol(vecMod, lvec, dd);} + { m_pMapper->adjust_mat_global(mat, lmat, dd);} + + /// modifies local solution vector for adapted defect computation ( in elem_disc_assemble_util) + void modify_LocalData(LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, + ConstSmartPtr dd) const + { m_pMapper->modify_LocalData(locD, tmpLocD, locU, dd);} + void modify_LocalData(LocalVectorTimeSeries& uT, LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, + ConstSmartPtr dd, size_t t) const + { m_pMapper->modify_LocalData(uT, locD, tmpLocD, locU, dd, t);} + + void modify_LocalData(LocalMatrix& locJ, LocalVector& locU, + ConstSmartPtr dd) const + { m_pMapper->modify_LocalData(locJ, locU, dd);} + void modify_LocalData(LocalVectorTimeSeries& uT, LocalMatrix& locJ, LocalVector& locU, + ConstSmartPtr dd) const + { m_pMapper->modify_LocalData(uT, locJ, locU, dd);} + + /// modifies global solution vector for adapted defect computation (in domain_disc_impl) + void modify_GlobalSol(vector_type& vecMod, const vector_type& vec, + ConstSmartPtr dd) const + { m_pMapper->modify_GlobalSol(vecMod, vec, dd);} + void modify_GlobalSol(SmartPtr > vSolMod, + ConstSmartPtr > vSol, + ConstSmartPtr dd) const + { m_pMapper->modify_GlobalSol(vSolMod, vSol, dd);} + + + /// sets a marker to exclude elements from assembling /** * This methods sets a marker. Only elements that are marked will be diff --git a/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.h b/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.h new file mode 100644 index 000000000..8997951b8 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.h @@ -0,0 +1,1385 @@ +/* + * Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt + * Author: Andreas Vogel + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1CUT_GEOMETRY__ +#define __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1CUT_GEOMETRY__ + +// extern libraries +#include +#include +#include + +// other ug4 modules +#include "common/common.h" + +// library intern includes +#include "lib_grid/tools/subset_handler_interface.h" +#include "lib_disc/reference_element/reference_element.h" +#include "lib_disc/reference_element/reference_element_traits.h" +#include "lib_disc/reference_element/reference_mapping.h" +#include "lib_disc/reference_element/reference_mapping_provider.h" +#include "lib_disc/local_finite_element/local_finite_element_provider.h" +#include "lib_disc/common/local_algebra.h" +#include "lib_disc/local_finite_element/lagrange/lagrangep1.h" +#include "lib_disc/quadrature/gauss/gauss_quad.h" +#include "fv_util.h" +#include "fv_geom_base.h" + +#include "lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h" +#include "lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h" + + +namespace ug{ + +//template +//class InterfaceHandlerLocalDiffusion; + +//////////////////////////////////////////////////////////////////////////////// +// FV1Cut Geometry for Reference Element Type +//////////////////////////////////////////////////////////////////////////////// + +/// Geometry and shape functions for 1st order Vertex-Centered Finite Volume +/** + * \tparam TElem Element type + * \tparam TWorldDim (physical) world dimension + */ +template < typename TElem, int TWorldDim> +class FV1CutGeometry : public FVGeometryBase +{ + public: + /// type of element + typedef TElem elem_type; + + /// type of reference element + typedef typename reference_element_traits::reference_element_type ref_elem_type; + + /// used traits + typedef fv1_traits traits; + + public: + /// dimension of reference element + static const int dim = ref_elem_type::dim; + + /// dimension of world + static const int worldDim = TWorldDim; + + /// Hanging node flag: this Geometry does not support hanging nodes + static const bool usesHangingNodes = false; + + /// flag indicating if local data may change + static const bool staticLocalData = true; + + public: + /// order + static const int order = 1; + + /// number of SubControlVolumes + static const size_t numSCV = (ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + ? ((ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID) ? (4*ref_elem_type::numEdges) : 16) : ref_elem_type::numCorners; + + /// type of SubControlVolume + typedef typename traits::scv_type scv_type; + + /// number of SubControlVolumeFaces + static const size_t numSCVF = (ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + ? ((ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID) ? (2*ref_elem_type::numEdges) : 24) : ref_elem_type::numEdges; + + /// type of Shape function used + typedef LagrangeP1 local_shape_fct_set_type; + + /// number of shape functions + static const size_t nsh = local_shape_fct_set_type::nsh; + + /// number of integration points + static const size_t nip = 1; + + public: + /// Sub-Control Volume Face structure + /** + * Each finite element is cut by several sub-control volume faces. The idea + * is that the "dual" skeleton formed by the sub control volume faces of + * all elements again gives rise to a regular mesh with closed + * (lipschitz-bounded) control volumes. The SCVF are the boundary of the + * control volume. In computation the flux over each SCVF must be the same + * in both directions over the face in order to guarantee the conservation + * property. + */ + class SCVF + { + public: + /// Number of corners of scvf + static const size_t numCo = traits::NumCornersOfSCVF; + + public: + SCVF() {} + + /// index of SubControlVolume on one side of the scvf + inline size_t from() const {return From;} + + /// index of SubControlVolume on one side of the scvf + inline size_t to() const {return To;} + + /// normal on scvf (points direction "from"->"to"). Norm is equal to area + inline const MathVector& normal() const {return Normal;} + + /// number of integration points on scvf + inline size_t num_ip() const {return nip;} + + /// local integration point of scvf + inline const MathVector& local_ip() const {return localIP;} + + /// global integration point of scvf + inline const MathVector& global_ip() const {return globalIP;} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return nsh;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const {return vShape[sh];} + + /// vector of shape functions in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + private: + // let outer class access private members + friend class FV1CutGeometry; + + // This scvf separates the scv with the ids given in "from" and "to" + // The computed normal points in direction from->to + size_t From, To; + + // The normal on the SCVF pointing (from -> to) + MathVector Normal; // normal (incl. area) + + // ordering is: + // 1D: edgeMidPoint + // 2D: edgeMidPoint, CenterOfElement + // 3D: edgeMidPoint, Side one, CenterOfElement, Side two + MathVector vLocPos[numCo]; // local corners of scvf + MathVector vGloPos[numCo]; // global corners of scvf + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the scvf + + // scvf part + MathVector localIP; // local integration point + MathVector globalIP; // global integration point + + // shapes and derivatives + number vShape[nsh]; // shapes at ip + MathVector vLocalGrad[nsh]; // local grad at ip + MathVector vGlobalGrad[nsh]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + /// sub control volume structure + class SCV + { + public: + /// Number of corners of scvf + static const size_t numCo = traits::NumCornersOfSCV; + + public: + SCV() {}; + + /// volume of scv + inline number volume() const {return Vol;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + /// return local corners + inline const MathVector* local_corners() const + {return &vLocPos[0];} + + /// return global corners + inline const MathVector* global_corners() const + {return &vGloPos[0];} + + /// node id that this scv is associated to + inline size_t node_id() const {return nodeId;} + + /// number of integration points + inline size_t num_ip() const {return nip;} + + /// local integration point of scv + inline const MathVector& local_ip() const {return vLocPos[0];} + + /// global integration point + inline const MathVector& global_ip() const {return vGloPos[0];} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return nsh;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const {return vShape[sh];} + + /// vector of shape functions in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + private: + // let outer class access private members + friend class FV1CutGeometry; + + // node id of associated node + size_t nodeId; + + // volume of scv + number Vol; + + // local and global positions of this element + MathVector vLocPos[numCo]; // local position of node + MathVector vGloPos[numCo]; // global position of node + MidID midId[numCo]; // dimension and id of object, that's midpoint bounds the scv + + // shapes and derivatives + number vShape[nsh]; // shapes at ip + MathVector vLocalGrad[nsh]; // local grad at ip + MathVector vGlobalGrad[nsh]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + /// boundary face + class BF + { + public: + /// Number of corners of bf + static const size_t numCo = traits::NumCornersOfBF; + + public: + BF() {} + + /// index of SubControlVolume of the bf + inline size_t node_id() const {return nodeId;} + + /// number of integration points on bf + inline size_t num_ip() const {return nip;} + + /// local integration point of bf + inline const MathVector& local_ip() const {return localIP;} + + /// global integration point of bf + inline const MathVector& global_ip() const {return globalIP;} + + /// outer normal on bf. Norm is equal to area + inline const MathVector& normal() const {return Normal;} // includes area + + /// volume of bf + inline number volume() const {return Vol;} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return nsh;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vShape[sh];} + + /// vector of local gradients in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + private: + /// let outer class access private members + friend class FV1CutGeometry; + + // id of scv this bf belongs to + size_t nodeId; + + // ordering is: + // 1D: edgeMidPoint + // 2D: edgeMidPoint, CenterOfElement + // 3D: edgeMidPoint, Side one, CenterOfElement, Side two + MathVector vLocPos[numCo]; // local corners of bf + MathVector vGloPos[numCo]; // global corners of bf + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the bf + + // scvf part + MathVector localIP; // local integration point + MathVector globalIP; // global integration point + MathVector Normal; // normal (incl. area) + number Vol; // volume of bf + + // shapes and derivatives + number vShape[nsh]; // shapes at ip + MathVector vLocalGrad[nsh]; // local grad at ip + MathVector vGlobalGrad[nsh]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + public: + /// construct object and initialize local values and sizes + FV1CutGeometry(); + + /// update local data + void update_local_data(); + + /// update data for given element + void update(GridObject* elem, const MathVector* vCornerCoords, + const ISubsetHandler* ish = NULL); + + /// update boundary data for given element + void update_boundary_faces(GridObject* elem, + const MathVector* vCornerCoords, + const ISubsetHandler* ish = NULL); + + /// get the element + TElem* elem() const {return m_pElem;} + + /// get vector of the global coordinates of corners for current element + const MathVector* corners() const {return m_vvGloMid[0];} + + /// number of SubControlVolumeFaces + size_t num_scvf() const {return numSCVF;}; + + /// const access to SubControlVolumeFace number i + const SCVF& scvf(size_t i) const + {UG_ASSERT(i < num_scvf(), "Invalid Index."); return m_vSCVF[i];} + + /// number of SubControlVolumes + // do not use this method to obtain the number of shape functions, + // since this is NOT the same for pyramids; use num_sh() instead. + size_t num_scv() const {return numSCV;} + + /// const access to SubControlVolume number i + const SCV& scv(size_t i) const + {UG_ASSERT(i < num_scv(), "Invalid Index."); return m_vSCV[i];} + + /// number of shape functions + size_t num_sh() const {return nsh;}; + + /// returns reference object id + ReferenceObjectID roid() const {return ref_elem_type::REFERENCE_OBJECT_ID;} + + + public: + /// returns number of all scvf ips + size_t num_scvf_ips() const {return numSCVF;} + + /// returns all ips of scvf as they appear in scv loop + const MathVector* scvf_local_ips() const {return m_vLocSCVF_IP;} + + /// returns all ips of scvf as they appear in scv loop + const MathVector* scvf_global_ips() const {return m_vGlobSCVF_IP;} + + /// returns number of all scv ips + size_t num_scv_ips() const {return numSCV;} + + /// returns all ips of scv as they appear in scv loop + const MathVector* scv_local_ips() const { + if(ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + return &(m_vLocSCV_IP[0]); + else + return &(m_vvLocMid[0][0]); + } + + /// returns all ips of scv as they appear in scv loop + const MathVector* scv_global_ips() const { + if(ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + return &(m_vGlobSCV_IP[0]); + else + return &(m_vvGloMid[0][0]); + } + + /// return local coords for node ID + const MathVector& local_node_position(size_t nodeID) const + { + UG_ASSERT(nodeID < (size_t) ref_elem_type::numCorners, "Invalid node id."); + return m_vvLocMid[0][nodeID]; + } + + /// return global coords for node ID + const MathVector& global_node_position(size_t nodeID) const + { + UG_ASSERT(nodeID < (size_t) ref_elem_type::numCorners, "Invalid node id."); + return m_vvGloMid[0][nodeID]; + } + + /// returns the local coordinates of the center of mass of the element + const MathVector* coe_local() const {return &(m_vvLocMid[dim][0]);} + + /// returns the global coordinates of the center of mass of the element + const MathVector* coe_global() const {return &(m_vvGloMid[dim][0]);} + + protected: + // global and local ips on SCVF + MathVector m_vGlobSCVF_IP[numSCVF]; + MathVector m_vLocSCVF_IP[numSCVF]; + + // global and local ips on SCV (only needed for Pyramid and Octahedron) + MathVector m_vGlobSCV_IP[numSCV]; + MathVector m_vLocSCV_IP[numSCV]; + + public: + /// add subset that is interpreted as boundary subset. + inline void add_boundary_subset(int subsetIndex) {m_mapVectorBF[subsetIndex];} + + /// removes subset that is interpreted as boundary subset. + inline void remove_boundary_subset(int subsetIndex) {m_mapVectorBF.erase(subsetIndex);} + + /// reset all boundary subsets + inline void clear_boundary_subsets() {m_mapVectorBF.clear();} + + /// number of registered boundary subsets + inline size_t num_boundary_subsets() {return m_mapVectorBF.size();} + + /// number of all boundary faces + inline size_t num_bf() const + { + typename std::map >::const_iterator it; + size_t num = 0; + for ( it=m_mapVectorBF.begin() ; it != m_mapVectorBF.end(); it++ ) + num += (*it).second.size(); + return num; + } + + /// number of boundary faces on subset 'subsetIndex' + inline size_t num_bf(int si) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) return 0; + else return (*it).second.size(); + } + + /// returns the boundary face i for subsetIndex + inline const BF& bf(int si, size_t i) const + { + UG_ASSERT(i < num_bf(si), "Invalid index."); + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) UG_THROW("FVGeom: No bnd face for subset"<& bf(int si) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) return m_vEmptyVectorBF; + return (*it).second; + } + + void reset_curr_elem() {m_pElem = NULL;} + + protected: + std::map > m_mapVectorBF; + std::vector m_vEmptyVectorBF; + + private: + /// pointer to current element + TElem* m_pElem; + + /// max number of geom objects in all dimensions + // (most objects in 1 dim, i.e. number of edges, but +1 for 1D) + static const int maxMid = numSCVF + 1; + + /// local and global geom object midpoints for each dimension + MathVector m_vvLocMid[dim+1][maxMid]; + MathVector m_vvGloMid[dim+1][maxMid]; + + /// SubControlVolumeFaces + SCVF m_vSCVF[numSCVF]; + + /// SubControlVolumes + SCV m_vSCV[numSCV]; + + /// Reference Mapping + ReferenceMapping m_mapping; + + /// Reference Element + const ref_elem_type& m_rRefElem; + + /// Shape function set + const local_shape_fct_set_type& m_rTrialSpace; +}; + +//////////////////////////////////////////////////////////////////////////////// +// Dim-dependent Finite Volume Geometry +//////////////////////////////////////////////////////////////////////////////// + +/// Geometry and shape functions for 1st order Vertex-Centered Finite Volume +/** + * \tparam TDim reference element dim + * \tparam TWorldDim (physical) world dimension + */ +template > +class DimFV1CutGeometry : public FVGeometryBase +{ + public: + /// used traits + typedef fv1_dim_traits traits; + + public: + /// dimension of reference element + static const int dim = TDim; + + /// dimension of world + static const int worldDim = TWorldDim; + + /// Hanging node flag: this Geometry does not support hanging nodes + static const bool usesHangingNodes = false; + + /// flag indicating if local data may change + static const bool staticLocalData = false; + + public: + /// order + static const int order = 1; + + /// number of SubControlVolumes + static const size_t maxNumSCV = traits::maxNumSCV; + + /// type of SubControlVolume + typedef typename traits::scv_type scv_type; + + /// max number of SubControlVolumeFaces + static const size_t maxNumSCVF = traits::maxNumSCVF; + + /// max number of shape functions + static const size_t maxNSH = traits::maxNSH; + + /// number of integration points + static const size_t nip = 1; + + public: + /// Sub-Control Volume Face structure + /** + * Each finite element is cut by several sub-control volume faces. The idea + * is that the "dual" skeleton formed by the sub control volume faces of + * all elements again gives rise to a regular mesh with closed + * (lipschitz-bounded) control volumes. The SCVF are the boundary of the + * control volume. In computation the flux over each SCVF must be the same + * in both directions over the face in order to guarantee the conservation + * property. + */ + class SCVF + { + public: + /// Number of corners of scvf + static const size_t numCo = traits::NumCornersOfSCVF; + + public: + SCVF() {} + + /// index of SubControlVolume on one side of the scvf + inline size_t from() const {return From;} + + /// index of SubControlVolume on one side of the scvf + inline size_t to() const {return To;} + + /// number of integration points on scvf + inline size_t num_ip() const {return nip;} + + /// local integration point of scvf + inline const MathVector& local_ip() const {return localIP;} + + /// global integration point of scvf + inline const MathVector& global_ip() const {return globalIP;} + + /// normal on scvf (points direction "from"->"to"). Norm is equal to area + inline const MathVector& normal() const {return Normal;} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return numSH;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const {return vShape[sh];} + + /// vector of shape functions in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of gloabl gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return glbal corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + private: + // let outer class access private members + friend class DimFV1CutGeometry; + + // This scvf separates the scv with the ids given in "from" and "to" + // The computed normal points in direction from->to + size_t From, To; + + // The normal on the SCVF pointing (from -> to) + MathVector Normal; // normal (incl. area) + + // ordering is: + // 1D: edgeMidPoint + // 2D: edgeMidPoint, CenterOfElement + // 3D: edgeMidPoint, Side one, CenterOfElement, Side two + MathVector vLocPos[numCo]; // local corners of scvf + MathVector vGloPos[numCo]; // global corners of scvf + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the scvf + + // scvf part + MathVector localIP; // local integration point + MathVector globalIP; // global integration point + + // shapes and derivatives + size_t numSH; + number vShape[maxNSH]; // shapes at ip + MathVector vLocalGrad[maxNSH]; // local grad at ip + MathVector vGlobalGrad[maxNSH]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + /// sub control volume structure + class SCV + { + public: + /// Number of corners of scv + static const size_t numCo = traits::NumCornersOfSCV; + + public: + SCV() {}; + + /// volume of scv + inline number volume() const {return Vol;} + + inline number get_volume(size_t ip) const + { + if ( volIP[0] == 0.0 && volIP[1] != 0.0 ) + UG_THROW("1: error in volIP!\n"); + if ( volIP[0] != 0.0 && volIP[1] == 0.0 ) + UG_THROW("2: error in volIP!\n"); + + if ( volIP[0] == 0.0 && volIP[1] == 0.0 ) + return Vol; + + return volIP[ip]; + } + + /// number of corners, that bound the scv + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + /// node id that this scv is associated to + inline size_t node_id() const {return nodeId;} + + /// number of integration points + inline size_t num_ip() const {return nip;} + + /// local integration point of scv + inline const MathVector& local_ip() const {return vLocPos[0];} + + /// global integration point + inline const MathVector& global_ip() const {return vGloPos[0];} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return numSH;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const {return vShape[sh];} + + /// vector of shape functions in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + private: + // let outer class access private members + friend class DimFV1CutGeometry; + + // node id of associated node + size_t nodeId; + + // volume of scv + number Vol; + number volIP[2]; + + // local and global positions of this element + MathVector vLocPos[numCo]; // local position of node + MathVector vGloPos[numCo]; // global position of node + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the scv + + // shapes and derivatives + size_t numSH; + number vShape[maxNSH]; // shapes at ip + MathVector vLocalGrad[maxNSH]; // local grad at ip + MathVector vGlobalGrad[maxNSH]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + /// boundary face + class BF + { + public: + /// Number of corners of bf + static const size_t numCo = traits::NumCornersOfSCVF; + + public: + BF() {} + + /// index of SubControlVolume of the bf + inline size_t node_id() const {return nodeId;} + + /// number of integration points on bf + inline size_t num_ip() const {return nip;} + + /// local integration point of bf + inline const MathVector& local_ip() const {return localIP;} + + /// global integration point of bf + inline const MathVector& global_ip() const {return globalIP;} + + /// outer normal on bf. Norm is equal to area + inline const MathVector& normal() const {return Normal;} // includes area + + /// volume of bf + inline number volume() const {return Vol;} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return numSH;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vShape[sh];} + + /// vector of local gradients in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + number Vol; // volume of bf + + private: + /// let outer class access private members + friend class DimFV1CutGeometry; + + // id of scv this bf belongs to + size_t nodeId; + + // ordering is: + // 1D: edgeMidPoint + // 2D: edgeMidPoint, CenterOfElement + // 3D: edgeMidPoint, Side one, CenterOfElement, Side two + MathVector vLocPos[numCo]; // local corners of bf + MathVector vGloPos[numCo]; // global corners of bf + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the bf + + // scvf part + MathVector localIP; // local integration point + MathVector globalIP; // global integration point + MathVector Normal; // normal (incl. area) + + // shapes and derivatives + size_t numSH; + number vShape[maxNSH]; // shapes at ip + MathVector vLocalGrad[maxNSH]; // local grad at ip + MathVector vGlobalGrad[maxNSH]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + public: + /// construct object and initialize local values and sizes + DimFV1CutGeometry() : m_pElem(NULL), m_roid(ROID_UNKNOWN) {}; + + ////////////////////////////////////////////////////////////////////////////// + /// new Cut-methods + ////////////////////////////////////////////////////////////////////////////// + + /// access to m_vBF (needed during 'FV1CutGeom::update_inner_boundary_faces()') + // const std::vector* boundary_faces() const { return &m_vBF[0]; } + const std::vector boundary_faces() const { return m_vBF; } + std::vector& get_boundary_faces() { return m_vBF; } + + inline void set_element_modus(bool boolian) { mElemModus = boolian;} + inline const bool get_element_modus() { return mElemModus;} + inline const ReferenceObjectID get_roid() const {return m_roid;} + + inline const size_t get_original_node(size_t i) const {return m_spInterfaceHandler->corner_orig(i);} + inline const size_t get_interface_id(size_t i) + { + std::vector interfaceIDs = m_spInterfaceHandler->interface_id_all(); + return get_original_node(interfaceIDs[i]); + } + bool lies_onInterface(const size_t newID) + { return m_spInterfaceHandler->lies_onInterface(newID); } + + inline const size_t get_original_node_for_diff(size_t i, const size_t roidID) + { + std::vector interfaceIDs = m_spInterfaceHandler->interface_id_all(); + + size_t origID = m_spInterfaceHandler->corner_orig(interfaceIDs[0]); + size_t origID2 = m_spInterfaceHandler->corner_orig(interfaceIDs[1]); + + if ( roidID == 4 ) + { + if ( origID == 0 && origID2 == 2 && i == 0 ) + {return m_spInterfaceHandler->corner_orig(interfaceIDs[1]);} + else if ( origID == 0 && origID2 == 2 && i == 1 ) + {return m_spInterfaceHandler->corner_orig(interfaceIDs[0]);} + else if ( i < 2 ) + {return m_spInterfaceHandler->corner_orig(interfaceIDs[i]);} + else + { + for ( size_t j = 0; j < 3; ++j ) + if ( j != m_spInterfaceHandler->corner_orig(interfaceIDs[0]) && j != m_spInterfaceHandler->corner_orig(interfaceIDs[1]) ) + return j; + } + } + else if ( roidID == 3 ) + { + origID = m_spInterfaceHandler->corner_orig(interfaceIDs[0]); + if ( i == 0 ) + return origID; + else + return (origID + i)%3; + } + + UG_THROW("in 'get_original_node_for_diff()': wrong Reference ObjectID: " << roidID << "\n"); + return 0; + } + + inline void set_jac_bool(bool boolian) + { m_spInterfaceHandler->set_jac_bool(boolian); } + inline bool get_jac_bool() + { return m_spInterfaceHandler->get_jac_bool(); } + + inline void add_to_integral(const number value) + { return m_spInterfaceHandler->add_to_integral(value); } + inline number get_integral() + { return m_spInterfaceHandler->get_integral(); } + inline void init_integral() + { m_spInterfaceHandler->init_integral(); } + + void resize_local_data(LocalVector u) + { m_spInterfaceHandler->resize_local_data(u); } + void set_orientation(const int orientation) + { m_spInterfaceHandler->set_orientation(orientation); } + int get_orientation() + { return m_spInterfaceHandler->get_orientation(); } + const bool get_boolian_for_diffusion() + { return m_spInterfaceHandler->get_boolian_for_diffusion(); } + + + number get_shape(size_t sh, MathVector locIP, const ReferenceObjectID roid ) + { + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(roid, LFEID(LFEID::LAGRANGE, dim, 1)); + + return TrialSpace.shape(sh, locIP); + } + + inline MathVector get_corner(size_t i) {return m_spInterfaceHandler->corner(i);} + + + void set_DoF_tag_tri(const bool bFactor2_for_DoFIndex) + { m_spInterfaceHandler->set_DoF_tag_tri(bFactor2_for_DoFIndex); } + void set_DoF_tag_quad(const bool bFactor2_for_DoFIndex) + { m_spInterfaceHandler->set_DoF_tag_quad(bFactor2_for_DoFIndex); } + + bool get_bScaleDoFs() { return m_spInterfaceHandler->get_bScaleDoFs(); } + + inline const bool get_bNearInterface() + { return m_spInterfaceHandler->get_bNearInterface(); } + + void set_jacobian_tri(const LocalMatrix locJ) + { m_spInterfaceHandler->set_jacobian_tri(locJ); } + void set_jacobian_quad(const LocalMatrix locJ) + { m_spInterfaceHandler->set_jacobian_quad(locJ); } + + LocalMatrix& get_jacobian_tri() + { return m_spInterfaceHandler->get_local_jacobian_tri(); } + LocalMatrix& get_jacobian_quad() + { return m_spInterfaceHandler->get_local_jacobian_quad(); } + + void set_defect_tri(const LocalVector locD) + { m_spInterfaceHandler->set_defect_tri(locD); } + void set_defect_quad(const LocalVector locD) + { m_spInterfaceHandler->set_defect_quad(locD); } + + void reset_defect_on_interface(LocalVector& locD, const size_t size) + { m_spInterfaceHandler->reset_defect_on_interface(locD, size); } + + void reset_jacobian_on_interface(LocalMatrix& locJ, const size_t size) + { m_spInterfaceHandler->reset_jacobian_on_interface(locJ, size); } + + LocalVector& get_defect_tri() + { return m_spInterfaceHandler->get_local_defect_tri(); } + LocalVector& get_defect_quad() + { return m_spInterfaceHandler->get_local_defect_quad(); } + + LocalVector& get_solution_tri() + { return m_spInterfaceHandler->get_local_solution_tri(); } + LocalVector& get_solution_quad() + { return m_spInterfaceHandler->get_local_solution_quad(); } + + + void set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, const int orientation) + { return m_spInterfaceHandler->set_local_sol(solU, size, lvec, orientation); } + + number get_diffusion() + { return m_spInterfaceHandler->get_diffusion(); } + number get_diffusion(const bool bElementIsOutside) + { return m_spInterfaceHandler->get_diffusion(bElementIsOutside); } + + LocalVector set_jump_values(LocalIndices ind, const size_t size) + { return m_spInterfaceHandler->set_jump_values(ind, size); } + LocalVector set_jump_grad_values(LocalIndices ind, const size_t size) + { return m_spInterfaceHandler->set_jump_grad_values(ind, size); } + // 'set_source' instance used for diffusion elem disc + LocalVector set_source(const std::vector sourceIm, LocalIndices ind, const size_t size, const bool bElementIsCut) + { return m_spInterfaceHandler->set_source(sourceIm, ind, size, bElementIsCut); } + // 'set_source' instance used for navier stokes elem disc + LocalVector set_source(LocalIndices ind, const size_t size, const bool bElementIsCut) + { return m_spInterfaceHandler->set_source(ind, size, bElementIsCut); } + + // methods for Nitsche + void print_Nitsche_Data() + { return m_spInterfaceHandler->print_Nitsche_Data(); } + number vAlpha(size_t i, size_t j){ return m_spInterfaceHandler->vAlpha(i, j); } + MathVector vIntersectionPnts(size_t i){ return m_spInterfaceHandler->vIntersectionPnts(i); } + MathMatrix ShapeValues(){ return m_spInterfaceHandler->vShapeValues(); } + MathVector NormalToFace(){ return m_spInterfaceHandler->NormalToFace(); } + number Gamma(){ return m_spInterfaceHandler->Gamma(); } + number Area(){ return m_spInterfaceHandler->Area(); } + number AreaOrig(){ return m_spInterfaceHandler->AreaOrig(); } + number AreaScale(){ return m_spInterfaceHandler->AreaScale(); } + number IntegralGamma(size_t i){ return m_spInterfaceHandler->IntegralGamma(i); } + + void print_InterfaceIDdata() + { return m_spInterfaceHandler->print_InterfaceIDdata(); } + + + /// called during 'ParticleBndCond::add_def_M_local()': + const number volume_fem_elem() const {UG_THROW("FV1CutGeom::volume_fem_elem() not implemented!\n");} + const number volume_FT_elem() const {UG_THROW("FV1CutGeom::volume_FT_elem() not implemented!\n");} + + number get_volume(size_t ip) const { return m_vVol_IP[ip]; } + + bool mElemModus; + + /// set the local interface handler + /// (called during constructor of class 'MovingInterface') + void set_interface_handler(SmartPtr localHandler) + { m_spInterfaceHandler = localHandler; } + + ////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// + + + /// update data for given element + void update(GridObject* elem, const MathVector* vCornerCoords, + const ISubsetHandler* ish = NULL); + + /// update boundary data for given element + void update_boundary_faces(GridObject* elem, + const MathVector* vCornerCoords, + const ISubsetHandler* ish = NULL); + + /// get the element + GridObject* elem() const {return m_pElem;} + + /// get vector of corners for current element + const MathVector* corners() const {return m_vvGloMid[0];} + + /// number of SubControlVolumeFaces + size_t num_scvf() const {return m_numSCVF;}; + + /// const access to SubControlVolumeFace number i + const SCVF& scvf(size_t i) const + {UG_ASSERT(i < num_scvf(), "Invalid Index."); return m_vSCVF[i];} + + /// number of SubControlVolumes + // do not use this method to obtain the number of shape functions, + // since this is NOT the same for pyramids; use num_sh() instead. + size_t num_scv() const {return m_numSCV;} + + /// const access to SubControlVolume number i + const SCV& scv(size_t i) const + {UG_ASSERT(i < num_scv(), "Invalid Index."); return m_vSCV[i];} + + /// number of shape functions + size_t num_sh() const {return m_nsh;}; + + public: + /// returns number of all scvf ips + size_t num_scvf_ips() const {return m_numSCVF;} + + /// returns all ips of scvf as they appear in scv loop + const MathVector* scvf_local_ips() const {return m_vLocSCVF_IP;} + + /// returns all ips of scvf as they appear in scv loop + const MathVector* scvf_global_ips() const {return m_vGlobSCVF_IP;} + + /// returns number of all scv ips + size_t num_scv_ips() const {return m_numSCV;} + + /// returns all ips of scv as they appear in scv loop + const MathVector* scv_local_ips() const { + if(m_roid == ROID_PYRAMID || m_roid == ROID_OCTAHEDRON) + return &(m_vLocSCV_IP[0]); + else + return &(m_vvLocMid[0][0]); + } + + /// returns all ips of scv as they appear in scv loop + const MathVector* scv_global_ips() const { + if(m_roid == ROID_PYRAMID || m_roid == ROID_OCTAHEDRON) + return &(m_vGlobSCV_IP[0]); + else + return &(m_vvGloMid[0][0]); + } + + /// returns the local coordinates of the center of mass of the element + const MathVector* coe_local() const {return &(m_vvLocMid[dim][0]);} + + /// returns the global coordinates of the center of mass of the element + const MathVector* coe_global() const {return &(m_vvGloMid[dim][0]);} + + /// returns reference object id + ReferenceObjectID roid() const {return m_roid;} + + /// update local data + void update_local(ReferenceObjectID roid); + + ////////////////////////////////////////////////////////////////////////////// + /// new FT-methods + ////////////////////////////////////////////////////////////////////////////// + + /// update boundary faces on interface; call during update() + void update_inner_boundary_faces(); + + /// if OUTSIDE_DOM within update() + void set_local_data_to_zero(){ m_numSCVF = m_numSCV = m_nsh = 0;} + +/* ToDo + /// final computations within update() + void remap_shapes_and_derivatives(ReferenceObjectID roid); + + /// computations for remapping SCVF + void copy_SCVF(SCVF vSCVF[maxNumSCVF]); + void remap_add_SCVF(SCVF vSCVF[maxNumSCVF], size_t numSH); + + /// computations for remapping SCV + void copy_SCV(SCV vSCV[maxNumSCV]); + void remap_add_SCV(SCV vSCV[maxNumSCV], size_t numSH); + + /// computations for remapping m_spInterfaceHandler.m_vBF + void copy_BF(BF vBF[maxNumSCV] ); + void remap_BF(BF vBF[maxNumSCV], size_t numSH); + +*/ + + ////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// + + + protected: + // global and local ips on SCVF + MathVector m_vGlobSCVF_IP[maxNumSCVF]; + MathVector m_vLocSCVF_IP[maxNumSCVF]; + + // global and local ips on SCV (only needed for Pyramid and Octahedron) + MathVector m_vGlobSCV_IP[maxNumSCV]; + MathVector m_vLocSCV_IP[maxNumSCV]; + + number m_vVol_IP[2]; + + public: + /// add subset that is interpreted as boundary subset. + inline void add_boundary_subset(int subsetIndex) {m_mapVectorBF[subsetIndex];} + + /// removes subset that is interpreted as boundary subset. + inline void remove_boundary_subset(int subsetIndex) {m_mapVectorBF.erase(subsetIndex);} + + /// reset all boundary subsets + inline void clear_boundary_subsets() {m_mapVectorBF.clear();} + + /// number of registered boundary subsets + inline size_t num_boundary_subsets() {return m_mapVectorBF.size();} + + /// number of all boundary faces + inline size_t num_bf() const + { + typename std::map >::const_iterator it; + size_t num = 0; + for ( it=m_mapVectorBF.begin() ; it != m_mapVectorBF.end(); it++ ) + num += (*it).second.size(); + return num; + } + + /// number of boundary faces on subset 'subsetIndex' + inline size_t num_bf(int si) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) return 0; + else return (*it).second.size(); + } + + /// returns the boundary face i for subsetIndex + inline const BF& bf(int si, size_t i) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) UG_THROW("DimFV1CutGeom: No BndSubset "<& bf(int si) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) return m_vEmptyVectorBF; + return (*it).second; + } + + protected: + std::map > m_mapVectorBF; + std::vector m_vEmptyVectorBF; + + private: + /// pointer to current element + GridObject* m_pElem; + + /// current reference object id + ReferenceObjectID m_roid; + + /// current number of scv + size_t m_numSCV; + + /// current number of scvf + size_t m_numSCVF; + + /// current number of shape functions + size_t m_nsh; + + /// max number of geometric objects in a dimension + // (most objects in 1 dim, i.e. number of edges, but +1 for 1D) + static const int maxMid = maxNumSCVF + 1; + + /// local and global geom object midpoints for each dimension + MathVector m_vvLocMid[dim+1][maxMid]; + MathVector m_vvGloMid[dim+1][maxMid]; + + /// SubControlVolumeFaces + SCVF m_vSCVF[maxNumSCVF]; + + /// SubControlVolumes + SCV m_vSCV[maxNumSCV]; + + //////////////////////////////////////////////////////////////////////////////// + // FV1Cut data + //////////////////////////////////////////////////////////////////////////////// + + // InterfaceHandlerLocalDiffusion: derived from class 'IInterfaceHandlerLocal' + SmartPtr m_spInterfaceHandler; + + bool m_bIsFlatTopElement; + + std::vector m_vBF; // updated during FV1CutGeom::update_inner_boundary_faces() + + + +}; + +} + +#endif /* __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1CUT_GEOMETRY__ */ diff --git a/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.cpp b/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.cpp new file mode 100644 index 000000000..aae29506c --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.cpp @@ -0,0 +1,2006 @@ +/* + * Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt + * Author: Andreas Vogel + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1FT_GEOMETRY_IMPL_ +#define __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1FT_GEOMETRY_IMPL_ + +#include "common/util/provider.h" +#include "fv1FT_geom.h" +#include "lib_disc/reference_element/reference_element.h" +#include "lib_disc/quadrature/quadrature.h" +#include "lib_algebra/common/operations_vec.h" + + +namespace ug{ + +/** + * \tparam dim dimension of coordinates + * \tparam TRefElem Reference element type + * \tparam maxMid Maximum number of elements for all dimensions + */ +template +static void ComputeMidPoints(const TRefElem& rRefElem, + const MathVector vCorner[], + MathVector vvMid[][maxMid]) +{ +// compute local midpoints for all geometric objects with 0 < d <= dim + for(int d = 1; d <= dim; ++d) + { + // loop geometric objects of dimension d + for(size_t i = 0; i < rRefElem.num(d); ++i) + { + // set first node + const size_t coID0 = rRefElem.id(d, i, 0, 0); + vvMid[d][i] = vCorner[coID0]; + + // add corner coordinates of the corners of the geometric object + for(size_t j = 1; j < rRefElem.num(d, i, 0); ++j) + { + const size_t coID = rRefElem.id(d, i, 0, j); + vvMid[d][i] += vCorner[coID]; + } + + // scale for correct averaging + vvMid[d][i] *= 1./(rRefElem.num(d, i, 0)); + } + } + +// for OCTAHEDRONS: add midpoints of imaginary faces, edges and volumes +// resulting from the division into 4 tetrahedra alongside inner edge 3->1 + if (rRefElem.roid() == ROID_OCTAHEDRON) + { + // diagonal 3->1, diagonal 1->3 + VecScaleAdd(vvMid[1][rRefElem.num(1)], 0.5, vCorner[3], 0.5, vCorner[1]); + VecScaleAdd(vvMid[1][rRefElem.num(1)+1], 0.5, vCorner[1], 0.5, vCorner[3]); + + // subface 1,2,3; subface 1,3,2; subface 1,3,4; subface 1,4,3; face 1,3,5; face 1,5,3; face 1,0,3; face 1,3,0 + vvMid[2][rRefElem.num(2)] = vCorner[1]; + vvMid[2][rRefElem.num(2)] += vCorner[2]; + vvMid[2][rRefElem.num(2)] += vCorner[3]; + vvMid[2][rRefElem.num(2)] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+1] = vCorner[1]; + vvMid[2][rRefElem.num(2)+1] += vCorner[3]; + vvMid[2][rRefElem.num(2)+1] += vCorner[2]; + vvMid[2][rRefElem.num(2)+1] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+2] = vCorner[1]; + vvMid[2][rRefElem.num(2)+2] += vCorner[3]; + vvMid[2][rRefElem.num(2)+2] += vCorner[4]; + vvMid[2][rRefElem.num(2)+2] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+3] = vCorner[1]; + vvMid[2][rRefElem.num(2)+3] += vCorner[4]; + vvMid[2][rRefElem.num(2)+3] += vCorner[3]; + vvMid[2][rRefElem.num(2)+3] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+4] = vCorner[1]; + vvMid[2][rRefElem.num(2)+4] += vCorner[3]; + vvMid[2][rRefElem.num(2)+4] += vCorner[5]; + vvMid[2][rRefElem.num(2)+4] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+5] = vCorner[1]; + vvMid[2][rRefElem.num(2)+5] += vCorner[5]; + vvMid[2][rRefElem.num(2)+5] += vCorner[3]; + vvMid[2][rRefElem.num(2)+5] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+6] = vCorner[1]; + vvMid[2][rRefElem.num(2)+6] += vCorner[0]; + vvMid[2][rRefElem.num(2)+6] += vCorner[3]; + vvMid[2][rRefElem.num(2)+6] *= 1.0/3.0; + + vvMid[2][rRefElem.num(2)+7] = vCorner[1]; + vvMid[2][rRefElem.num(2)+7] += vCorner[3]; + vvMid[2][rRefElem.num(2)+7] += vCorner[0]; + vvMid[2][rRefElem.num(2)+7] *= 1.0/3.0; + + // subvolume 1,2,3,5; subvolume 1,3,4,5; subvolume 1,2,3,0; subvolume 1,3,4,0 + vvMid[3][rRefElem.num(3)] = vCorner[1]; + vvMid[3][rRefElem.num(3)] += vCorner[2]; + vvMid[3][rRefElem.num(3)] += vCorner[3]; + vvMid[3][rRefElem.num(3)] += vCorner[5]; + vvMid[3][rRefElem.num(3)] *= 0.25; + + vvMid[3][rRefElem.num(3)+1] = vCorner[1]; + vvMid[3][rRefElem.num(3)+1] += vCorner[3]; + vvMid[3][rRefElem.num(3)+1] += vCorner[4]; + vvMid[3][rRefElem.num(3)+1] += vCorner[5]; + vvMid[3][rRefElem.num(3)+1] *= 0.25; + + vvMid[3][rRefElem.num(3)+2] = vCorner[1]; + vvMid[3][rRefElem.num(3)+2] += vCorner[2]; + vvMid[3][rRefElem.num(3)+2] += vCorner[3]; + vvMid[3][rRefElem.num(3)+2] += vCorner[0]; + vvMid[3][rRefElem.num(3)+2] *= 0.25; + + vvMid[3][rRefElem.num(3)+3] = vCorner[1]; + vvMid[3][rRefElem.num(3)+3] += vCorner[3]; + vvMid[3][rRefElem.num(3)+3] += vCorner[4]; + vvMid[3][rRefElem.num(3)+3] += vCorner[0]; + vvMid[3][rRefElem.num(3)+3] *= 0.25; + } +} + +/** + * \param[in] i indicates that scvf corresponds to i'th edge of ref elem + */ +template +static void ComputeSCVFMidID(const TRefElem& rRefElem, + MidID vMidID[], int i) +{ + static const int dim = TRefElem::dim; + + if (rRefElem.roid() != ROID_PYRAMID && rRefElem.roid() != ROID_OCTAHEDRON) + { + // set mid ids + { + // start at edge midpoint + vMidID[0] = MidID(1,i); + + // loop up dimension + if(dim == 2) + { + vMidID[1] = MidID(dim, 0); // center of element + } + else if (dim == 3) + { + vMidID[1] = MidID(2, rRefElem.id(1, i, 2, 0)); // side 0 + vMidID[2] = MidID(dim, 0); // center of element + vMidID[3] = MidID(2, rRefElem.id(1, i, 2, 1)); // side 1 + } + } + } +// pyramid here + else if(rRefElem.roid() == ROID_PYRAMID) + { + // start at edge midpoint + vMidID[0] = MidID(1,i/2); + + // there are 2 scvf per edge + if(i%2 == 0){ + vMidID[1] = MidID(2, rRefElem.id(1, i/2, 2, 0)); // side 0 + vMidID[2] = MidID(dim, 0); // center of element + } else { + vMidID[1] = MidID(dim, 0); // center of element + vMidID[2] = MidID(2, rRefElem.id(1, i/2, 2, 1)); // side 1 + } + } +// octahedron here (analogue to scvf ordering in pyramids but in top/bottom pairs) + else if(rRefElem.roid() == ROID_OCTAHEDRON) + { + switch (i) + { + // scvf of edge 4 (top) + case 0: vMidID[0] = MidID(1,4); // edge 4 + vMidID[1] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,4); // face 4 + break; + // scvf of edge 4 (bottom) + case 1: vMidID[0] = MidID(1,4); // edge 4 + vMidID[1] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,0); // face 0 + break; + + + // scvf of edge 5 (top) + case 2: vMidID[0] = MidID(1,5); // edge 5 + vMidID[1] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,5); // face 5 + break; + // scvf of edge 5 (bottom) + case 3: vMidID[0] = MidID(1,5); // edge 5 + vMidID[1] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,1); // face 1 + break; + + + // scvf of diagonal 3->1 (top) in subvolume 0 + case 4: vMidID[0] = MidID(1,12);// diagonal 3->1 + vMidID[1] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,13);// face 1,5,3 + break; + // scvf of diagonal 1->3 (bottom) in subvolume 2 + case 5: vMidID[0] = MidID(1,13);// diagonal 1->3 + vMidID[1] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,14);// face 1,0,3 + break; + + + // scvf of edge 8 in subvolume 0 + case 6: vMidID[0] = MidID(1,8); // edge 8 + vMidID[1] = MidID(2,4); // face 4 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,13);// face 1,5,3 + break; + // scvf of edge 0 in subvolume 2 + case 7: vMidID[0] = MidID(1,0); // edge 0 + vMidID[1] = MidID(2,15);// face 1,3,0 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,0); // face 0 + break; + + + // scvf of edge 9 + case 8: vMidID[0] = MidID(1,9); // edge 9 + vMidID[1] = MidID(2,5); // face 5 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,4); // face 4 + break; + // scvf of edge 1 + case 9: vMidID[0] = MidID(1,1); // edge 1 + vMidID[1] = MidID(2,0); // face 0 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,1); // face 1 + break; + + + // scvf of edge 10 in subvolume 0 + case 10:vMidID[0] = MidID(1,10);// edge 10 + vMidID[1] = MidID(2,12);// face 1,3,5 + vMidID[2] = MidID(3,1); // subvolume 0 + vMidID[3] = MidID(2,5); // face 5 + break; + // scvf of edge 2 in subvolume 2 + case 11:vMidID[0] = MidID(1,2); // edge 2 + vMidID[1] = MidID(2,1); // face 1 + vMidID[2] = MidID(3,3); // subvolume 2 + vMidID[3] = MidID(2,14);// face 1,0,3 + break; + + + // scvf of diagonal 1->3 (top) in subvolume 1 + case 12:vMidID[0] = MidID(1,13);// diagonal 1->3 + vMidID[1] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,12);// face 1,3,5 + break; + // scvf of diagonal 3->1 (bottom) in subvolume 3 + case 13:vMidID[0] = MidID(1,12);// diagonal 3->1 + vMidID[1] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,15);// face 1,3,0 + break; + + + // scvf of edge 6 (top) + case 14:vMidID[0] = MidID(1,6); // edge 6 + vMidID[1] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,6); // face 6 + break; + // scvf of edge 6 (bottom) + case 15:vMidID[0] = MidID(1,6); // edge 6 + vMidID[1] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,2); // face 2 + break; + + + // scvf of edge 7 (top) + case 16:vMidID[0] = MidID(1,7); // edge 7 + vMidID[1] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,7); // face 7 + break; + // scvf of edge 7 (bottom) + case 17:vMidID[0] = MidID(1,7); // edge 7 + vMidID[1] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,3); // face 3 + break; + + + // scvf of edge 8 in subvolume 1 + case 18:vMidID[0] = MidID(1,8); // edge 8 + vMidID[1] = MidID(2,13);// face 1,5,3 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,7); // face 7 + break; + // scvf of edge 0 in subvolume 3 + case 19:vMidID[0] = MidID(1,0); // edge 0 + vMidID[1] = MidID(2,3); // face 3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,15);// face 1,3,0 + break; + + + // scvf of edge 10 in subvolume 1 + case 20:vMidID[0] = MidID(1,10);// edge 10 + vMidID[1] = MidID(2,6); // face 6 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,12);// face 1,3,5 + break; + // scvf of edge 2 in subvolume 3 + case 21:vMidID[0] = MidID(1,2); // edge 2 + vMidID[1] = MidID(2,14);// face 1,0,3 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,2); // face 2 + break; + + + // scvf of edge 11 in subvolume 1 + case 22:vMidID[0] = MidID(1,11);// edge 11 + vMidID[1] = MidID(2,7); // face 7 + vMidID[2] = MidID(3,2); // subvolume 1 + vMidID[3] = MidID(2,6); // face 6 + break; + // scvf of edge 3 in subvolume 3 + case 23:vMidID[0] = MidID(1,3); // edge 3 + vMidID[1] = MidID(2,2); // face 2 + vMidID[2] = MidID(3,4); // subvolume 3 + vMidID[3] = MidID(2,3); // face 3 + break; + + + default:UG_THROW("Octahedron only has 24 SCVFs (no. 0-23), but requested no. " << i << "."); + break; + } + } +} + +/** + * \param[in] i indicates that scv corresponds to i'th corner of ref elem + */ +template +static void ComputeSCVMidID(const TRefElem& rRefElem, + MidID vMidID[], int i) +{ + static const int dim = TRefElem::dim; + + if (rRefElem.roid() != ROID_PYRAMID && rRefElem.roid() != ROID_OCTAHEDRON) + { + if(dim == 1) + { + vMidID[0] = MidID(0, i); // set node as corner of scv + vMidID[1] = MidID(dim, 0); // center of element + } + else if(dim == 2) + { + vMidID[0] = MidID(0, i); // set node as corner of scv + vMidID[1] = MidID(1, rRefElem.id(0, i, 1, 0)); // edge 1 + vMidID[2] = MidID(dim, 0); // center of element + vMidID[3] = MidID(1, rRefElem.id(0, i, 1, 1)); // edge 2 + } + else if(dim == 3) + { + vMidID[0] = MidID(0, i); // set node as corner of scv + vMidID[1] = MidID(1, rRefElem.id(0, i, 1, 1)); // edge 1 + vMidID[2] = MidID(2, rRefElem.id(0, i, 2, 0)); // face 0 + vMidID[3] = MidID(1, rRefElem.id(0, i, 1, 0)); // edge 0 + vMidID[4] = MidID(1, rRefElem.id(0, i, 1, 2)); // edge 2 + vMidID[5] = MidID(2, rRefElem.id(0, i, 2, 2)); // face 2 + vMidID[6] = MidID(dim, 0); // center of element + vMidID[7] = MidID(2, rRefElem.id(0, i, 2, 1)); // face 1 + } + else {UG_THROW("Dimension higher than 3 not implemented.");} + } +// pyramid here + else if (rRefElem.roid() == ROID_PYRAMID) + { + // start at edge midpoint + vMidID[3] = MidID(1,i/4); + + // there are 2 scvf per edge + if(i%4 == 0 || i%4 == 1){ + vMidID[1] = MidID(2, rRefElem.id(1, i/4, 2, 0)); // side 0 + vMidID[2] = MidID(dim, 0); // center of element + } else { + vMidID[1] = MidID(dim, 0); // center of element + vMidID[2] = MidID(2, rRefElem.id(1, i/4, 2, 1)); // side 1 + } + + // connect to from / to corners of edge + if(i%2 == 0){ + vMidID[0] = MidID(0, rRefElem.id(1, i/4, 0, 0)); // from + } else { + vMidID[0] = MidID(0, rRefElem.id(1, i/4, 0, 1)); // to + } + } + // octahedron here (analogue to scv ordering in pyramids but in top/bottom pairs) + else if(rRefElem.roid() == ROID_OCTAHEDRON) + { + switch (i) + { + // scv of corner 1 in subvolume 0 (top) + case 0: vMidID[0] = MidID(0,1); // corner 1 + vMidID[1] = MidID(1,4); // edge 4 + vMidID[2] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[3] = MidID(1,12);// edge 3->1 + vMidID[4] = MidID(1,8); // edge 8 + vMidID[5] = MidID(2,4); // face 4 + vMidID[6] = MidID(3,1); // subvolume 0 + vMidID[7] = MidID(2,13);// face 1,5,3 + break; + // scv of corner 1 in subvolume 2 (bottom) + case 1: vMidID[0] = MidID(0,1); // corner 1 + vMidID[1] = MidID(1,13);// edge 1->3 + vMidID[2] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[3] = MidID(1,4); // edge 4 + vMidID[4] = MidID(1,0); // edge 0 + vMidID[5] = MidID(2,15);// face 1,3,0 + vMidID[6] = MidID(3,3); // subvolume 2 + vMidID[7] = MidID(2,0); // face 0 + break; + + + // scv of corner 2 in subvolume 0 (top) + case 2: vMidID[0] = MidID(0,2); // corner 2 + vMidID[1] = MidID(1,5); // edge 5 + vMidID[2] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[3] = MidID(1,4); // edge 4 + vMidID[4] = MidID(1,9); // edge 9 + vMidID[5] = MidID(2,5); // face 5 + vMidID[6] = MidID(3,1); // subvolume 0 + vMidID[7] = MidID(2,4); // face 4 + break; + // scv of corner 2 in subvolume 2 (bottom) + case 3: vMidID[0] = MidID(0,2); // corner 2 + vMidID[1] = MidID(1,4); // edge 4 + vMidID[2] = MidID(2,9); // subface 1 = 1,3,2 + vMidID[3] = MidID(1,5); // edge 5 + vMidID[4] = MidID(1,1); // edge 1 + vMidID[5] = MidID(2,0); // face 0 + vMidID[6] = MidID(3,3); // subvolume 2 + vMidID[7] = MidID(2,1); // face 1 + break; + + + // scv of corner 3 in subvolume 0 (top) + case 4: vMidID[0] = MidID(0,3); // corner 3 + vMidID[1] = MidID(1,12);// edge 3->1 + vMidID[2] = MidID(2,8); // subface 0 = 1,2,3 + vMidID[3] = MidID(1,5); // edge 5 + vMidID[4] = MidID(1,10);// edge 10 + vMidID[5] = MidID(2,13);// face 1,5,3 + vMidID[6] = MidID(3,1); // subvolume 0 + vMidID[7] = MidID(2,5); // face 5 + break; + // scv of corner 3 in subvolume 2 (bottom) + case 5: vMidID[0] = MidID(0,3); // corner 3 + vMidID[1] = MidID(1,5); // edge 5 + vMidID[2] = MidID(2,9); // subface 0 = 1,3,2 + vMidID[3] = MidID(1,13);// edge 1->3 + vMidID[4] = MidID(1,2); // edge 2 + vMidID[5] = MidID(2,1); // face 1 + vMidID[6] = MidID(3,3); // subvolume 2 + vMidID[7] = MidID(2,15);// face 1,3,0 + break; + + + // scv of corner 5 in subvolume 0 (top) + case 6: vMidID[0] = MidID(0,5); // corner 5 + vMidID[1] = MidID(1,9); // edge 9 + vMidID[2] = MidID(2,4); // face 4 + vMidID[3] = MidID(1,8); // edge 8 + vMidID[4] = MidID(1,10);// edge 10 + vMidID[5] = MidID(2,5); // face 5 + vMidID[6] = MidID(3,1); // subvolume 0 + vMidID[7] = MidID(2,13);// subface 1,5,3 + break; + // scv of corner 0 in subvolume 2 (bottom) + case 7: vMidID[0] = MidID(0,0); // corner 0 + vMidID[1] = MidID(1,0); // edge 0 + vMidID[2] = MidID(2,0); // face 0 + vMidID[3] = MidID(1,1); // edge 1 + vMidID[4] = MidID(1,2); // edge 2 + vMidID[5] = MidID(2,14);// subface 1,0,3 + vMidID[6] = MidID(3,3); // subvolume 2 + vMidID[7] = MidID(2,1); // face 1 + break; + + + // scv of corner 1 in subvolume 1 (top) + case 8: vMidID[0] = MidID(0,1); // corner 1 + vMidID[1] = MidID(1,13);// edge 1->3 + vMidID[2] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[3] = MidID(1,7); // edge 7 + vMidID[4] = MidID(1,8); // edge 8 + vMidID[5] = MidID(2,12);// face 1,3,5 + vMidID[6] = MidID(3,2); // subvolume 1 + vMidID[7] = MidID(2,7); // face 7 + break; + // scv of corner 1 in subvolume 3 (bottom) + case 9: vMidID[0] = MidID(0,1); // corner 1 + vMidID[1] = MidID(1,7); // edge 7 + vMidID[2] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[3] = MidID(1,12);// edge 3->1 + vMidID[4] = MidID(1,0); // edge 0 + vMidID[5] = MidID(2,3); // face 3 + vMidID[6] = MidID(3,4); // subvolume 3 + vMidID[7] = MidID(2,14);// face 1,0,3 + break; + + + // scv of corner 3 in subvolume 1 (top) + case 10:vMidID[0] = MidID(0,3); // corner 3 + vMidID[1] = MidID(1,6); // edge 6 + vMidID[2] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[3] = MidID(1,13);// edge 1->3 + vMidID[4] = MidID(1,10);// edge 10 + vMidID[5] = MidID(2,6); // face 6 + vMidID[6] = MidID(3,2); // subvolume 1 + vMidID[7] = MidID(2,12);// face 1,3,5 + break; + // scv of corner 3 in subvolume 3 (bottom) + case 11:vMidID[0] = MidID(0,3); // corner 3 + vMidID[1] = MidID(1,12);// edge 3->1 + vMidID[2] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[3] = MidID(1,6); // edge 6 + vMidID[4] = MidID(1,2); // edge 2 + vMidID[5] = MidID(2,14);// face 1,0,3 + vMidID[6] = MidID(3,4); // subvolume 3 + vMidID[7] = MidID(2,2); // face 2 + break; + + + // scv of corner 4 in subvolume 1 (top) + case 12:vMidID[0] = MidID(0,4); // corner 4 + vMidID[1] = MidID(1,7); // edge 7 + vMidID[2] = MidID(2,10);// subface 2 = 1,3,4 + vMidID[3] = MidID(1,6); // edge 6 + vMidID[4] = MidID(1,11);// edge 11 + vMidID[5] = MidID(2,7); // face 7 + vMidID[6] = MidID(3,2); // subvolume 1 + vMidID[7] = MidID(2,6); // face 6 + break; + // scv of corner 4 in subvolume 3 (bottom) + case 13:vMidID[0] = MidID(0,4); // corner 4 + vMidID[1] = MidID(1,6); // edge 6 + vMidID[2] = MidID(2,11);// subface 3 = 1,4,3 + vMidID[3] = MidID(1,7); // edge 7 + vMidID[4] = MidID(1,3); // edge 3 + vMidID[5] = MidID(2,2); // face 2 + vMidID[6] = MidID(3,4); // subvolume 3 + vMidID[7] = MidID(2,3); // face 3 + break; + + + // scv of corner 5 in subvolume 1 (top) + case 14:vMidID[0] = MidID(0,5); // corner 5 + vMidID[1] = MidID(1,10);// edge 10 + vMidID[2] = MidID(2,12);// subface 1,3,5 + vMidID[3] = MidID(1,8); // edge 8 + vMidID[4] = MidID(1,11);// edge 11 + vMidID[5] = MidID(2,6); // face 6 + vMidID[6] = MidID(3,2); // subvolume 1 + vMidID[7] = MidID(2,7); // face 7 + break; + // scv of corner 0 in subvolume 3 (bottom) + case 15:vMidID[0] = MidID(0,0); // corner 0 + vMidID[1] = MidID(1,0); // edge 0 + vMidID[2] = MidID(2,15);// subface 1,3,0 + vMidID[3] = MidID(1,2); // edge 2 + vMidID[4] = MidID(1,3); // edge 3 + vMidID[5] = MidID(2,3); // face 3 + vMidID[6] = MidID(3,4); // subvolume 3 + vMidID[7] = MidID(2,2); // face 2 + break; + default:UG_THROW("Octahedron only has 16 SCVs (no. 0-15), but requested no. " << i << "."); + break; + } + } +} + +/** + * \param[in] i indicates that bf corresponds to i'th corner of ref elem + */ +template +static void ComputeBFMidID(const TRefElem& rRefElem, int side, + MidID vMidID[], int co) +{ + static const int dim = TRefElem::dim; + + // number of corners of side + const int coOfSide = rRefElem.num(dim-1, side, 0); + + // set mid ids + if (dim == 1) + { + vMidID[0] = MidID(0, rRefElem.id(0, side, 0, co)); + } + else if(dim == 2) + { + vMidID[co%2] = MidID(0, rRefElem.id(1, side, 0, co)); // corner of side + vMidID[(co+1)%2] = MidID(1, side); // side midpoint + } + else if (dim == 3) + { + vMidID[0] = MidID(0, rRefElem.id(2, side, 0, co)); // corner of side + vMidID[1] = MidID(1, rRefElem.id(2, side, 1, co)); // edge co + vMidID[2] = MidID(2, side); // side midpoint + vMidID[3] = MidID(1, rRefElem.id(2, side, 1, (co -1 + coOfSide)%coOfSide)); // edge co-1 + } +} + +template +static void CopyCornerByMidID(MathVector vCorner[], + const MidID vMidID[], + MathVector vvMidPos[][maxMid], + const size_t numCo) +{ + for(size_t i = 0; i < numCo; ++i) + { + const size_t d = vMidID[i].dim; + const size_t id = vMidID[i].id; + vCorner[i] = vvMidPos[d][id]; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// FV1FT Geometry for Reference Element Type +//////////////////////////////////////////////////////////////////////////////// + +template +FV1FTGeometry:: +FV1FTGeometry() + : m_pElem(NULL), m_rRefElem(Provider::get()), + m_rTrialSpace(Provider::get()) +{ + update_local_data(); +} + +template +void FV1FTGeometry:: +update_local_data() +{ + +// set corners of element as local centers of nodes + for(size_t i = 0; i < m_rRefElem.num(0); ++i) + m_vvLocMid[0][i] = m_rRefElem.corner(i); + +// compute local midpoints + ComputeMidPoints(m_rRefElem, m_vvLocMid[0], m_vvLocMid); + +// set up local information for SubControlVolumeFaces (scvf) + for(size_t i = 0; i < num_scvf(); ++i) + { + + // this scvf separates the given nodes + if (m_rRefElem.REFERENCE_OBJECT_ID != ROID_PYRAMID && m_rRefElem.REFERENCE_OBJECT_ID != ROID_OCTAHEDRON) + { + m_vSCVF[i].From = m_rRefElem.id(1, i, 0, 0); + m_vSCVF[i].To = m_rRefElem.id(1, i, 0, 1); + } + // special case pyramid + else if(m_rRefElem.REFERENCE_OBJECT_ID == ROID_PYRAMID) + { + // map according to order defined in ComputeSCVFMidID + m_vSCVF[i].From = m_rRefElem.id(1, i/2, 0, 0); + m_vSCVF[i].To = m_rRefElem.id(1, i/2, 0, 1); + } + // special case octahedron (scvf not mappable by edges) + else if(m_rRefElem.REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + { + // map according to order defined in ComputeSCVFMidID + switch(i) + { + case 0: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 2; + break; + case 1: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 1; + break; + + + case 2: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 3; + break; + case 3: m_vSCVF[i].From = 3; + m_vSCVF[i].To = 2; + break; + + + case 4: m_vSCVF[i].From = 3; + m_vSCVF[i].To = 1; + break; + case 5: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 3; + break; + + + case 6: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 5; + break; + case 7: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 0; + break; + + + case 8: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 5; + break; + case 9: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 0; + break; + + + case 10:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 5; + break; + case 11:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 0; + break; + + + case 12:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 3; + break; + case 13:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 1; + break; + + + case 14:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 4; + break; + case 15:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 3; + break; + + + case 16:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 1; + break; + case 17:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 4; + break; + + + case 18:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 5; + break; + case 19:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 0; + break; + + + case 20:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 5; + break; + case 21:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 0; + break; + + + case 22:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 5; + break; + case 23:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 0; + break; + } + } + + // compute mid ids of the scvf + ComputeSCVFMidID(m_rRefElem, m_vSCVF[i].vMidID, i); + + // copy local corners of scvf + CopyCornerByMidID(m_vSCVF[i].vLocPos, m_vSCVF[i].vMidID, m_vvLocMid, SCVF::numCo); + + // integration point + AveragePositions(m_vSCVF[i].localIP, m_vSCVF[i].vLocPos, SCVF::numCo); + } + +// set up local informations for SubControlVolumes (scv) +// each scv is associated to one corner of the element + for(size_t i = 0; i < num_scv(); ++i) + { + // store associated node + if (m_rRefElem.REFERENCE_OBJECT_ID != ROID_PYRAMID && m_rRefElem.REFERENCE_OBJECT_ID != ROID_OCTAHEDRON) + { + m_vSCV[i].nodeId = i; + } + // special case pyramid + else if(m_rRefElem.REFERENCE_OBJECT_ID == ROID_PYRAMID) + { + // map according to order defined in ComputeSCVMidID + if(i%2 == 0){ + m_vSCV[i].nodeId = m_rRefElem.id(1, i/4, 0, 0); // from + } else { + m_vSCV[i].nodeId = m_rRefElem.id(1, i/4, 0, 1); // to + } + } + // special case octahedron (scvf not mappable by edges) + else if(m_rRefElem.REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + { + // map according to order defined in ComputeSCVMidID + switch(i) + { + case 0: m_vSCV[i].nodeId = 1; + break; + case 1: m_vSCV[i].nodeId = 1; + break; + + + case 2: m_vSCV[i].nodeId = 2; + break; + case 3: m_vSCV[i].nodeId = 2; + break; + + + case 4: m_vSCV[i].nodeId = 3; + break; + case 5: m_vSCV[i].nodeId = 3; + break; + + + case 6: m_vSCV[i].nodeId = 5; + break; + case 7: m_vSCV[i].nodeId = 0; + break; + + + case 8: m_vSCV[i].nodeId = 1; + break; + case 9: m_vSCV[i].nodeId = 1; + break; + + + case 10:m_vSCV[i].nodeId = 3; + break; + case 11:m_vSCV[i].nodeId = 3; + break; + + + case 12:m_vSCV[i].nodeId = 4; + break; + case 13:m_vSCV[i].nodeId = 4; + break; + + + case 14:m_vSCV[i].nodeId = 5; + break; + case 15:m_vSCV[i].nodeId = 0; + break; + } + } + + // compute mid ids scv + ComputeSCVMidID(m_rRefElem, m_vSCV[i].midId, i); + + // copy local corners of scv + CopyCornerByMidID(m_vSCV[i].vLocPos, m_vSCV[i].midId, m_vvLocMid, m_vSCV[i].num_corners()); + } + +// compute Shapes and Derivatives + for(size_t i = 0; i < num_scvf(); ++i) + { + m_rTrialSpace.shapes(&(m_vSCVF[i].vShape[0]), m_vSCVF[i].local_ip()); + m_rTrialSpace.grads(&(m_vSCVF[i].vLocalGrad[0]), m_vSCVF[i].local_ip()); + } + + for(size_t i = 0; i < num_scv(); ++i) + { + m_rTrialSpace.shapes(&(m_vSCV[i].vShape[0]), m_vSCV[i].local_ip()); + m_rTrialSpace.grads(&(m_vSCV[i].vLocalGrad[0]), m_vSCV[i].local_ip()); + } + +// copy ip positions in a list for Sub Control Volumes Faces (SCVF) + for(size_t i = 0; i < num_scvf(); ++i) + m_vLocSCVF_IP[i] = scvf(i).local_ip(); + + if(ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + for(size_t i = 0; i < num_scv(); ++i) + m_vLocSCV_IP[i] = scv(i).local_ip(); +} + +/// update data for given element +template +void FV1FTGeometry:: +update(GridObject* elem, const MathVector* vCornerCoords, const ISubsetHandler* ish) +{ + UG_ASSERT(dynamic_cast(elem) != NULL, "Wrong element type."); + TElem* pElem = static_cast(elem); + +// if already update for this element, do nothing + if(m_pElem == pElem) return; else m_pElem = pElem; + +// remember global position of nodes + for(size_t i = 0; i < m_rRefElem.num(0); ++i) + m_vvGloMid[0][i] = vCornerCoords[i]; + +// compute global midpoints + ComputeMidPoints(m_rRefElem, m_vvGloMid[0], m_vvGloMid); + + +// compute global informations for scvf + for(size_t i = 0; i < num_scvf(); ++i) + { + // copy local corners of scvf + CopyCornerByMidID(m_vSCVF[i].vGloPos, m_vSCVF[i].vMidID, m_vvGloMid, SCVF::numCo); + + // integration point + AveragePositions(m_vSCVF[i].globalIP, m_vSCVF[i].vGloPos, SCVF::numCo); + + // normal on scvf + traits::NormalOnSCVF(m_vSCVF[i].Normal, m_vSCVF[i].vGloPos, m_vvGloMid[0]); + } + +// compute size of scv + for(size_t i = 0; i < num_scv(); ++i) + { + // copy global corners + CopyCornerByMidID(m_vSCV[i].vGloPos, m_vSCV[i].midId, m_vvGloMid, m_vSCV[i].num_corners()); + + // compute volume of scv + m_vSCV[i].Vol = ElementSize(m_vSCV[i].vGloPos); + + /* + * Only for debug purposes testing octahedral FV1 discretization + * + MathVector baryCenter(0.0); + for(size_t j = 0; j < 8; ++j) + { + baryCenter += m_vSCV[i].vLocPos[j]; + } + + baryCenter *= 1.0/8.0; + * + */ + + } + +// Shapes and Derivatives + m_mapping.update(vCornerCoords); + +// if mapping is linear, compute jacobian only once and copy + if(ReferenceMapping::isLinear) + { + MathMatrix JtInv; + m_mapping.jacobian_transposed_inverse(JtInv, m_vSCVF[0].local_ip()); + const number detJ = m_mapping.sqrt_gram_det(m_vSCVF[0].local_ip()); + + for(size_t i = 0; i < num_scvf(); ++i) + { + m_vSCVF[i].JtInv = JtInv; + m_vSCVF[i].detj = detJ; + } + + for(size_t i = 0; i < num_scv(); ++i) + { + m_vSCV[i].JtInv = JtInv; + m_vSCV[i].detj = detJ; + } + } +// else compute jacobian for each integration point + else + { + for(size_t i = 0; i < num_scvf(); ++i) + { + m_mapping.jacobian_transposed_inverse(m_vSCVF[i].JtInv, m_vSCVF[i].local_ip()); + m_vSCVF[i].detj = m_mapping.sqrt_gram_det(m_vSCVF[i].local_ip()); + } + for(size_t i = 0; i < num_scv(); ++i) + { + m_mapping.jacobian_transposed_inverse(m_vSCV[i].JtInv, m_vSCV[i].local_ip()); + m_vSCV[i].detj = m_mapping.sqrt_gram_det(m_vSCV[i].local_ip()); + } + } + +// compute global gradients + for(size_t i = 0; i < num_scvf(); ++i) + for(size_t sh = 0 ; sh < scvf(i).num_sh(); ++sh) + MatVecMult(m_vSCVF[i].vGlobalGrad[sh], m_vSCVF[i].JtInv, m_vSCVF[i].vLocalGrad[sh]); + + for(size_t i = 0; i < num_scv(); ++i) + for(size_t sh = 0 ; sh < scv(i).num_sh(); ++sh) + MatVecMult(m_vSCV[i].vGlobalGrad[sh], m_vSCV[i].JtInv, m_vSCV[i].vLocalGrad[sh]); + +// Copy ip pos in list for SCVF + for(size_t i = 0; i < num_scvf(); ++i) + m_vGlobSCVF_IP[i] = scvf(i).global_ip(); + + if(ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + for(size_t i = 0; i < num_scv(); ++i) + m_vGlobSCV_IP[i] = scv(i).global_ip(); + +// if no boundary subsets required, return + if(num_boundary_subsets() == 0 || ish == NULL) return; + else update_boundary_faces(pElem, vCornerCoords, ish); +} + +template +void FV1FTGeometry:: +update_boundary_faces(GridObject* elem, const MathVector* vCornerCoords, const ISubsetHandler* ish) +{ + UG_ASSERT(dynamic_cast(elem) != NULL, "Wrong element type."); + TElem* pElem = static_cast(elem); + +// get grid + Grid& grid = *(ish->grid()); + +// vector of subset indices of side + std::vector vSubsetIndex; + +// get subset indices for sides (i.e. edge in 2d, faces in 3d) + if(dim == 1) { + std::vector vVertex; + CollectVertices(vVertex, grid, pElem); + vSubsetIndex.resize(vVertex.size()); + for(size_t i = 0; i < vVertex.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vVertex[i]); + } + if(dim == 2) { + std::vector vEdges; + CollectEdgesSorted(vEdges, grid, pElem); + vSubsetIndex.resize(vEdges.size()); + for(size_t i = 0; i < vEdges.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vEdges[i]); + } + if(dim == 3) { + std::vector vFaces; + CollectFacesSorted(vFaces, grid, pElem); + vSubsetIndex.resize(vFaces.size()); + for(size_t i = 0; i < vFaces.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vFaces[i]); + } + +// loop requested subset + typename std::map >::iterator it; + for (it=m_mapVectorBF.begin() ; it != m_mapVectorBF.end(); ++it) + { + // get subset index + const int bndIndex = (*it).first; + + // get vector of BF for element + std::vector& vBF = (*it).second; + + // clear vector + vBF.clear(); + + // current number of bf + size_t curr_bf = 0; + + // loop sides of element + for(size_t side = 0; side < vSubsetIndex.size(); ++side) + { + // skip non boundary sides + if(vSubsetIndex[side] != bndIndex) continue; + + // number of corners of side + const int coOfSide = m_rRefElem.num(dim-1, side, 0); + + // resize vector + vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + BF& bf = vBF[curr_bf]; + + // set node id == scv this bf belongs to + bf.nodeId = m_rRefElem.id(dim-1, side, 0, co); + + // Compute MidID for BF + ComputeBFMidID(m_rRefElem, side, bf.vMidID, co); + + // copy corners of bf + CopyCornerByMidID(bf.vLocPos, bf.vMidID, m_vvLocMid, BF::numCo); + CopyCornerByMidID(bf.vGloPos, bf.vMidID, m_vvGloMid, BF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, BF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, BF::numCo); + + // normal on scvf + traits::NormalOnBF(bf.Normal, bf.vGloPos, m_vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + m_rTrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + m_rTrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + m_mapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = m_mapping.sqrt_gram_det(bf.localIP); + + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Dim-dependent Finite Volume Geometry +//////////////////////////////////////////////////////////////////////////////// +template +void DimFV1FTGeometry:: +update_local(ReferenceObjectID roid) +{ + m_roid = roid; + +// get reference element + try + { + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + + // set corners of element as local centers of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + m_vvLocMid[0][i] = rRefElem.corner(i); + + // compute local midpoints + ComputeMidPoints, maxMid> + (rRefElem, m_vvLocMid[0], m_vvLocMid); + + // set number of scvf / scv of this roid + if(m_roid != ROID_PYRAMID && m_roid != ROID_OCTAHEDRON) + { + m_numSCV = rRefElem.num(0); + m_numSCVF = rRefElem.num(1); + } + else if(dim == 3 && m_roid == ROID_PYRAMID) + { + UG_WARNING("Pyramid Finite Volume Geometry for 1st order currently " + "implemented in DimFV1Geom EXPERIMENTATLLY. Please contact " + "Martin Stepniewski or Andreas Vogel if you see this message.") + + m_numSCV = 4*rRefElem.num(1); + m_numSCVF = 2*rRefElem.num(1); + } + else if(dim == 3 && m_roid == ROID_OCTAHEDRON) + { + // Case octahedron + m_numSCV = 16; + m_numSCVF = 24; + } + + // set up local informations for SubControlVolumeFaces (scvf) + // each scvf is associated to one edge of the element + for(size_t i = 0; i < num_scvf(); ++i) + { + // this scvf separates the given nodes + if (m_roid != ROID_PYRAMID && m_roid != ROID_OCTAHEDRON) + { + m_vSCVF[i].From = rRefElem.id(1, i, 0, 0); + m_vSCVF[i].To = rRefElem.id(1, i, 0, 1); + } + // special case pyramid (scvf not mappable by edges) + else if (dim == 3 && m_roid == ROID_PYRAMID) + { + // map according to order defined in ComputeSCVFMidID + m_vSCVF[i].From = rRefElem.id(1, i/2, 0, 0); + m_vSCVF[i].To = rRefElem.id(1, i/2, 0, 1); + } + // special case octahedron (scvf not mappable by edges) + else if(dim == 3 && m_roid == ROID_OCTAHEDRON) + { + // map according to order defined in ComputeSCVFMidID + switch(i) + { + case 0: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 2; + break; + case 1: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 1; + break; + + + case 2: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 3; + break; + case 3: m_vSCVF[i].From = 3; + m_vSCVF[i].To = 2; + break; + + + case 4: m_vSCVF[i].From = 3; + m_vSCVF[i].To = 1; + break; + case 5: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 3; + break; + + + case 6: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 5; + break; + case 7: m_vSCVF[i].From = 1; + m_vSCVF[i].To = 0; + break; + + + case 8: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 5; + break; + case 9: m_vSCVF[i].From = 2; + m_vSCVF[i].To = 0; + break; + + + case 10:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 5; + break; + case 11:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 0; + break; + + + case 12:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 3; + break; + case 13:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 1; + break; + + + case 14:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 4; + break; + case 15:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 3; + break; + + + case 16:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 1; + break; + case 17:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 4; + break; + + + case 18:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 5; + break; + case 19:m_vSCVF[i].From = 1; + m_vSCVF[i].To = 0; + break; + + + case 20:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 5; + break; + case 21:m_vSCVF[i].From = 3; + m_vSCVF[i].To = 0; + break; + + + case 22:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 5; + break; + case 23:m_vSCVF[i].From = 4; + m_vSCVF[i].To = 0; + break; + } + } + + + // compute mid ids of the scvf + ComputeSCVFMidID(rRefElem, m_vSCVF[i].vMidID, i); + + // copy local corners of scvf + CopyCornerByMidID(m_vSCVF[i].vLocPos, m_vSCVF[i].vMidID, m_vvLocMid, SCVF::numCo); + + // integration point + AveragePositions(m_vSCVF[i].localIP, m_vSCVF[i].vLocPos, SCVF::numCo); + } + + // set up local informations for SubControlVolumes (scv) + // each scv is associated to one corner of the element + for(size_t i = 0; i < num_scv(); ++i) + { + // store associated node + if (m_roid != ROID_PYRAMID && m_roid != ROID_OCTAHEDRON) + { + m_vSCV[i].nodeId = i; + } + // special case pyramid (scv not mappable by corners) + else if(dim == 3 && m_roid == ROID_PYRAMID) + { + // map according to order defined in ComputeSCVMidID + if(i%2 == 0){ + m_vSCV[i].nodeId = rRefElem.id(1, i/4, 0, 0); // from + } else { + m_vSCV[i].nodeId = rRefElem.id(1, i/4, 0, 1); // to + } + } + // special case octahedron (scvf not mappable by edges) + else if(dim == 3 && m_roid == ROID_OCTAHEDRON) + { + // map according to order defined in ComputeSCVMidID + switch(i) + { + case 0: m_vSCV[i].nodeId = 1; + break; + case 1: m_vSCV[i].nodeId = 1; + break; + + + case 2: m_vSCV[i].nodeId = 2; + break; + case 3: m_vSCV[i].nodeId = 2; + break; + + + case 4: m_vSCV[i].nodeId = 3; + break; + case 5: m_vSCV[i].nodeId = 3; + break; + + + case 6: m_vSCV[i].nodeId = 5; + break; + case 7: m_vSCV[i].nodeId = 0; + break; + + + case 8: m_vSCV[i].nodeId = 1; + break; + case 9: m_vSCV[i].nodeId = 1; + break; + + + case 10:m_vSCV[i].nodeId = 3; + break; + case 11:m_vSCV[i].nodeId = 3; + break; + + + case 12:m_vSCV[i].nodeId = 4; + break; + case 13:m_vSCV[i].nodeId = 4; + break; + + + case 14:m_vSCV[i].nodeId = 5; + break; + case 15:m_vSCV[i].nodeId = 0; + break; + } + } + + // compute mid ids scv + ComputeSCVMidID(rRefElem, m_vSCV[i].vMidID, i); + + // copy local corners of scv + CopyCornerByMidID(m_vSCV[i].vLocPos, m_vSCV[i].vMidID, m_vvLocMid, m_vSCV[i].num_corners()); + } + + ///////////////////////// + // Shapes and Derivatives + ///////////////////////// + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + + m_nsh = TrialSpace.num_sh(); + + for(size_t i = 0; i < num_scvf(); ++i) + { + m_vSCVF[i].numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(m_vSCVF[i].vShape[0]), m_vSCVF[i].localIP); + TrialSpace.grads(&(m_vSCVF[i].vLocalGrad[0]), m_vSCVF[i].localIP); + } + + for(size_t i = 0; i < num_scv(); ++i) + { + m_vSCV[i].numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(m_vSCV[i].vShape[0]), m_vSCV[i].vLocPos[0]); + TrialSpace.grads(&(m_vSCV[i].vLocalGrad[0]), m_vSCV[i].vLocPos[0]); + } + + } + UG_CATCH_THROW("DimFV1FTGeometry: update failed."); + +// copy ip positions in a list for Sub Control Volumes Faces (SCVF) + for(size_t i = 0; i < num_scvf(); ++i) + m_vLocSCVF_IP[i] = scvf(i).local_ip(); + + if(roid == ROID_PYRAMID || roid == ROID_OCTAHEDRON) + for(size_t i = 0; i < num_scv(); ++i) + m_vLocSCV_IP[i] = scv(i).local_ip(); +} + + +/// update data for given element +template +void DimFV1FTGeometry:: +update(GridObject* pElem, const MathVector* vCornerCoords, const ISubsetHandler* ish) +{ + + set_element_modus(false); + + // If already update for this element, do nothing + if(m_pElem == pElem) return; else m_pElem = pElem; + + // FT-1: collect potentially new 'vCornerCoords' and + // set elemMode (INSIDE_DOM/OUTSIDE_DOM/CUT_BY_INTERFACE) + bool do_update_local = m_spInterfaceHandler->update_elem(pElem, vCornerCoords); + + // FT-2: If OUTSIDE_DOM: set num_co = num_ip = 0 and do nothing further + if( m_spInterfaceHandler->elementModus() == OUTSIDE_DOM) + { + if ( dim == 2 ) m_roid = ROID_TRIANGLE; + if ( dim == 3 ) m_roid = ROID_TETRAHEDRON; + + update_local(m_roid); + } + + // FT-3: refresh local data, if different roid given and reset 'm_roid' + // OR if do_update_local = true: for QUADRILATERAL twice, this is necessary. + // because data like 'm_nsh' need to be set to 4, which was set to 3 during 'remap'!! + if (do_update_local || m_roid != m_spInterfaceHandler->roid() ) + { + if( m_spInterfaceHandler->elementModus() != OUTSIDE_DOM ) + { + + m_roid = m_spInterfaceHandler->roid(); + update_local(m_roid); + } + } + + if(m_spInterfaceHandler->elementModus() == CUT_BY_INTERFACE) + set_element_modus(true); + + +/* +// If already update for this element, do nothing + if(m_pElem == pElem) return; else m_pElem = pElem; + +// refresh local data, if different roid given + if(m_roid != pElem->reference_object_id()) // remember new roid and update local data + update_local ((ReferenceObjectID) pElem->reference_object_id()); +*/ +// get reference element + try{ + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + +// remember global position of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + m_vvGloMid[0][i] = m_spInterfaceHandler->corner(i); +// m_vvGloMid[0][i] = vCornerCoords[i]; + + +// compute local midpoints + ComputeMidPoints, maxMid>(rRefElem, m_vvGloMid[0], m_vvGloMid); + +// compute global informations for scvf + for(size_t i = 0; i < num_scvf(); ++i) + { + // copy local corners of scvf + CopyCornerByMidID(m_vSCVF[i].vGloPos, m_vSCVF[i].vMidID, m_vvGloMid, SCVF::numCo); + + // integration point + AveragePositions(m_vSCVF[i].globalIP, m_vSCVF[i].vGloPos, SCVF::numCo); + + // normal on scvf + traits::NormalOnSCVF(m_vSCVF[i].Normal, m_vSCVF[i].vGloPos, m_vvGloMid[0]); + } + +// compute size of scv + for(size_t i = 0; i < num_scv(); ++i) + { + // copy global corners + CopyCornerByMidID(m_vSCV[i].vGloPos, m_vSCV[i].vMidID, m_vvGloMid, m_vSCV[i].num_corners()); + + // compute volume of scv + m_vSCV[i].Vol = ElementSize(m_vSCV[i].vGloPos); + } + +// get reference mapping + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(m_roid); + rMapping.update(m_spInterfaceHandler->corners()); + //rMapping.update(vCornerCoords); + + + //\todo compute with on virt. call +// compute jacobian for linear mapping + if(rMapping.is_linear()) + { + MathMatrix JtInv; + rMapping.jacobian_transposed_inverse(JtInv, m_vSCVF[0].local_ip()); + const number detJ = rMapping.sqrt_gram_det(m_vSCVF[0].local_ip()); + + for(size_t i = 0; i < num_scvf(); ++i) + { + m_vSCVF[i].JtInv = JtInv; + m_vSCVF[i].detj = detJ; + } + + for(size_t i = 0; i < num_scv(); ++i) + { + m_vSCV[i].JtInv = JtInv; + m_vSCV[i].detj = detJ; + } + } +// else compute jacobian for each integration point + else + { + for(size_t i = 0; i < num_scvf(); ++i) + { + rMapping.jacobian_transposed_inverse(m_vSCVF[i].JtInv, m_vSCVF[i].local_ip()); + m_vSCVF[i].detj = rMapping.sqrt_gram_det(m_vSCVF[i].local_ip()); + } + for(size_t i = 0; i < num_scv(); ++i) + { + rMapping.jacobian_transposed_inverse(m_vSCV[i].JtInv, m_vSCV[i].local_ip()); + m_vSCV[i].detj = rMapping.sqrt_gram_det(m_vSCV[i].local_ip()); + } + } + +// compute global gradients + for(size_t i = 0; i < num_scvf(); ++i) + for(size_t sh = 0; sh < scvf(i).num_sh(); ++sh) + MatVecMult(m_vSCVF[i].vGlobalGrad[sh], m_vSCVF[i].JtInv, m_vSCVF[i].vLocalGrad[sh]); + + for(size_t i = 0; i < num_scv(); ++i) + for(size_t sh = 0; sh < scv(i).num_sh(); ++sh) + MatVecMult(m_vSCV[i].vGlobalGrad[sh], m_vSCV[i].JtInv, m_vSCV[i].vLocalGrad[sh]); + +// copy ip points in list (SCVF) + for(size_t i = 0; i < num_scvf(); ++i) + m_vGlobSCVF_IP[i] = scvf(i).global_ip(); + + if(m_roid == ROID_PYRAMID || m_roid == ROID_OCTAHEDRON) + for(size_t i = 0; i < num_scv(); ++i) + m_vGlobSCV_IP[i] = scv(i).global_ip(); + + } + UG_CATCH_THROW("DimFV1FTGeometry: update failed."); + +// compute boundary faces of inner boundary + if(m_spInterfaceHandler->elementModus() == CUT_BY_INTERFACE) + { + update_inner_boundary_faces(); + m_spInterfaceHandler->update_inner_boundary(vCornerCoords); + } + else if(m_spInterfaceHandler->elementModus() == CUT_BY_2_INTERFACE) + { + if ( m_spInterfaceHandler->StdFV_assembling() ) + { + update_inner_boundary_faces(); + m_spInterfaceHandler->update_inner_boundary_for2(); + } + else + { + update_inner_boundary_faces_for2(); + m_spInterfaceHandler->update_inner_boundary_for2(); + } + } + + + +// if no boundary subsets required, return + if(num_boundary_subsets() == 0 || ish == NULL) return; + else update_boundary_faces(pElem, vCornerCoords, ish); +} + + + +// compare implementation of 'DimFV1Geometry::update_boundary_faces()' +template +void DimFV1FTGeometry:: +update_inner_boundary_faces() +{ + ///////////////////////////////////////////////////////////////////////////// + // get general data + ///////////////////////////////////////////////////////////////////////////// + try{ + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(m_roid); + rMapping.update(m_spInterfaceHandler->corners()); + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + + ///////////////////////////////////////////////////////////////////////////// + // collect boudary faces + ///////////////////////////////////////////////////////////////////////////// + + // get number of sides of element + size_t numSides = 0; + numSides = rRefElem.num(dim-1); + + // current number of bf + size_t curr_bf = 0; + + // std::vector& vBF = m_spInterfaceHandler->m_vBF; + std::vector& vBF = m_spInterfaceHandler->get_boundary_faces(); + + vBF.clear(); + + // loop sides of element + for(size_t side = 0; side < numSides; ++side) + { + // side is no boundary face => continue + if( m_spInterfaceHandler->elementModus() == CUT_BY_2_INTERFACE) + { + if ( !m_spInterfaceHandler->is_boundary_face_for2(side) ) + continue; + } + else + { + if ( !m_spInterfaceHandler->is_boundary_face(side) ) + continue; + } + // number of corners of side (special case bottom side pyramid) + const int coOfSide = (m_roid != ROID_PYRAMID || side != 0) + ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; + + // resize vector + vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + BF& bf = vBF[curr_bf]; + + // set node id == scv this bf belongs to + if (m_roid != ROID_PYRAMID || side != 0){ + bf.nodeId = rRefElem.id(dim-1, side, 0, co); + } + else + { + // map according to order defined in ComputeBFMidID + bf.nodeId = rRefElem.id(dim-1, side, 0, (co % 3) + (co>3 ? 1 : 0)); + } + + // Compute MidID for BF + ComputeBFMidID(rRefElem, side, bf.vMidID, co); + + // copy corners of bf + CopyCornerByMidID(bf.vLocPos, bf.vMidID, m_vvLocMid, BF::numCo); + CopyCornerByMidID(bf.vGloPos, bf.vMidID, m_vvGloMid, BF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, BF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, BF::numCo); + + // normal on scvf + traits::NormalOnBF(bf.Normal, bf.vGloPos, m_vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + // compute shapes and grads + bf.numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + // get reference mapping + rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = rMapping.sqrt_gram_det(bf.localIP); + + // compute global gradients + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + + } // end loop of corners of side + + } // end loop sides of element + + } + UG_CATCH_THROW("DimFV1FTGeometry: update_inner_boundary() failed."); + + +} + +// compare implementation of 'DimFV1Geometry::update_boundary_faces()' +template +void DimFV1FTGeometry:: +update_inner_boundary_faces_for2() +{ + for ( size_t i = 0; i < 4; ++i ) + //UG_LOG("m_spInterfaceHandler->quadriCorners()[" << i << "]: " << m_spInterfaceHandler->quadriCorners()[i] << "\n"); + + ///////////////////////////////////////////////////////////////////////////// + // get general data + ///////////////////////////////////////////////////////////////////////////// + try{ + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(ROID_QUADRILATERAL); + + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(ROID_QUADRILATERAL); + rMapping.update(m_spInterfaceHandler->quadriCorners()); + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(ROID_QUADRILATERAL, LFEID(LFEID::LAGRANGE, dim, 1)); + + MathVector buffer_vvLocMid[dim+1][maxMid]; + // set corners of element as local centers of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + { + buffer_vvLocMid[0][i] = rRefElem.corner(i); + UG_LOG("**** buffer_vvLocMid[0][" << i << "]: " << buffer_vvLocMid[0][i] << "\n"); + + } + // compute local midpoints + ComputeMidPoints, maxMid> + (rRefElem, buffer_vvLocMid[0], buffer_vvLocMid); + + MathVector buffer_vvGloMid[dim+1][maxMid]; + // remember global position of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + { + buffer_vvGloMid[0][i] = m_spInterfaceHandler->quadriCorners()[i]; + UG_LOG("**** buffer_vvGloMid[0][" << i << "]: " << buffer_vvGloMid[0][i] << "\n"); + } + // compute local midpoints + ComputeMidPoints, maxMid>(rRefElem, buffer_vvGloMid[0], buffer_vvGloMid); + + + ///////////////////////////////////////////////////////////////////////////// + // collect boudary faces + ///////////////////////////////////////////////////////////////////////////// + + // get number of sides of element + size_t numSides = 0; + numSides = rRefElem.num(dim-1); + + // current number of bf + size_t curr_bf = 0; + + std::vector& vBF = m_spInterfaceHandler->get_boundary_faces(); + + vBF.clear(); + // loop sides of element + for(size_t side = 0; side < numSides; ++side) + { + // side is no boundary face => continue + if ( side == 1 || side == 3 ) + continue; + + // number of corners of side (special case bottom side pyramid) + const int coOfSide = (ROID_QUADRILATERAL != ROID_PYRAMID || side != 0) + ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; + + // resize vector + vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + BF& bf = vBF[curr_bf]; + + // set nodeID to ID of corner within the Triangle used for assembling the fluid node equation: + bf.nodeId = curr_bf; //m_spInterfaceHandler->m_vQuadriOrigID[curr_bf]; //rRefElem.id(dim-1, side, 0, co); + + // Compute MidID for BF + ComputeBFMidID(rRefElem, side, bf.vMidID, co); + + // copy corners of bf + CopyCornerByMidID(bf.vLocPos, bf.vMidID, buffer_vvLocMid, BF::numCo); + CopyCornerByMidID(bf.vGloPos, bf.vMidID, buffer_vvGloMid, BF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, BF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, BF::numCo); + + // normal on scvf + traits::NormalOnBF(bf.Normal, bf.vGloPos, buffer_vvGloMid[0]); + + UG_LOG("BF::numCo " << BF::numCo << "\n"); + UG_LOG("co = " << co << ": bf.vGloPos[0]: " << bf.vGloPos[0] << "\n"); + UG_LOG("co = " << co << ": bf.vGloPos[1]: " << bf.vGloPos[1] << "\n"); + UG_LOG("bf.Normal:" << bf.Normal << "\n"); + UG_LOG("bf.nodeID:" << bf.nodeId << "\n"); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + // compute shapes and grads + bf.numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + // get reference mapping + rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = rMapping.sqrt_gram_det(bf.localIP); + + // compute global gradients + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + + } // end loop of corners of side + + } // end loop sides of element + + } + UG_CATCH_THROW("DimFV1FTGeometry: update_inner_boundary() failed."); + +} + + +template +void DimFV1FTGeometry:: +update_boundary_faces(GridObject* pElem, const MathVector* vCornerCoords, const ISubsetHandler* ish) +{ +// get grid + Grid& grid = *(ish->grid()); + +// vector of subset indices of side + std::vector vSubsetIndex; + +// get subset indices for sides (i.e. edge in 2d, faces in 3d) + if(dim == 1) { + std::vector vVertex; + CollectVertices(vVertex, grid, pElem); + vSubsetIndex.resize(vVertex.size()); + for(size_t i = 0; i < vVertex.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vVertex[i]); + } + if(dim == 2) { + std::vector vEdges; + CollectEdgesSorted(vEdges, grid, pElem); + vSubsetIndex.resize(vEdges.size()); + for(size_t i = 0; i < vEdges.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vEdges[i]); + } + if(dim == 3) { + std::vector vFaces; + CollectFacesSorted(vFaces, grid, pElem); + vSubsetIndex.resize(vFaces.size()); + for(size_t i = 0; i < vFaces.size(); ++i) + vSubsetIndex[i] = ish->get_subset_index(vFaces[i]); + } + + try{ + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(m_roid); + rMapping.update(vCornerCoords); + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + +// loop requested subset + typename std::map >::iterator it; + for (it=m_mapVectorBF.begin() ; it != m_mapVectorBF.end(); ++it) + { + // get subset index + const int bndIndex = (*it).first; + + // get vector of BF for element + std::vector& vBF = (*it).second; + + // clear vector + vBF.clear(); + + // current number of bf + size_t curr_bf = 0; + + // loop sides of element + for(size_t side = 0; side < vSubsetIndex.size(); ++side) + { + // skip non boundary sides + if(vSubsetIndex[side] != bndIndex) continue; + + // number of corners of side + const int coOfSide = rRefElem.num(dim-1, side, 0); + + // resize vector + vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + BF& bf = vBF[curr_bf]; + + // set node id == scv this bf belongs to + bf.nodeId = rRefElem.id(dim-1, side, 0, co); + + // Compute MidID for BF + ComputeBFMidID(rRefElem, side, bf.vMidID, co); + + // copy corners of bf + CopyCornerByMidID(bf.vLocPos, bf.vMidID, m_vvLocMid, BF::numCo); + CopyCornerByMidID(bf.vGloPos, bf.vMidID, m_vvGloMid, BF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, BF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, BF::numCo); + + // normal on scvf + traits::NormalOnBF(bf.Normal, bf.vGloPos, m_vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + // compute shapes and grads + bf.numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + // get reference mapping + rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = rMapping.sqrt_gram_det(bf.localIP); + + // compute global gradients + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + } + } + } + + } + UG_CATCH_THROW("DimFV1FTGeometry: update failed."); +} + +////////////////////// +// FV1FTGeometry + +template class FV1FTGeometry; +template class FV1FTGeometry; +template class FV1FTGeometry; + +template class FV1FTGeometry; +template class FV1FTGeometry; + +template class FV1FTGeometry; +template class FV1FTGeometry; + +template class FV1FTGeometry; +template class FV1FTGeometry; +template class FV1FTGeometry; +template class FV1FTGeometry; +template class FV1FTGeometry; + +////////////////////// +// DimFV1FTGeometry +template class DimFV1FTGeometry<1, 1, InterfaceHandlerLocalParticle<1> >; + +template class DimFV1FTGeometry<2, 2, InterfaceHandlerLocalParticle<2> >; + +template class DimFV1FTGeometry<3, 3, InterfaceHandlerLocalParticle<3> >; + + +} // end namespace ug + +#endif /* __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1FT_GEOMETRY_IMPL_ */ diff --git a/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.h b/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.h new file mode 100644 index 000000000..8b577da48 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.h @@ -0,0 +1,1228 @@ +/* + * Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt + * Author: Andreas Vogel + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1FT_GEOMETRY__ +#define __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1FT_GEOMETRY__ + +// extern libraries +#include +#include +#include + +// other ug4 modules +#include "common/common.h" + +// library intern includes +#include "lib_grid/tools/subset_handler_interface.h" +#include "lib_disc/reference_element/reference_element.h" +#include "lib_disc/reference_element/reference_element_traits.h" +#include "lib_disc/reference_element/reference_mapping.h" +#include "lib_disc/reference_element/reference_mapping_provider.h" +#include "lib_disc/local_finite_element/local_finite_element_provider.h" +#include "lib_disc/local_finite_element/lagrange/lagrangep1.h" +#include "lib_disc/quadrature/gauss/gauss_quad.h" +#include "fv_util.h" +#include "fv_geom_base.h" + +#include "lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h" + +namespace ug{ + +//template +//class InterfaceHandlerLocalParticle; + +//////////////////////////////////////////////////////////////////////////////// +// FV1FT Geometry for Reference Element Type +//////////////////////////////////////////////////////////////////////////////// + +/// Geometry and shape functions for 1st order Vertex-Centered Finite Volume +/** + * \tparam TElem Element type + * \tparam TWorldDim (physical) world dimension + */ +template < typename TElem, int TWorldDim> +class FV1FTGeometry : public FVGeometryBase +{ + public: + /// type of element + typedef TElem elem_type; + + /// type of reference element + typedef typename reference_element_traits::reference_element_type ref_elem_type; + + /// used traits + typedef fv1_traits traits; + + public: + /// dimension of reference element + static const int dim = ref_elem_type::dim; + + /// dimension of world + static const int worldDim = TWorldDim; + + /// Hanging node flag: this Geometry does not support hanging nodes + static const bool usesHangingNodes = false; + + /// flag indicating if local data may change + static const bool staticLocalData = true; + + public: + /// order + static const int order = 1; + + /// number of SubControlVolumes + static const size_t numSCV = (ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + ? ((ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID) ? (4*ref_elem_type::numEdges) : 16) : ref_elem_type::numCorners; + + /// type of SubControlVolume + typedef typename traits::scv_type scv_type; + + /// number of SubControlVolumeFaces + static const size_t numSCVF = (ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + ? ((ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID) ? (2*ref_elem_type::numEdges) : 24) : ref_elem_type::numEdges; + + /// type of Shape function used + typedef LagrangeP1 local_shape_fct_set_type; + + /// number of shape functions + static const size_t nsh = local_shape_fct_set_type::nsh; + + /// number of integration points + static const size_t nip = 1; + + public: + /// Sub-Control Volume Face structure + /** + * Each finite element is cut by several sub-control volume faces. The idea + * is that the "dual" skeleton formed by the sub control volume faces of + * all elements again gives rise to a regular mesh with closed + * (lipschitz-bounded) control volumes. The SCVF are the boundary of the + * control volume. In computation the flux over each SCVF must be the same + * in both directions over the face in order to guarantee the conservation + * property. + */ + class SCVF + { + public: + /// Number of corners of scvf + static const size_t numCo = traits::NumCornersOfSCVF; + + public: + SCVF() {} + + /// index of SubControlVolume on one side of the scvf + inline size_t from() const {return From;} + + /// index of SubControlVolume on one side of the scvf + inline size_t to() const {return To;} + + /// normal on scvf (points direction "from"->"to"). Norm is equal to area + inline const MathVector& normal() const {return Normal;} + + /// number of integration points on scvf + inline size_t num_ip() const {return nip;} + + /// local integration point of scvf + inline const MathVector& local_ip() const {return localIP;} + + /// global integration point of scvf + inline const MathVector& global_ip() const {return globalIP;} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return nsh;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const {return vShape[sh];} + + /// vector of shape functions in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + private: + // let outer class access private members + friend class FV1FTGeometry; + + // This scvf separates the scv with the ids given in "from" and "to" + // The computed normal points in direction from->to + size_t From, To; + + // The normal on the SCVF pointing (from -> to) + MathVector Normal; // normal (incl. area) + + // ordering is: + // 1D: edgeMidPoint + // 2D: edgeMidPoint, CenterOfElement + // 3D: edgeMidPoint, Side one, CenterOfElement, Side two + MathVector vLocPos[numCo]; // local corners of scvf + MathVector vGloPos[numCo]; // global corners of scvf + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the scvf + + // scvf part + MathVector localIP; // local integration point + MathVector globalIP; // global integration point + + // shapes and derivatives + number vShape[nsh]; // shapes at ip + MathVector vLocalGrad[nsh]; // local grad at ip + MathVector vGlobalGrad[nsh]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + /// sub control volume structure + class SCV + { + public: + /// Number of corners of scvf + static const size_t numCo = traits::NumCornersOfSCV; + + public: + SCV() {}; + + /// volume of scv + inline number volume() const {return Vol;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + /// return local corners + inline const MathVector* local_corners() const + {return &vLocPos[0];} + + /// return global corners + inline const MathVector* global_corners() const + {return &vGloPos[0];} + + /// node id that this scv is associated to + inline size_t node_id() const {return nodeId;} + + /// number of integration points + inline size_t num_ip() const {return nip;} + + /// local integration point of scv + inline const MathVector& local_ip() const {return vLocPos[0];} + + /// global integration point + inline const MathVector& global_ip() const {return vGloPos[0];} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return nsh;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const {return vShape[sh];} + + /// vector of shape functions in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + private: + // let outer class access private members + friend class FV1FTGeometry; + + // node id of associated node + size_t nodeId; + + // volume of scv + number Vol; + + // local and global positions of this element + MathVector vLocPos[numCo]; // local position of node + MathVector vGloPos[numCo]; // global position of node + MidID midId[numCo]; // dimension and id of object, that's midpoint bounds the scv + + // shapes and derivatives + number vShape[nsh]; // shapes at ip + MathVector vLocalGrad[nsh]; // local grad at ip + MathVector vGlobalGrad[nsh]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + /// boundary face + class BF + { + public: + /// Number of corners of bf + static const size_t numCo = traits::NumCornersOfBF; + + public: + BF() {} + + /// index of SubControlVolume of the bf + inline size_t node_id() const {return nodeId;} + + /// number of integration points on bf + inline size_t num_ip() const {return nip;} + + /// local integration point of bf + inline const MathVector& local_ip() const {return localIP;} + + /// global integration point of bf + inline const MathVector& global_ip() const {return globalIP;} + + /// outer normal on bf. Norm is equal to area + inline const MathVector& normal() const {return Normal;} // includes area + + /// volume of bf + inline number volume() const {return Vol;} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return nsh;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vShape[sh];} + + /// vector of local gradients in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + private: + /// let outer class access private members + friend class FV1FTGeometry; + + // id of scv this bf belongs to + size_t nodeId; + + // ordering is: + // 1D: edgeMidPoint + // 2D: edgeMidPoint, CenterOfElement + // 3D: edgeMidPoint, Side one, CenterOfElement, Side two + MathVector vLocPos[numCo]; // local corners of bf + MathVector vGloPos[numCo]; // global corners of bf + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the bf + + // scvf part + MathVector localIP; // local integration point + MathVector globalIP; // global integration point + MathVector Normal; // normal (incl. area) + number Vol; // volume of bf + + // shapes and derivatives + number vShape[nsh]; // shapes at ip + MathVector vLocalGrad[nsh]; // local grad at ip + MathVector vGlobalGrad[nsh]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + public: + /// construct object and initialize local values and sizes + FV1FTGeometry(); + + /// update local data + void update_local_data(); + + /// update data for given element + void update(GridObject* elem, const MathVector* vCornerCoords, + const ISubsetHandler* ish = NULL); + + /// update boundary data for given element + void update_boundary_faces(GridObject* elem, + const MathVector* vCornerCoords, + const ISubsetHandler* ish = NULL); + + /// get the element + TElem* elem() const {return m_pElem;} + + /// get vector of the global coordinates of corners for current element + const MathVector* corners() const {return m_vvGloMid[0];} + + /// number of SubControlVolumeFaces + size_t num_scvf() const {return numSCVF;}; + + /// const access to SubControlVolumeFace number i + const SCVF& scvf(size_t i) const + {UG_ASSERT(i < num_scvf(), "Invalid Index."); return m_vSCVF[i];} + + /// number of SubControlVolumes + // do not use this method to obtain the number of shape functions, + // since this is NOT the same for pyramids; use num_sh() instead. + size_t num_scv() const {return numSCV;} + + /// const access to SubControlVolume number i + const SCV& scv(size_t i) const + {UG_ASSERT(i < num_scv(), "Invalid Index."); return m_vSCV[i];} + + /// number of shape functions + size_t num_sh() const {return nsh;}; + + /// returns reference object id + ReferenceObjectID roid() const {return ref_elem_type::REFERENCE_OBJECT_ID;} + + + public: + /// returns number of all scvf ips + size_t num_scvf_ips() const {return numSCVF;} + + /// returns all ips of scvf as they appear in scv loop + const MathVector* scvf_local_ips() const {return m_vLocSCVF_IP;} + + /// returns all ips of scvf as they appear in scv loop + const MathVector* scvf_global_ips() const {return m_vGlobSCVF_IP;} + + /// returns number of all scv ips + size_t num_scv_ips() const {return numSCV;} + + /// returns all ips of scv as they appear in scv loop + const MathVector* scv_local_ips() const { + if(ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + return &(m_vLocSCV_IP[0]); + else + return &(m_vvLocMid[0][0]); + } + + /// returns all ips of scv as they appear in scv loop + const MathVector* scv_global_ips() const { + if(ref_elem_type::REFERENCE_OBJECT_ID == ROID_PYRAMID || ref_elem_type::REFERENCE_OBJECT_ID == ROID_OCTAHEDRON) + return &(m_vGlobSCV_IP[0]); + else + return &(m_vvGloMid[0][0]); + } + + /// return local coords for node ID + const MathVector& local_node_position(size_t nodeID) const + { + UG_ASSERT(nodeID < (size_t) ref_elem_type::numCorners, "Invalid node id."); + return m_vvLocMid[0][nodeID]; + } + + /// return global coords for node ID + const MathVector& global_node_position(size_t nodeID) const + { + UG_ASSERT(nodeID < (size_t) ref_elem_type::numCorners, "Invalid node id."); + return m_vvGloMid[0][nodeID]; + } + + /// returns the local coordinates of the center of mass of the element + const MathVector* coe_local() const {return &(m_vvLocMid[dim][0]);} + + /// returns the global coordinates of the center of mass of the element + const MathVector* coe_global() const {return &(m_vvGloMid[dim][0]);} + + protected: + // global and local ips on SCVF + MathVector m_vGlobSCVF_IP[numSCVF]; + MathVector m_vLocSCVF_IP[numSCVF]; + + // global and local ips on SCV (only needed for Pyramid and Octahedron) + MathVector m_vGlobSCV_IP[numSCV]; + MathVector m_vLocSCV_IP[numSCV]; + + public: + /// add subset that is interpreted as boundary subset. + inline void add_boundary_subset(int subsetIndex) {m_mapVectorBF[subsetIndex];} + + /// removes subset that is interpreted as boundary subset. + inline void remove_boundary_subset(int subsetIndex) {m_mapVectorBF.erase(subsetIndex);} + + /// reset all boundary subsets + inline void clear_boundary_subsets() {m_mapVectorBF.clear();} + + /// number of registered boundary subsets + inline size_t num_boundary_subsets() {return m_mapVectorBF.size();} + + /// number of all boundary faces + inline size_t num_bf() const + { + typename std::map >::const_iterator it; + size_t num = 0; + for ( it=m_mapVectorBF.begin() ; it != m_mapVectorBF.end(); it++ ) + num += (*it).second.size(); + return num; + } + + /// number of boundary faces on subset 'subsetIndex' + inline size_t num_bf(int si) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) return 0; + else return (*it).second.size(); + } + + /// returns the boundary face i for subsetIndex + inline const BF& bf(int si, size_t i) const + { + UG_ASSERT(i < num_bf(si), "Invalid index."); + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) UG_THROW("FVGeom: No bnd face for subset"<& bf(int si) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) return m_vEmptyVectorBF; + return (*it).second; + } + + void reset_curr_elem() {m_pElem = NULL;} + + protected: + std::map > m_mapVectorBF; + std::vector m_vEmptyVectorBF; + + private: + /// pointer to current element + TElem* m_pElem; + + /// max number of geom objects in all dimensions + // (most objects in 1 dim, i.e. number of edges, but +1 for 1D) + static const int maxMid = numSCVF + 1; + + /// local and global geom object midpoints for each dimension + MathVector m_vvLocMid[dim+1][maxMid]; + MathVector m_vvGloMid[dim+1][maxMid]; + + /// SubControlVolumeFaces + SCVF m_vSCVF[numSCVF]; + + /// SubControlVolumes + SCV m_vSCV[numSCV]; + + /// Reference Mapping + ReferenceMapping m_mapping; + + /// Reference Element + const ref_elem_type& m_rRefElem; + + /// Shape function set + const local_shape_fct_set_type& m_rTrialSpace; +}; + +//////////////////////////////////////////////////////////////////////////////// +// Dim-dependent Finite Volume Geometry +//////////////////////////////////////////////////////////////////////////////// + +/// Geometry and shape functions for 1st order Vertex-Centered Finite Volume +/** + * \tparam TDim reference element dim + * \tparam TWorldDim (physical) world dimension + */ +template > +class DimFV1FTGeometry : public FVGeometryBase +{ + public: + /// used traits + typedef fv1_dim_traits traits; + + public: + /// dimension of reference element + static const int dim = TDim; + + /// dimension of world + static const int worldDim = TWorldDim; + + /// Hanging node flag: this Geometry does not support hanging nodes + static const bool usesHangingNodes = false; + + /// flag indicating if local data may change + static const bool staticLocalData = false; + + public: + /// order + static const int order = 1; + + /// number of SubControlVolumes + static const size_t maxNumSCV = traits::maxNumSCV; + + /// type of SubControlVolume + typedef typename traits::scv_type scv_type; + + /// max number of SubControlVolumeFaces + static const size_t maxNumSCVF = traits::maxNumSCVF; + + /// max number of shape functions + static const size_t maxNSH = traits::maxNSH; + + /// number of integration points + static const size_t nip = 1; + + public: + /// Sub-Control Volume Face structure + /** + * Each finite element is cut by several sub-control volume faces. The idea + * is that the "dual" skeleton formed by the sub control volume faces of + * all elements again gives rise to a regular mesh with closed + * (lipschitz-bounded) control volumes. The SCVF are the boundary of the + * control volume. In computation the flux over each SCVF must be the same + * in both directions over the face in order to guarantee the conservation + * property. + */ + class SCVF + { + public: + /// Number of corners of scvf + static const size_t numCo = traits::NumCornersOfSCVF; + + public: + SCVF() {} + + /// index of SubControlVolume on one side of the scvf + inline size_t from() const {return From;} + + /// index of SubControlVolume on one side of the scvf + inline size_t to() const {return To;} + + /// number of integration points on scvf + inline size_t num_ip() const {return nip;} + + /// local integration point of scvf + inline const MathVector& local_ip() const {return localIP;} + + /// global integration point of scvf + inline const MathVector& global_ip() const {return globalIP;} + + /// normal on scvf (points direction "from"->"to"). Norm is equal to area + inline const MathVector& normal() const {return Normal;} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return numSH;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const {return vShape[sh];} + + /// vector of shape functions in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of gloabl gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return glbal corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + private: + // let outer class access private members + friend class DimFV1FTGeometry; + + // This scvf separates the scv with the ids given in "from" and "to" + // The computed normal points in direction from->to + size_t From, To; + + // The normal on the SCVF pointing (from -> to) + MathVector Normal; // normal (incl. area) + + // ordering is: + // 1D: edgeMidPoint + // 2D: edgeMidPoint, CenterOfElement + // 3D: edgeMidPoint, Side one, CenterOfElement, Side two + MathVector vLocPos[numCo]; // local corners of scvf + MathVector vGloPos[numCo]; // global corners of scvf + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the scvf + + // scvf part + MathVector localIP; // local integration point + MathVector globalIP; // global integration point + + // shapes and derivatives + size_t numSH; + number vShape[maxNSH]; // shapes at ip + MathVector vLocalGrad[maxNSH]; // local grad at ip + MathVector vGlobalGrad[maxNSH]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + /// sub control volume structure + class SCV + { + public: + /// Number of corners of scv + static const size_t numCo = traits::NumCornersOfSCV; + + public: + SCV() {}; + + /// volume of scv + inline number volume() const {return Vol;} + + inline number get_volume(size_t ip) const + { + if ( volIP[0] == 0.0 && volIP[1] != 0.0 ) + UG_THROW("1: error in volIP!\n"); + if ( volIP[0] != 0.0 && volIP[1] == 0.0 ) + UG_THROW("2: error in volIP!\n"); + + if ( volIP[0] == 0.0 && volIP[1] == 0.0 ) + return Vol; + + return volIP[ip]; + } + + /// number of corners, that bound the scv + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + /// node id that this scv is associated to + inline size_t node_id() const {return nodeId;} + + /// number of integration points + inline size_t num_ip() const {return nip;} + + /// local integration point of scv + inline const MathVector& local_ip() const {return vLocPos[0];} + + /// global integration point + inline const MathVector& global_ip() const {return vGloPos[0];} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return numSH;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const {return vShape[sh];} + + /// vector of shape functions in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + private: + // let outer class access private members + friend class DimFV1FTGeometry; + + // node id of associated node + size_t nodeId; + + // volume of scv + number Vol; + number volIP[2]; + + // local and global positions of this element + MathVector vLocPos[numCo]; // local position of node + MathVector vGloPos[numCo]; // global position of node + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the scv + + // shapes and derivatives + size_t numSH; + number vShape[maxNSH]; // shapes at ip + MathVector vLocalGrad[maxNSH]; // local grad at ip + MathVector vGlobalGrad[maxNSH]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + /// boundary face + class BF + { + public: + /// Number of corners of bf + static const size_t numCo = traits::NumCornersOfSCVF; + + public: + BF() {} + + /// index of SubControlVolume of the bf + inline size_t node_id() const {return nodeId;} + + /// number of integration points on bf + inline size_t num_ip() const {return nip;} + + /// local integration point of bf + inline const MathVector& local_ip() const {return localIP;} + + /// global integration point of bf + inline const MathVector& global_ip() const {return globalIP;} + + /// outer normal on bf. Norm is equal to area + inline const MathVector& normal() const {return Normal;} // includes area + + /// volume of bf + inline number volume() const {return Vol;} + + /// Transposed Inverse of Jacobian in integration point + inline const MathMatrix& JTInv() const {return JtInv;} + + /// Determinant of Jacobian in integration point + inline number detJ() const {return detj;} + + /// number of shape functions + inline size_t num_sh() const {return numSH;} + + /// value of shape function i in integration point + inline number shape(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vShape[sh];} + + /// vector of local gradients in ip point + inline const number* shape_vector() const {return vShape;} + + /// value of local gradient of shape function i in integration point + inline const MathVector& local_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vLocalGrad[sh];} + + /// vector of local gradients in ip point + inline const MathVector* local_grad_vector() const {return vLocalGrad;} + + /// value of global gradient of shape function i in integration point + inline const MathVector& global_grad(size_t sh) const + {UG_ASSERT(sh < num_sh(), "Invalid index"); return vGlobalGrad[sh];} + + /// vector of global gradients in ip point + inline const MathVector* global_grad_vector() const {return vGlobalGrad;} + + /// number of corners, that bound the scvf + inline size_t num_corners() const {return numCo;} + + /// return local corner number i + inline const MathVector& local_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vLocPos[co];} + + /// return global corner number i + inline const MathVector& global_corner(size_t co) const + {UG_ASSERT(co < num_corners(), "Invalid index."); return vGloPos[co];} + + private: + /// let outer class access private members + friend class DimFV1FTGeometry; + + // id of scv this bf belongs to + size_t nodeId; + + // ordering is: + // 1D: edgeMidPoint + // 2D: edgeMidPoint, CenterOfElement + // 3D: edgeMidPoint, Side one, CenterOfElement, Side two + MathVector vLocPos[numCo]; // local corners of bf + MathVector vGloPos[numCo]; // global corners of bf + MidID vMidID[numCo]; // dimension and id of object, that's midpoint bounds the bf + + // scvf part + MathVector localIP; // local integration point + MathVector globalIP; // global integration point + MathVector Normal; // normal (incl. area) + number Vol; // volume of bf + + // shapes and derivatives + size_t numSH; + number vShape[maxNSH]; // shapes at ip + MathVector vLocalGrad[maxNSH]; // local grad at ip + MathVector vGlobalGrad[maxNSH]; // global grad at ip + MathMatrix JtInv; // Jacobian transposed at ip + number detj; // Jacobian det at ip + }; + + public: + /// construct object and initialize local values and sizes + DimFV1FTGeometry() : m_pElem(NULL), m_roid(ROID_UNKNOWN) {}; + + ////////////////////////////////////////////////////////////////////////////// + /// new FT-methods + ////////////////////////////////////////////////////////////////////////////// + + inline const size_t get_original_node(size_t i) const {return m_spInterfaceHandler->corner_orig(i);} + inline const size_t get_interface_id(size_t i) + { + std::vector interfaceIDs = m_spInterfaceHandler->interface_id_all(); + return get_original_node(interfaceIDs[i]); + } + bool lies_onInterface(const size_t newID) + { return m_spInterfaceHandler->lies_onInterface(newID); } + + + inline void set_element_modus(bool boolian) { mElemModus = boolian;} + inline const bool get_element_modus() { return mElemModus;} + inline const ReferenceObjectID get_roid() const {return m_roid;} + + /// called during 'ParticleBndCond::add_def_M_local()': + const number volume_fem_elem() const {UG_THROW("FV1FTGeom::volume_fem_elem() not implemented!\n");} + const number volume_FT_elem() const {UG_THROW("FV1FTGeom::volume_FT_elem() not implemented!\n");} + + number get_volume(size_t ip) const { return m_vVol_IP[ip]; } + + bool mElemModus; + + /// set the local interface handler + /// (called during constructor of class 'MovingInterface') + void set_interface_handler(SmartPtr localHandler) + { m_spInterfaceHandler = localHandler; } + + ////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// + + + /// update data for given element + void update(GridObject* elem, const MathVector* vCornerCoords, + const ISubsetHandler* ish = NULL); + + /// update boundary data for given element + void update_boundary_faces(GridObject* elem, + const MathVector* vCornerCoords, + const ISubsetHandler* ish = NULL); + + /// get the element + GridObject* elem() const {return m_pElem;} + + /// get vector of corners for current element + const MathVector* corners() const {return m_vvGloMid[0];} + + /// number of SubControlVolumeFaces + size_t num_scvf() const {return m_numSCVF;}; + + /// const access to SubControlVolumeFace number i + const SCVF& scvf(size_t i) const + {UG_ASSERT(i < num_scvf(), "Invalid Index."); return m_vSCVF[i];} + + /// number of SubControlVolumes + // do not use this method to obtain the number of shape functions, + // since this is NOT the same for pyramids; use num_sh() instead. + size_t num_scv() const {return m_numSCV;} + + /// const access to SubControlVolume number i + const SCV& scv(size_t i) const + {UG_ASSERT(i < num_scv(), "Invalid Index."); return m_vSCV[i];} + + /// number of shape functions + size_t num_sh() const {return m_nsh;}; + + public: + /// returns number of all scvf ips + size_t num_scvf_ips() const {return m_numSCVF;} + + /// returns all ips of scvf as they appear in scv loop + const MathVector* scvf_local_ips() const {return m_vLocSCVF_IP;} + + /// returns all ips of scvf as they appear in scv loop + const MathVector* scvf_global_ips() const {return m_vGlobSCVF_IP;} + + /// returns number of all scv ips + size_t num_scv_ips() const {return m_numSCV;} + + /// returns all ips of scv as they appear in scv loop + const MathVector* scv_local_ips() const { + if(m_roid == ROID_PYRAMID || m_roid == ROID_OCTAHEDRON) + return &(m_vLocSCV_IP[0]); + else + return &(m_vvLocMid[0][0]); + } + + /// returns all ips of scv as they appear in scv loop + const MathVector* scv_global_ips() const { + if(m_roid == ROID_PYRAMID || m_roid == ROID_OCTAHEDRON) + return &(m_vGlobSCV_IP[0]); + else + return &(m_vvGloMid[0][0]); + } + + /// returns the local coordinates of the center of mass of the element + const MathVector* coe_local() const {return &(m_vvLocMid[dim][0]);} + + /// returns the global coordinates of the center of mass of the element + const MathVector* coe_global() const {return &(m_vvGloMid[dim][0]);} + + /// returns reference object id + ReferenceObjectID roid() const {return m_roid;} + + /// update local data + void update_local(ReferenceObjectID roid); + + ////////////////////////////////////////////////////////////////////////////// + /// new FT-methods + ////////////////////////////////////////////////////////////////////////////// + + /// update boundary faces on interface; call during update() + void update_inner_boundary_faces(); + void update_inner_boundary_faces_for2(); + + /// if OUTSIDE_DOM within update() + void set_local_data_to_zero(){ m_numSCVF = m_numSCV = m_nsh = 0;} + +/* ToDo + /// final computations within update() + void remap_shapes_and_derivatives(ReferenceObjectID roid); + + /// computations for remapping SCVF + void copy_SCVF(SCVF vSCVF[maxNumSCVF]); + void remap_add_SCVF(SCVF vSCVF[maxNumSCVF], size_t numSH); + + /// computations for remapping SCV + void copy_SCV(SCV vSCV[maxNumSCV]); + void remap_add_SCV(SCV vSCV[maxNumSCV], size_t numSH); + + /// computations for remapping m_spInterfaceHandler.m_vBF + void copy_BF(BF vBF[maxNumSCV] ); + void remap_BF(BF vBF[maxNumSCV], size_t numSH); + +*/ + + ////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// + + + protected: + // global and local ips on SCVF + MathVector m_vGlobSCVF_IP[maxNumSCVF]; + MathVector m_vLocSCVF_IP[maxNumSCVF]; + + // global and local ips on SCV (only needed for Pyramid and Octahedron) + MathVector m_vGlobSCV_IP[maxNumSCV]; + MathVector m_vLocSCV_IP[maxNumSCV]; + + number m_vVol_IP[2]; + + public: + /// add subset that is interpreted as boundary subset. + inline void add_boundary_subset(int subsetIndex) {m_mapVectorBF[subsetIndex];} + + /// removes subset that is interpreted as boundary subset. + inline void remove_boundary_subset(int subsetIndex) {m_mapVectorBF.erase(subsetIndex);} + + /// reset all boundary subsets + inline void clear_boundary_subsets() {m_mapVectorBF.clear();} + + /// number of registered boundary subsets + inline size_t num_boundary_subsets() {return m_mapVectorBF.size();} + + /// number of all boundary faces + inline size_t num_bf() const + { + typename std::map >::const_iterator it; + size_t num = 0; + for ( it=m_mapVectorBF.begin() ; it != m_mapVectorBF.end(); it++ ) + num += (*it).second.size(); + return num; + } + + /// number of boundary faces on subset 'subsetIndex' + inline size_t num_bf(int si) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) return 0; + else return (*it).second.size(); + } + + /// returns the boundary face i for subsetIndex + inline const BF& bf(int si, size_t i) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) UG_THROW("DimFV1FTGeom: No BndSubset "<& bf(int si) const + { + typename std::map >::const_iterator it; + it = m_mapVectorBF.find(si); + if(it == m_mapVectorBF.end()) return m_vEmptyVectorBF; + return (*it).second; + } + + protected: + std::map > m_mapVectorBF; + std::vector m_vEmptyVectorBF; + + private: + /// pointer to current element + GridObject* m_pElem; + + /// current reference object id + ReferenceObjectID m_roid; + + /// current number of scv + size_t m_numSCV; + + /// current number of scvf + size_t m_numSCVF; + + /// current number of shape functions + size_t m_nsh; + + /// max number of geometric objects in a dimension + // (most objects in 1 dim, i.e. number of edges, but +1 for 1D) + static const int maxMid = maxNumSCVF + 1; + + /// local and global geom object midpoints for each dimension + MathVector m_vvLocMid[dim+1][maxMid]; + MathVector m_vvGloMid[dim+1][maxMid]; + + /// SubControlVolumeFaces + SCVF m_vSCVF[maxNumSCVF]; + + /// SubControlVolumes + SCV m_vSCV[maxNumSCV]; + + //////////////////////////////////////////////////////////////////////////////// + // FV1FT data + //////////////////////////////////////////////////////////////////////////////// + + // InterfaceHandlerLocalParticle: derived from class 'IInterfaceHandlerLocal' + SmartPtr m_spInterfaceHandler; + + bool m_bIsFlatTopElement; + +}; + +} + +#endif /* __H__UG__LIB_DISC__SPATIAL_DISC__DISC_HELPER__FV1FT_GEOMETRY__ */ diff --git a/ugbase/lib_disc/spatial_disc/domain_disc_impl.h b/ugbase/lib_disc/spatial_disc/domain_disc_impl.h index c8ef646d5..62dabcece 100644 --- a/ugbase/lib_disc/spatial_disc/domain_disc_impl.h +++ b/ugbase/lib_disc/spatial_disc/domain_disc_impl.h @@ -482,6 +482,10 @@ assemble_jacobian(matrix_type& J, pModifyMemory = u.clone(); pModifyU = pModifyMemory.get(); try{ + m_spAssTuner->modify_GlobalSol(*pModifyMemory, u, dd); + } UG_CATCH_THROW("Cannot modify local solution."); + + try{ for(int type = 1; type < CT_ALL; type = type << 1){ if(!(m_spAssTuner->constraint_type_enabled(type))) continue; for(size_t i = 0; i < m_vConstraint.size(); ++i) @@ -655,6 +659,10 @@ assemble_defect(vector_type& d, pModifyMemory = u.clone(); pModifyU = pModifyMemory.get(); try{ + m_spAssTuner->modify_GlobalSol(*pModifyMemory, u, dd); + } UG_CATCH_THROW("Cannot modify local solution."); + + try{ for(int type = 1; type < CT_ALL; type = type << 1){ if(!(m_spAssTuner->constraint_type_enabled(type))) continue; for(size_t i = 0; i < m_vConstraint.size(); ++i) @@ -1377,6 +1385,10 @@ assemble_jacobian(matrix_type& J, if( m_spAssTuner->modify_solution_enabled() ){ pModifyMemory = vSol->clone(); pModifyU = pModifyMemory; + try{ + m_spAssTuner->modify_GlobalSol(pModifyMemory, vSol, dd); + } UG_CATCH_THROW("Cannot modify local solution."); + try{ for(int type = 1; type < CT_ALL; type = type << 1){ if(!(m_spAssTuner->constraint_type_enabled(type))) continue; @@ -1553,6 +1565,10 @@ assemble_defect(vector_type& d, pModifyMemory = vSol->clone(); pModifyU = pModifyMemory; try{ + m_spAssTuner->modify_GlobalSol(pModifyMemory, vSol, dd); + } UG_CATCH_THROW("Cannot modify local solution."); + + try{ for(int type = 1; type < CT_ALL; type = type << 1){ if(!(m_spAssTuner->constraint_type_enabled(type))) continue; for(size_t i = 0; i < m_vConstraint.size(); ++i) diff --git a/ugbase/lib_disc/spatial_disc/elem_disc/elem_disc_assemble_util.h b/ugbase/lib_disc/spatial_disc/elem_disc/elem_disc_assemble_util.h index f565bbaa4..8c3a33a78 100644 --- a/ugbase/lib_disc/spatial_disc/elem_disc/elem_disc_assemble_util.h +++ b/ugbase/lib_disc/spatial_disc/elem_disc/elem_disc_assemble_util.h @@ -384,6 +384,14 @@ class StdGlobAssembler } UG_CATCH_THROW("(stationary) AssembleJacobian: Cannot prepare element."); + // modifies size of local data (locally) if needed + if( spAssTuner->modify_solution_enabled() ) + { + try{ + spAssTuner->modify_LocalData(locJ, locU, dd); + } UG_CATCH_THROW("Cannot modify local solution."); + } + // reset local algebra locJ = 0.0; @@ -401,6 +409,9 @@ class StdGlobAssembler UG_CATCH_THROW("(stationary) AssembleJacobian: Cannot add local matrix."); } + // ToDO: Only for diffusion, iff INSIDE circle-computation only! ==> all other DoFs set to Dirichlet! + // spAssTuner->adjust_mat_global(J, locJ, dd); + // finish element loop try { @@ -511,6 +522,14 @@ class StdGlobAssembler } UG_CATCH_THROW("(instationary) AssembleJacobian: Cannot prepare element."); + // modifies size of local data (locally) if needed + if( spAssTuner->modify_solution_enabled() ) + { + try{ + spAssTuner->modify_LocalData(locTimeSeries, locJ, locU, dd); + } UG_CATCH_THROW("Cannot modify local solution."); + } + // reset local algebra locJ = 0.0; @@ -635,13 +654,12 @@ class StdGlobAssembler } UG_CATCH_THROW("(stationary) AssembleDefect: Cannot prepare element."); - // ANALOG to 'domain_disc_elem()' - modifies the solution, used - // for computing the defect + // modifies size of local data (locally) if needed if( spAssTuner->modify_solution_enabled() ) { LocalVector& modLocU = locU; try{ - spAssTuner->modify_LocalSol(modLocU, locU, dd); + spAssTuner->modify_LocalData(locD, tmpLocD, locU, dd); } UG_CATCH_THROW("Cannot modify local solution."); // recopy modified LocalVector: @@ -667,13 +685,13 @@ class StdGlobAssembler } UG_CATCH_THROW("(stationary) AssembleDefect: Cannot compute Rhs."); - + // send local to global defect try{ spAssTuner->add_local_vec_to_global(d, locD, dd); } UG_CATCH_THROW("(stationary) AssembleDefect: Cannot add local vector."); - } + } // finish element loop try @@ -684,6 +702,8 @@ class StdGlobAssembler } UG_CATCH_THROW("(stationary) AssembleDefect: Cannot create Data Evaluator."); + + } //////////////////////////////////////////////////////////////////////////////// @@ -798,6 +818,14 @@ class StdGlobAssembler } UG_CATCH_THROW("(instationary) AssembleDefect: Cannot prepare element."); + // modifies size of local data (locally) if needed + if( spAssTuner->modify_solution_enabled() ) + { + try{ + spAssTuner->modify_LocalData(locTimeSeries, locD, tmpLocD, locU, dd, t); + } UG_CATCH_THROW("Cannot modify local solution."); + } + // Assemble M try { diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h new file mode 100644 index 000000000..0a3b09cdd --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h @@ -0,0 +1,693 @@ +/* + * interface_handler_local.h + * + * Created on: 15.01.2015 + * Author: suze + */ + +#ifndef CUT_ELEMENT_HANDLER_H_ +#define CUT_ELEMENT_HANDLER_H_ + +#include "lib_grid/multi_grid.h" +#include "lib_disc/function_spaces/grid_function.h" +#include "../interface_provider/interface_provider_diffusion.h" +#include "../interface_provider/interface_provider_particle.h" + +#ifdef UG_PARALLEL + #include "pcl/pcl_communication_structs.h" + #include "pcl/pcl_process_communicator.h" +#endif + +namespace ug{ + +enum ElementModus +{ + INSIDE_DOM = 0, + OUTSIDE_DOM, + CUT_BY_INTERFACE, + CUT_BY_2_INTERFACE +}; + +enum VertexModus +{ + INSIDE = 0, + OUTSIDE, + ON_INTERFACE, +}; + + +template +class ICutElementHandler +{ + /// world Dimension + static const int dim = TWorldDim; + + public: + +/// default constructor: + ICutElementHandler(){}; + +/// destructor + ~ICutElementHandler() {} + + ElementModus get_element_modus(GridObject* elem) + { UG_THROW("in 'ICutElementHandler::get_element_modus()' : needs to be implemented by derived class!\n");} + + ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation) + { UG_THROW("in 'ICutElementHandler::compute_element_modus()': needs to be implemented by derived class!\n");} + + bool is_FTVertex(Vertex* vrt, size_t vrtIndex) + { UG_THROW("in 'ICutElementHandler::is_FTVertex()': needs to be implemented by derived class!\n");} + + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { UG_THROW("in 'ICutElementHandler::is_OutsideVertex()': needs to be implemented by derived class!\n");} + + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { UG_THROW("in 'ICutElementHandler::is_nearInterfaceVertex()': needs to be implemented by derived class!\n");} + + virtual number get_LSvalue_byPosition(MathVector vrtPos) + { UG_THROW("in 'ICutElementHandler::get_LSvalue_byPosition()': needs to be implemented by derived class!\n");} + + virtual number get_LSvalue(Vertex* vrt, const int prtIndex) + { UG_THROW("in 'ICutElementHandler::get_LSvalue()': needs to be implemented by derived class!\n");} + +}; + + +template +class CutElementHandlerFlatTop : public ICutElementHandler +{ + +public: + /// world Dimension + static const int dim = TWorldDim; + + /// Type of position coordinates + typedef MathVector position_type; + + /// Type of Position Attachment + typedef Attachment position_attachment_type; + + struct ParticleData { + MathVector center; + MathVector transVel; + MathVector rotVel; + bool valid; + }; + + // struct CombinedParticleData { + // std::vector data; + // }; + typedef std::vector CombinedParticleData; + + + /// Type of Accessor to the Position Data Attachment + typedef Grid::VertexAttachmentAccessor position_accessor_type; + + typedef typename domain_traits::grid_base_object grid_base_object; + + /// list of element needed for looping cut OR all elements of a particle + typedef std::vector > vvElemList; + + /// default constructor: + CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider); + CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider); + + /// destructor + ~CutElementHandlerFlatTop() {} + + /// calls 'copy_solution(topLevel) - update_for_multigrid(baseLev-topLev) - update_solution(topLevel)' + template + void init(ConstSmartPtr dd, const int baseLevel, const int topLevel); + + void update_global_indices(ConstSmartPtr dd, const int levIndex); + void update_marker(ConstSmartPtr dd, const int levIndex); + void print_elem_lists(ConstSmartPtr dd); + void update_interface(const int topLevel, number deltaT); + /// returns the levIndex of the corresponding gridLevel within 'm_Map' + void update_multigrid_data(ConstSmartPtr dd, const int levIndex); + + /// computing the element modus ONCE and marks according BoolMarker (called by 'InterfaceHandlerLocalParticle::update_marker()') + ElementModus compute_element_modus(int prtIndex, GridObject* elem, const int interfaceOrientation); + ElementModus compute_element_modus(int prtIndex, GridObject* elem) + { return compute_element_modus(prtIndex, elem, 1); } + ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation); + ElementModus compute_element_modus(GridObject* elem) + { return compute_element_modus(elem, 1); } + + /// derives the 'ElementModus' from the boolian of the BoolMarker + ElementModus get_element_modus(GridObject* elem); + + /// checks if grid data is updated and returns 'levIndex'-pair for 'gridLevel' in 'm_Map' + int get_Index(const GridLevel& gridLevel, ConstSmartPtr dd); + /// only call, when you are sure, that the data is available; if NOT: THROW error! + int get_Index(const GridLevel& gridLevel); + int get_Index_old(const GridLevel& gridLevel); + + /// resets all boolmarker of this class; called during update_marker(); necessary for time-dependent case + void clear_bool_marker(); + + /// update member 'm_spFlatTopVrtMarker' ... + bool element_is_pyramid(grid_base_object* elem); + + bool is_outsideFluid_prtIndex(const int prtIndex, Vertex* vrt); + + bool is_outsideFluid(Vertex* vrt, const int interfaceOrientation); + bool is_outsideFluid(int& PrtIndex, Vertex* vrt); + bool is_outsideFluid(Vertex* vrt); + bool is_outsideFluid_inverse(Vertex* vrt); + + + /// returns true, if 'vrt' lies inside the 'prtIndex'-th particle OR: + /// if the vrt lies outside the particle BUT near the interface, + /// i.e.'m_pNearInterfaceVrtMarker->_is_marked(vrt) = true" && 'm_spFlatTopVrtMarker->is_marked(vrt) == true' + bool set_nearInterface(Vertex* vrt, const number threshold); + bool set_nearInterface(Vertex* vrt); + + /// returns true, if vertex lies INSIDE fluid, BUT near to interface => no DoF + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { return m_spNearInterfaceVrtMarker->is_marked(vrt); } + + /// returns true, if vertex lies OUTSIDE fluid, BUT near to interface => FT-vertex + bool is_FTVertex(Vertex* vrt); + bool is_FTVertex(Vertex* vrt, size_t vrtIndex); + bool is_FTVertex( int& prtIndex, Vertex* vrt); + + /// returns true, if vertex lies OUTSIDE fluid => no DoF + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { return m_spOutsideMarker->is_marked(vrt); } + + + void set_threshold(size_t level, const number threshold) + { m_vThresholdOnLevel[level] = threshold; } + number get_threshold(Vertex* vrt) + { + const size_t lev = m_spMG->get_level(vrt); + return m_vThresholdOnLevel[lev]; + } + + size_t num_particles() const { return m_spInterfaceProvider->num_particles();} + number get_density(int prtIndex) { return m_spInterfaceProvider->get_density(prtIndex);} + MathVector get_center(int prtIndex){ return m_spInterfaceProvider->get_center(prtIndex);} + void set_center(MathVector center, int prtIndex){ m_spInterfaceProvider->set_center(center, prtIndex);} + + // careful! --> only dummy implementation, sice some methods in MovingParticle-class use it; in these cases it will be overwritten by + // the ParticleProviderSphere-class (hopefully) ;) + number get_radius(int prtIndex) { return m_spInterfaceProvider->get_radius(prtIndex);} + + /// needed eg. for 'ParticleMapper::set_identity_mat_constraint()' + bool is_extraDoF(DoFIndex dofIndex, int levIndex); + + MathMatrix get_rotationMat(MathVector radialVector); + + bool get_DoF_modus_linear(int prtIndex) { return m_spInterfaceProvider->get_DoF_modus_linear(prtIndex);} + bool get_DoF_modus_angular(int prtIndex){ return m_spInterfaceProvider->get_DoF_modus_angular(prtIndex);} + + // called during PartcleMapper::modify_GlobalSol(): + void set_extraSolTrans(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_spInterfaceProvider->set_linear_velocity(solution, prtIndex, timeSeriesInd, cmp); } + void set_extraSolTrans(MathVector solution, size_t prtIndex, int timeSeriesInd) + { m_spInterfaceProvider->set_linear_velocity(solution, prtIndex, timeSeriesInd); } + void set_extraSolRot(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_spInterfaceProvider->set_angular_velocity(solution, prtIndex, timeSeriesInd, cmp); } + void set_extraSolRot(MathVector solution, size_t prtIndex, int timeSeriesInd) + { m_spInterfaceProvider->set_angular_velocity(solution, prtIndex, timeSeriesInd); } + + /// Access methods + + std::vector get_transInd(int levIndex, int prtIndex) + { + std::vector vTransInd; + for ( size_t cmp = 0; cmp < dim; ++cmp ) + vTransInd.push_back(m_vvvGlobalIndices_linearVel[levIndex][prtIndex][cmp]); + return vTransInd; + } + std::vector get_rotInd(int levIndex, int prtIndex) + { + std::vector vRotInd; + for ( size_t cmp = 0; cmp < dim; ++cmp ) + vRotInd.push_back(m_vvvGlobalIndices_angularVel[levIndex][prtIndex][cmp]); + return vRotInd; + } + DoFIndex get_transInd_Comp(int levIndex, int prtIndex, size_t cmp) + { if ( cmp == dim ) UG_THROW("no acces to pressure index in transInd! EXIT...\n"); + return m_vvvGlobalIndices_linearVel[levIndex][prtIndex][cmp]; } + DoFIndex get_rotInd_Comp(int levIndex, int prtIndex, size_t cmp) + { if ( cmp == dim ) UG_THROW("no acces to pressure index in rotInd! EXIT...\n"); + return m_vvvGlobalIndices_angularVel[levIndex][prtIndex][cmp]; } + + + + void get_global_indices(std::vector& transInd, std::vector& rotInd, + const int levIndex, const int prtIndex) + { + transInd = get_transInd(levIndex, prtIndex); + rotInd = get_rotInd(levIndex, prtIndex); + } + + /// get solution values + MathVector get_transSol(size_t prtIndex, size_t timeSeriesInd) + { return m_spInterfaceProvider->get_linear_velocity(prtIndex, timeSeriesInd); } + MathVector get_rotSol(size_t prtIndex, size_t timeSeriesInd) + { return m_spInterfaceProvider->get_angular_velocity(prtIndex, timeSeriesInd); } + + // called during PartcleMapper::modify_GlobalSol(): + void set_solution(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_spInterfaceProvider->set_solution(solution, prtIndex, timeSeriesInd); } + + /// get solution values + number get_solution(size_t prtIndex, size_t timeSeriesInd) + { return m_spInterfaceProvider->get_solution(prtIndex, timeSeriesInd); } + + int get_prtIndex() { UG_THROW("attention: member 'm_prtIndex' is only contained in 'InterfaceHandlerLocalParticle', NOT in 'CutElementHandler'!\n"); } + int get_prtIndex(size_t dof) + { + UG_THROW("attention: You want to get the particle index of an array. Make sure that the data was set!\n"); + return m_vPrtIndex[dof]; + } + + // bool valid_prt_information(int prtIndex) { + // return particleData[prtIndex].valid; + // } + + void set_mpi_routine(int val) { + active_mpi_routine = val; + } + +#ifdef UG_PARALLEL + void synchronize_particles(int levIndex) { + + bool verbose = false; + +#ifdef UG_DEBUG + verbose = true; +#endif + + pcl::ProcessCommunicator com; + + if (active_mpi_routine == 1) { + /////////////////////////////////////// + // Synchronisation using Allreduce // + /////////////////////////////////////// + for (size_t p = 0; p < num_particles(); ++p) + { + if (verbose) { + UG_LOG("Synchronize particle " << p << ".\n"); + UG_LOG("m_vvvElemListCut.size(): " << m_vvvElemListCut.size() << ".\n"); + UG_LOG("m_vvvElemListCut[levIndex].size(): " << m_vvvElemListCut[levIndex].size() << ".\n"); + UG_LOG("m_vvvElemListCut[levIndex][" << p << "].size(): " << m_vvvElemListCut[levIndex][p].size() << ".\n"); + } + std::vector ElemList = m_vvvElemListCut[levIndex][p]; + if (verbose) + UG_LOG("Process " << pcl::ProcRank() << ": 1_ synchronize_particles() ElemList.size(): " << ElemList.size() << "\n"); + if ( ElemList.size() == 0 ) { + // send zero vector as center to all other processes + std::vector zero_values(3*dim,0.0); + std::vector values(3*dim,0.0); + com.allreduce(&zero_values[0], &values[0], 3*dim, MPI_DOUBLE, PCL_RO_SUM); + MathVector center; + MathVector linearVelocity; + MathVector angularVelocity; + for (size_t i = 0; i < dim; ++i) { + center[i] = values[i]; + linearVelocity[i] = values[dim+i]; + angularVelocity[i] = values[2*dim+i]; + } + if (verbose) { + UG_LOG("Process " << pcl::ProcRank() << ": setting center to " << center << "\n"); + UG_LOG("Process " << pcl::ProcRank() << ": setting linear velocity to " << linearVelocity << "\n"); + UG_LOG("Process " << pcl::ProcRank() << ": setting angular velocity to " << angularVelocity << ")\n"); + } + m_spInterfaceProvider->set_center(center, p); + m_spInterfaceProvider->set_linear_velocity(linearVelocity, p, 0); + m_spInterfaceProvider->set_angular_velocity(angularVelocity, p, 0); + } else { + // send correct center value to all other processes. Since all other processes should send zeros the allreduce with PCL_RO_SUM results in the correct center values on all processes. + MathVector center = m_spInterfaceProvider->get_center(p); + MathVector linearVelocity = m_spInterfaceProvider->get_linear_velocity(p, 0); + MathVector angularVelocity = m_spInterfaceProvider->get_angular_velocity(p, 0); + std::vector values(3*dim,0.0); + for (size_t i = 0; i < dim; ++i) { + values[i] = center[i]; + values[dim+i] = linearVelocity[i]; + values[2*dim+i] = angularVelocity[i]; + } + MathVector<3*dim> new_values; + com.allreduce(&values[0], &new_values[0], 3*dim, MPI_DOUBLE, PCL_RO_SUM); + MathVector new_center; + MathVector new_linearVelocity; + MathVector new_angularVelocity; + + for (size_t i = 0; i < dim; ++i) { + new_center[i] = new_values[i]; + new_linearVelocity[i] = new_values[dim+i]; + new_angularVelocity[i] = new_values[2*dim+i]; + } + if (verbose) + UG_LOG("Process " << pcl::ProcRank() << ": setting center to " << new_center << "\n"); + m_spInterfaceProvider->set_center(new_center, p); + if (verbose) + UG_LOG("Process " << pcl::ProcRank() << ": setting linear velocity to " << new_linearVelocity << "\n"); + m_spInterfaceProvider->set_linear_velocity(new_linearVelocity, p, 0); + if (verbose) + UG_LOG("Process " << pcl::ProcRank() << ": setting angular velocity to " << new_angularVelocity << "\n"); + m_spInterfaceProvider->set_angular_velocity(new_angularVelocity, p, 0); + } + } + } else { + + //////////////////////////////////////// + // Synchronisation using Interfaces // + //////////////////////////////////////// + // Create up to date particle data struct + if (verbose) + UG_LOG("Create data struct.\n"); + CombinedParticleData particleValues; + ParticleData dataSet; + for (size_t p = 0; p < num_particles(); ++p) { + std::vector ElemList = m_vvvElemListCut[levIndex][p]; + if ( ElemList.size() == 0 ) { + MathVector center; + if (verbose) + UG_LOG(pcl::ProcRank() << " sends zeros.\n"); + for (std::size_t i = 0; i < dim; ++i){ + center[i] = 0.0; + dataSet.transVel[i] = 0.0; + dataSet.rotVel[i] = 0.0; + } + dataSet.center = center; + dataSet.valid = false; + } else { + dataSet.center = m_spInterfaceProvider->get_center(p); + dataSet.transVel = m_spInterfaceProvider->get_linear_velocity(p, 0); + dataSet.rotVel = m_spInterfaceProvider->get_angular_velocity(p, 0); + dataSet.valid = true; + if (verbose) { + UG_LOG(pcl::ProcRank() << " sends\n" ); + UG_LOG("(" << dataSet.center[0] << ", " << dataSet.center[1] << ")\n"); + UG_LOG("(" << dataSet.transVel[0] << ", " << dataSet.transVel[1] << ")\n"); + UG_LOG("(" << dataSet.rotVel[0] << ", " << dataSet.rotVel[1] << ")\n"); + UG_LOG(std::boolalpha << dataSet.valid); + } + } + particleValues.push_back(dataSet); + } + if (verbose) + UG_LOG("Struct created.\n"); + com.barrier(); + + ParticleData default_new_data; + MathVector zero_vec; + for (std::size_t i = 0; i < dim; ++i){ + zero_vec[i] = 0.0; + } + default_new_data.valid = false; + default_new_data.center = zero_vec; + default_new_data.transVel = zero_vec; + default_new_data.rotVel = zero_vec; + CombinedParticleData new_particleData(num_particles(),default_new_data); + + const GridLayoutMap& glm = m_spMG->distributed_grid_manager()->grid_layout_map(); + for (std::size_t proc = 0; proc < pcl::NumProcs(); ++proc) { + if (verbose) + UG_LOG("proc " << proc << " sends to "); + if (glm.has_layout(INT_H_MASTER)) + { + const typename GridLayoutMap::Types::Layout& vrt_hm_layout = glm.get_layout(INT_H_MASTER); + if (vrt_hm_layout.interface_exists(proc, levIndex)) + { + for (GridLayoutMap::Types::Layout::const_iterator it = vrt_hm_layout.begin(levIndex); it != vrt_hm_layout.begin(levIndex); ++it) { + com.send_data(&particleValues, sizeof(particleValues), vrt_hm_layout.proc_id(it), proc); + //UG_LOG(vrt_hm_layout.proc_id(it) << " "); + } + } + } + if (glm.has_layout(INT_H_SLAVE)) + { + const typename GridLayoutMap::Types::Layout& vrt_hm_layout = glm.get_layout(INT_H_SLAVE); + if (vrt_hm_layout.interface_exists(proc, levIndex)) + { + for (GridLayoutMap::Types::Layout::const_iterator it = vrt_hm_layout.begin(levIndex); it != vrt_hm_layout.begin(levIndex); ++it) { + com.receive_data(&new_particleData, sizeof(new_particleData), vrt_hm_layout.proc_id(it), proc); + } + } + } + } + if (verbose) + UG_LOG("\n") + for (size_t p = 0; p < num_particles(); ++p) { + if (new_particleData[p].valid) { + m_spInterfaceProvider->set_center(new_particleData[p].center, p); + m_spInterfaceProvider->set_linear_velocity(new_particleData[p].transVel, p, 0); + m_spInterfaceProvider->set_angular_velocity(new_particleData[p].rotVel, p, 0); + } + } + } + } +#endif + + /// methods called by local_to_global_mappe: + number Volume(int levIndex, size_t prtIndex) + { return m_spInterfaceProvider->Volume(levIndex, prtIndex);} + number Mass(const int levIndex, const int prtIndex, const number fluidDensity) + { return m_spInterfaceProvider->Mass(levIndex, prtIndex, fluidDensity);} + number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) + { return m_spInterfaceProvider->Mass(levIndex, prtIndex, volume, fluidDensity);} + number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) + { return m_spInterfaceProvider->MomOfInertia(levIndex, prtIndex, fluidDensity);} + number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) + { return m_spInterfaceProvider->MomOfInertia(levIndex, prtIndex, volume, fluidDensity);} + + void update_prtCoords(const int topLevel, const number deltaT); + + number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) { return m_spInterfaceProvider->get_LSvalue_byPosition(vrtPos, prtIndex);} + number get_LSvalue_byPosition(MathVector vrtPos) + {//ToDo + UG_THROW("in CutElementHandler:getLSvalue_byPosition: no prtIndex-Parameter!\n"); + int prtIndex = 0; + return get_LSvalue_byPosition(vrtPos, prtIndex); + } + number get_LSvalue(Vertex* vrt, const int prtIndex) { return get_LSvalue_byPosition(m_aaPos[vrt], prtIndex); } + + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex) + { return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, PrtIndex); } + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut); } + + void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) + { m_spInterfaceProvider->print_velocity(transSol, rotSol, prtIndex, isTimedep, time, filename); } + + SmartPtr m_spMG; + position_attachment_type m_aPos; /// m_vPrtIndex; + + /// global data updatet during 'update_for_time_stepping()' + /// [levIndex][prtIndex][cmp] + std::vector< std::vector< std::vector > > m_vvvGlobalIndices_linearVel; + std::vector< std::vector< std::vector > > m_vvvGlobalIndices_angularVel; + + SmartPtr m_spFlatTopVrtMarker; // marks: vertices for 'is_outside()' + SmartPtr m_spNearInterfaceVrtMarker; // marks: vertices for 'is_nearInterface()', i.e. potentially inside domain + // necessary to distinguish between (FlatTop && outside) and (FlatTop && nearInterface) + // Remark: outside AND nearInterface are FlatTopVrt, BUT nearInterface can lie inside the domain + // => e.g during 'CollectCorners_FlatTop_2d()' call of 'get_intersection_point()' + // would fail if these cases are NOT distinguished! + + SmartPtr m_spCutMarker; // marks: elements, edges + SmartPtr m_spOutsideMarker; // marks: elements, edges, vertices (vrt, for which 'is_outsideFluid == true, i.e. outside OR nearInterface + + /// [levIndex][prtIndex][counter] + std::vector m_vvvElemList; + std::vector m_vvvElemListCut; + std::vector m_vvvElemListOutside; + + /// associotion of 'GridLevel' with an 'Index' value for access to m_vvv-lists: + std::map m_Map; + + /// contains radius, center and density of all given particles + SmartPtr > m_spInterfaceProvider; + + std::vector m_vThresholdOnLevel; + + // CombinedParticleData particleData; + std::size_t active_mpi_routine; + +}; + + + +template +class CutElementHandlerImmersed : public ICutElementHandler +{ + + public: + /// world Dimension + static const int dim = TWorldDim; + + /// Type of position coordinates + typedef MathVector position_type; + + /// Type of Position Attachment + typedef Attachment position_attachment_type; + + /// Type of Accessor to the Position Data Attachment + typedef Grid::VertexAttachmentAccessor position_accessor_type; + + typedef typename domain_traits::grid_base_object grid_base_object; + +/// list of element needed for looping cut OR all elements of a particle + typedef std::vector > vvElemList; + +/// default constructor: + CutElementHandlerImmersed(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider); + +/// destructor + ~CutElementHandlerImmersed() {} + + /// computing the element modus ONCE and marks according BoolMarker (called by 'InterfaceHandlerLocalParticle::update_marker()') + ElementModus compute_element_modus(GridObject* elem) + { return compute_element_modus(elem, 1); } + + ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation); + +/// derives the 'ElementModus' from the boolian of the BoolMarker + ElementModus get_element_modus(GridObject* elem) + { return m_elementModus; } + VertexModus get_vertex_modus(Vertex* vrt, size_t vrtIndex) + { return m_vVertexMode[vrtIndex];} + VertexModus get_vertex_modus(size_t vrtIndex) + { return m_vVertexMode[vrtIndex];} + VertexModus get_vertex_modus(size_t vrtIndex, const int interfaceOrientation) + { return m_vvVertexMode[interfaceOrientation][vrtIndex];} + +/// only call, when you are sure, that the data is available; if NOT: THROW error! + int get_Index(const GridLevel& gridLevel, ConstSmartPtr dd); + int get_Index(const GridLevel& gridLevel); + int get_Index_old(const GridLevel& gridLevel); + + bool is_outsideDomain(Vertex* vrt, const int interfaceOrientation) + { + if (interfaceOrientation == 1 ) + return is_outsideDomain(vrt); + else if (interfaceOrientation == -1 ) + return is_outsideDomain_inverse(vrt); + else UG_THROW("in 'CutElementHandler::is_outsideDomain()': no valid orientation given!\n"); + } + bool is_outsideDomain(Vertex* vrt); + bool is_outsideDomain_inverse(Vertex* vrt); + +/// returns true, if 'vrt' lies inside the 'prtIndex'-th particle OR: +/// if the vrt lies outside the particle BUT near the interface, +/// i.e.'m_pNearInterfaceVrtMarker->_is_marked(vrt) = true" && 'm_spFlatTopVrtMarker->is_marked(vrt) == true' + bool is_nearInterface(Vertex* vrt, const number threshold); + bool is_nearInterface(Vertex* vrt) + { + const number threshold = get_threshold(vrt); + return is_nearInterface(vrt, threshold); + } + + //ToDO: not needed? + VertexModus compute_vertex_modus(Vertex* vrt, const int interfaceOrientation); + + size_t get_or_insert_vertex_near(const MathVector& vrtPos); + const size_t get_numNearVerticesPos() const { return m_verticesNearPos.size(); } + + bool is_element_near_interface() { return m_bElementNearInterface;} + + /// returns true, if vertex lies INSIDE fluid, BUT near to interface => no DoF + bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex, const int interfaceOrientation) + { + size_t localInd = -0.5*interfaceOrientation + 0.5; + if ( get_vertex_modus(vrtIndex, localInd) == vrtModus ) + return true; + return false; + } + bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex) + { + if ( get_vertex_modus(vrtIndex) == vrtModus ) + return true; + return false; + } + /// returns true, if vertex lies INSIDE fluid, BUT near to interface => no DoF + bool check_vertex_modus(VertexModus vrtModus, Vertex* vrt, size_t vrtIndex) + { + if ( get_vertex_modus(vrt, vrtIndex) == vrtModus ) + return true; + return false; + } + + /// returns true, if vertex lies OUTSIDE fluid, BUT near to interface => FT-vertex + bool is_FTVertex(Vertex* vrt, size_t vrtIndex) + { return !check_vertex_modus(INSIDE, vrt, vrtIndex); } + + /// returns true, if vertex lies OUTSIDE fluid => no DoF + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { return check_vertex_modus(OUTSIDE, vrt, vrtIndex); } + + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { return check_vertex_modus(ON_INTERFACE, vrt, vrtIndex); } + + void set_threshold(size_t level, const number threshold) + { m_vThresholdOnLevel[level] = threshold; } + number get_threshold(Vertex* vrt) + { + const size_t lev = m_spMG->get_level(vrt); + return m_vThresholdOnLevel[lev]; + } + + size_t num_particles() const { return m_spInterfaceProvider->num_particles();} + // number get_radius(int prtIndex) { return m_spInterfaceProvider->get_radius(prtIndex);} + number get_theta(int prtIndex) { return m_spInterfaceProvider->get_theta(prtIndex);} + number get_density(int prtIndex) { return m_spInterfaceProvider->get_density(prtIndex);} + MathVector get_center(int prtIndex){ return m_spInterfaceProvider->get_center(prtIndex);} + + // called during PartcleMapper::modify_GlobalSol(): + void set_solution(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_spInterfaceProvider->set_solution(solution, prtIndex, timeSeriesInd); } + + /// get solution values + number get_solution(size_t prtIndex, size_t timeSeriesInd) + { return m_spInterfaceProvider->get_solution(prtIndex, timeSeriesInd); } + + void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) + { m_spInterfaceProvider->print_velocity(transSol, rotSol, prtIndex, isTimedep, time, filename); } + + SmartPtr m_spMG; + position_attachment_type m_aPos; /// m_vPrtIndex; + /// associotion of 'GridLevel' with an 'Index' value for access to m_vvv-lists: + std::map m_Map; + + /// contains radius, center and density of all given particles + SmartPtr > m_spInterfaceProvider; + + std::vector m_vThresholdOnLevel; + std::vector m_vVertexMode; + std::vector > m_vvVertexMode; + + ElementModus m_elementModus; + bool m_bElementNearInterface; + std::map, size_t> m_MapNearVertices; + std::vector > m_verticesNearPos; + + +}; + + +}// end namespace ug + +#include "cut_element_handler_FT_impl.h" +#include "cut_element_handler_immersed_impl.h" + +#endif /* CUT_ELEMENT_HANDLER_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT_impl.h new file mode 100644 index 000000000..20bf5142b --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT_impl.h @@ -0,0 +1,973 @@ +/* + * interface_handler_local_impl.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef CUT_ELEMENT_HANDLER_IMPL_H_ +#define CUT_ELEMENT_HANDLER_IMPL_H_ + +#ifdef UG_PARALLEL + #include "pcl/pcl_interface_communicator.h" + #include "lib_grid/refinement/hanging_node_refiner_multi_grid.h" + #include "lib_grid/multi_grid.h" +#endif + +namespace ug{ + + template + CutElementHandlerFlatTop:: + CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider) + : m_spMG(mg.operator->()), m_fctNames(fctNames), + m_spInterfaceProvider(interfaceProvider) + { + m_vPrtIndex.resize(3); + + + m_vThresholdOnLevel.resize(mg->num_levels(), 0.0); + + // get position attachment + m_aPos = GetDefaultPositionAttachment(); + + // let position accessor access Vertex Coordinates + if(!m_spMG->has_attachment(m_aPos)) + m_spMG->attach_to(m_aPos); + m_aaPos.access(*m_spMG, m_aPos); + + // initialize data + m_spCutMarker = make_sp(new BoolMarker); + m_spOutsideMarker = make_sp(new BoolMarker); + m_spFlatTopVrtMarker = make_sp(new BoolMarker); + m_spNearInterfaceVrtMarker = make_sp(new BoolMarker); + + + m_spCutMarker->assign_grid(*m_spMG); + m_spOutsideMarker->assign_grid(*m_spMG); + m_spFlatTopVrtMarker->assign_grid(*m_spMG); + m_spNearInterfaceVrtMarker->assign_grid(*m_spMG); + + m_spCutMarker->enable_mark_inheritance(false); + m_spOutsideMarker->enable_mark_inheritance(false); + m_spFlatTopVrtMarker->enable_mark_inheritance(false); + m_spNearInterfaceVrtMarker->enable_mark_inheritance(false); + + UG_LOG("init bool_marker done!\n"); + + } + +template +CutElementHandlerFlatTop:: +CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider) + : m_spMG(mg.operator->()), m_fctNames(fctNames), + m_spInterfaceProvider(interfaceProvider) +{ + m_vPrtIndex.resize(3); + + + m_vThresholdOnLevel.resize(mg->num_levels(), 0.0); + + // get position attachment + m_aPos = GetDefaultPositionAttachment(); + +// let position accessor access Vertex Coordinates + if(!m_spMG->has_attachment(m_aPos)) + m_spMG->attach_to(m_aPos); + m_aaPos.access(*m_spMG, m_aPos); + +// initialize data + m_spCutMarker = make_sp(new BoolMarker); + m_spOutsideMarker = make_sp(new BoolMarker); + m_spFlatTopVrtMarker = make_sp(new BoolMarker); + m_spNearInterfaceVrtMarker = make_sp(new BoolMarker); + + + m_spCutMarker->assign_grid(*m_spMG); + m_spOutsideMarker->assign_grid(*m_spMG); + m_spFlatTopVrtMarker->assign_grid(*m_spMG); + m_spNearInterfaceVrtMarker->assign_grid(*m_spMG); + + m_spCutMarker->enable_mark_inheritance(false); + m_spOutsideMarker->enable_mark_inheritance(false); + m_spFlatTopVrtMarker->enable_mark_inheritance(false); + m_spNearInterfaceVrtMarker->enable_mark_inheritance(false); + + UG_LOG("init bool_marker done!\n"); + +} + + // checks weather node is transDoF OR rotDoF +template +bool CutElementHandlerFlatTop:: +is_extraDoF(DoFIndex dofIndex, int levIndex) +{ + // pressure dof is always NO extraDoF: + if ( dofIndex[1] == dim ) + return false; + + for (size_t p = 0; p < num_particles(); ++p) + { + +#ifdef UG_PARALLEL + if ( m_vvvElemListCut[levIndex][p].size() == 0 ) { + continue; + } +#endif + // checks weather node is transDoF OR rotDoF + DoFIndex transIndex = get_transInd_Comp(levIndex, p, 0); + DoFIndex rotIndex = get_rotInd_Comp(levIndex, p, 0); + /// extra index = translational velocity DoF + if ( dofIndex[0] == transIndex[0] ) + { + if ( get_DoF_modus_linear(p) ) + { + return false; + } + else + return true; + } + /// extra index = angular velocity DoF: 2d case => only ONE velocity DoF + else if ( dofIndex[0] == rotIndex[0] ) + { + if ( get_DoF_modus_angular(p) ) + { + return false; + } + else + { + if ( dim == 3 ) return true; + if ( dim == 2 && dofIndex[1] == 0 ) return true; + } + } + } + + return false; +} + +template +MathMatrix CutElementHandlerFlatTop:: +get_rotationMat(MathVector radialVector) +{ + MathMatrix rotationMat; + if ( dim == 2 ) + { + rotationMat[0][0] = -radialVector[1]; + rotationMat[0][1] = 0.0; + + rotationMat[1][0] = radialVector[0]; + rotationMat[1][1] = 0.0; + } + else if ( dim == 3 ) + { + rotationMat[0][0] = 0.0; + rotationMat[0][1] = radialVector[2]; + rotationMat[0][2] = -radialVector[1]; + + rotationMat[1][0] = -radialVector[2]; + rotationMat[1][1] = 0.0; + rotationMat[1][2] = radialVector[0]; + + rotationMat[2][0] = radialVector[1]; + rotationMat[2][1] = -radialVector[0]; + rotationMat[2][2] = 0.0; + } + + return rotationMat; + +} +/// call during update_marker(); necessary for time-dependent case +template +void CutElementHandlerFlatTop:: +clear_bool_marker() +{ + m_spNearInterfaceVrtMarker->clear(); + m_spFlatTopVrtMarker->clear(); + m_spOutsideMarker->clear(); + m_spCutMarker->clear(); + + UG_LOG("clear bool marker done...\n"); +} + +template +bool CutElementHandlerFlatTop:: +set_nearInterface(Vertex* vrt) +{ + const number threshold = this->get_threshold(vrt); + if ( set_nearInterface(vrt, threshold) ) + { + this->m_spNearInterfaceVrtMarker->mark(vrt); + return true; + } + else return false; +} + +template +bool CutElementHandlerFlatTop:: +set_nearInterface(Vertex* vrt, const number threshold) +{ + number localThres; + // default value of threshold = 0.0 => set minimal thres for 'ON interface'-case! + if (threshold == 0.0) + localThres = 1e-9; + else localThres = threshold; + + const number LS_value = get_LSvalue(vrt, 0); + + if (fabs(LS_value) < localThres) + { + const char* filename = "0_near_vertex"; + std::string name(filename); + char ext[50]; sprintf(ext, ".txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + fprintf(outputFile,"nearPos: %e \t %e (%e, %e)\n", this->m_aaPos[vrt][0], this->m_aaPos[vrt][1], fabs(LS_value), threshold); + fclose(outputFile); + + return true; + } + return false; +} + +template +bool CutElementHandlerFlatTop:: +is_outsideFluid_inverse(Vertex* vrt) +{ + bool outsideFluid = false; + + // loop over all centers and pick the index with minimal distance + for (size_t p = 0; p < this->num_particles(); ++p) + { + const number LS_value = get_LSvalue(vrt, p); + + if ( LS_value < 1e-10) + { + outsideFluid = true; + } + else if ( set_nearInterface(vrt) ) + { + outsideFluid = true; + } + } + + return outsideFluid; +} + +template +bool CutElementHandlerFlatTop:: +is_outsideFluid(Vertex* vrt) +{ + bool outsideFluid = false; + + // loop over all centers and pick the index with minimal distance + for (size_t p = 0; p < this->num_particles(); ++p) + { + const number LS_value = get_LSvalue(vrt, p); + + if ( LS_value > 1e-10 ) + { + outsideFluid = true; + } + else if ( set_nearInterface(vrt) ) + { + outsideFluid = true; + } + } + + return outsideFluid; +} + +template +bool CutElementHandlerFlatTop:: +is_outsideFluid_prtIndex(const int prtIndex, Vertex* vrt) +{ + + bool outsideFluid = false; + + // loop over all centers and pick the index with minimal distance + + const number LS_value = get_LSvalue(vrt, prtIndex); + + if ( LS_value > 1e-10 ) + { + outsideFluid = true; + } + else if ( set_nearInterface(vrt) ) + { + outsideFluid = true; + } + + return outsideFluid; +} + +template +bool CutElementHandlerFlatTop:: +is_outsideFluid(Vertex* vrt, const int interfaceOrientation) +{ + if (interfaceOrientation == 1 ) + return is_outsideFluid(vrt); + else if (interfaceOrientation == -1 ) + return is_outsideFluid_inverse(vrt); + else UG_THROW("in 'CutElementHandler::is_outsideFluid()': no valid orientation given!\n"); +} + +template +bool CutElementHandlerFlatTop:: +is_outsideFluid(int& PrtIndex, Vertex* vrt) +{ + bool outsideFluid = false; + + // loop over all centers and pick the index with minimal distance + for (size_t p = 0; p < this->num_particles(); ++p) + { + const number LS_value = get_LSvalue(vrt, p); + + if ( LS_value > 1e-10 ) + { + PrtIndex = p; + outsideFluid = true; + } + else if ( set_nearInterface(vrt) ) + { + PrtIndex = p; + outsideFluid = true; + } + } + + return outsideFluid; +} + +template +void CutElementHandlerFlatTop:: +update_prtCoords(const int topLevel, const number deltaT) +{ + if ( deltaT == 0.0 ) + UG_THROW("ParticleProvider:update_prtCoords: deltaT = " << deltaT << " => no update necessary!\n"); + + // get level index + const int levIndex = get_Index(GridLevel(topLevel, GridLevel::LEVEL)); + + // output data: + UG_LOG("update_prtCoords() for levIndex = " << levIndex << "\n"); + UG_LOG("update_prtCoords() for deltaT = " << deltaT << "\n"); + + // update center + for (size_t p = 0; p < num_particles(); ++p) + { +#ifdef UG_PARALLEL + std::vector ElemList = this->m_vvvElemListCut[levIndex][p]; + UG_LOG("1_ update_prtCoords() ElemList.size(): " << ElemList.size() << "\n"); + if ( ElemList.size() == 0 ) { + UG_LOG("2_ update_prtCoords() ElemList.size(): " << ElemList.size() << " => skip assembling! \n"); + return; + } +#endif + + MathVector transSol = get_transSol(p, 0); + MathVector rotSol = get_rotSol(p, 0); + + m_spInterfaceProvider->update(deltaT, transSol, rotSol, p); + UG_LOG("END update_prtCoords for prtIndex = " << p << "\n\n"); + + } // end particle loop + +} + + + + +template +bool CutElementHandlerFlatTop:: +is_FTVertex(Vertex* vrt) +{ +// some checks: (should be ok, since all markers are cleaned during 'update()') + if ( is_outsideFluid(vrt, 1) && !m_spOutsideMarker->is_marked(vrt) ) + UG_THROW("in 'is_FTVertex(vrt, prtIndex)': inconsistent boolians case 1!\n"); + if ( !is_outsideFluid(vrt, 1) && m_spOutsideMarker->is_marked(vrt) ) + UG_THROW("in 'is_FTVertex(vrt, prtIndex)': inconsistent boolians case 2!\n"); + + return m_spFlatTopVrtMarker->is_marked(vrt); +} + +template +bool CutElementHandlerFlatTop:: +is_FTVertex(Vertex* vrt, size_t vrtIndex) +{ +// some checks: (should be ok, since all markers are cleaned during 'update()') + if ( is_outsideFluid(vrt, 1) && !m_spOutsideMarker->is_marked(vrt) ) + UG_THROW("in 'is_FTVertex(vrt, prtIndex)': inconsistent boolians case 1!\n"); + if ( !is_outsideFluid(vrt, 1) && m_spOutsideMarker->is_marked(vrt) ) + UG_THROW("in 'is_FTVertex(vrt, prtIndex)': inconsistent boolians case 2!\n"); + + return m_spFlatTopVrtMarker->is_marked(vrt); +} + +template +bool CutElementHandlerFlatTop:: +is_FTVertex(int& PrtIndex, Vertex* vrt) +{ +// some checks: (should be ok, since all markers are cleaned during 'update()') + if ( is_outsideFluid(PrtIndex, vrt) && !m_spOutsideMarker->is_marked(vrt) ) + UG_THROW("in 'is_FlatTopVrt(vrt, prtIndex)': inconsistent boolians case 1!\n"); + if ( !is_outsideFluid(PrtIndex, vrt) && m_spOutsideMarker->is_marked(vrt) ) + UG_THROW("in 'is_FlatTopVrt(vrt, prtIndex)': inconsistent boolians case 2!\n"); + + return m_spFlatTopVrtMarker->is_marked(vrt); +} + +template +ElementModus CutElementHandlerFlatTop:: +compute_element_modus(int prtIndex, GridObject* elem, const int interfaceOrientation) +{ + bool insideFluid = false; + bool outsideFluid = false; + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + m_aaPos.access(*m_spMG, m_aPos); + + + // loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrt = vVertex[i]; + if ( is_outsideFluid_prtIndex(prtIndex, vrt) ) + { + outsideFluid = true; + m_spOutsideMarker->mark(vrt); + } + else + { + insideFluid = true; + if ( set_nearInterface(vrt) ) + UG_THROW("CutElementHandlerFlatTop::compute_element_modus(): case 'set_nearInterface(vrt) = true' not possible!\n"); + } + + } // vertex loop + + if (insideFluid && outsideFluid) return CUT_BY_INTERFACE; + else if (outsideFluid) return OUTSIDE_DOM; + + return INSIDE_DOM; + +} + +template +ElementModus CutElementHandlerFlatTop:: +compute_element_modus(GridObject* elem, const int interfaceOrientation) +{ + bool insideFluid = false; + bool outsideFluid = false; + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + m_aaPos.access(*m_spMG, m_aPos); + + + // loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrt = vVertex[i]; + if ( is_outsideFluid(vrt, interfaceOrientation) ) + { + outsideFluid = true; + m_spOutsideMarker->mark(vrt); + } + else + { + insideFluid = true; + if ( set_nearInterface(vrt) ) + UG_THROW("CutElementHandlerFlatTop::compute_element_modus(): case 'set_nearInterface(vrt) = true' not possible!\n"); + } + + } // vertex loop + + if (insideFluid && outsideFluid) return CUT_BY_INTERFACE; + else if (outsideFluid) return OUTSIDE_DOM; + + return INSIDE_DOM; + +} + + +template +ElementModus CutElementHandlerFlatTop:: +get_element_modus(GridObject* elem) +{ + if ( m_spCutMarker->is_marked(elem) ) + { + return CUT_BY_INTERFACE; + } + else if ( m_spOutsideMarker->is_marked(elem) ) + { + return OUTSIDE_DOM; + } + else + return INSIDE_DOM; + +} + + +template +void CutElementHandlerFlatTop:: +update_global_indices(ConstSmartPtr dd, const int levIndex) +{ +// get data + FunctionGroup fctGrp(dd->function_pattern(), TokenizeString(m_fctNames)); + +// initialize vectors + m_vvvGlobalIndices_linearVel.resize(levIndex + 1); + m_vvvGlobalIndices_angularVel.resize(levIndex + 1); + + m_vvvGlobalIndices_linearVel[levIndex].clear(); + m_vvvGlobalIndices_angularVel[levIndex].clear(); + + m_vvvGlobalIndices_linearVel[levIndex].resize(num_particles()); + m_vvvGlobalIndices_angularVel[levIndex].resize(num_particles()); + +// initialize boolian for return value + std::vector ExtraDoFs_found; + for (size_t p = 0; p < this->num_particles(); ++p) + ExtraDoFs_found.push_back(false); + + // initialize distance array + std::vector < number > distance; + distance.clear(); + distance.resize(num_particles(), 10000.0); + typedef typename std::vector::iterator ListIter; + + +/* + * hier keine #ifdef UG_PARALLEL-Abfrage notwendig, da 'm_vvvElemList' leer ist + * auf dem entsprechendem proc => der proc ohne particle ueberspringt schleife sowieso! :) +*/ +#ifdef UG_PARALLEL + UG_LOG("Process " << pcl::ProcRank() << ": num_particles(): " << num_particles() << ".\n"); +#endif + // WIRKLICH? --> provider->num_particles() = 1... + for (size_t p = 0; p < num_particles(); ++p) + { +#ifdef UG_PARALLEL + std::vector ElemList = m_vvvElemListCut[levIndex][p]; + UG_LOG("1_ update_global_indices() ElemList.size(): " << ElemList.size() << "\n"); + if ( ElemList.size() == 0 ) { + UG_LOG("Process " << pcl::ProcRank() << ": 2_ update_global_indices() ElemList.size(): " << ElemList.size() << " => skip assembling! \n"); + continue; + } +#endif + + + grid_base_object* transVelElem; + Vertex* transVelVertex; + + for (ListIter elemIter = m_vvvElemList[levIndex][p].begin(); + elemIter != m_vvvElemList[levIndex][p].end(); ++elemIter) + { + // get element + grid_base_object* elem = *elemIter; + + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + //compute_threshold(vVertex); + + + // loop vertices in order to: + // 1) compute sum of distances + // 2) check weather at least two vrt are 'outside_Fluid' + number dist = 0.0; + std::vector vrtArray; + for(size_t i = 0; i < elem->num_vertices(); ++i) + { + // get vertex + Vertex* vrt = elem->vertex(i); + const MathVector& vrtPos = m_aaPos[vrt]; + const MathVector& center = get_center(p); + + dist += VecDistance(vrtPos, center); + if (is_outsideFluid_prtIndex(p, vrt)) + vrtArray.push_back(vrt); + if (is_outsideFluid_prtIndex(p, vrt) && !m_spOutsideMarker->is_marked(vrt)) + UG_THROW("Mist, immeroch falsche marker:-(\n"); + } + + if (dist < distance[p] && vrtArray.size() >= 2) + { + ExtraDoFs_found[p] = true; + + transVelElem = elem; + transVelVertex = vrtArray[0]; + + distance[p] = dist; + m_vvvGlobalIndices_linearVel[levIndex][p].clear(); + m_vvvGlobalIndices_angularVel[levIndex][p].clear(); + + // create multi index + std::vector < DoFIndex > vInd1; // ToDo: hier std::vector? + std::vector < DoFIndex > vInd2; + + // loop all velocity components + for (int d = 0; d < dim; ++d) + { + // get fct id for comopent + const size_t fct = fctGrp[d]; + // get multi indices + if (dd->inner_dof_indices(vrtArray[0], fct, vInd1) != 1) + UG_THROW("Only one index expected."); + // get multi indices + if (dd->inner_dof_indices(vrtArray[1], fct, vInd2) != 1) + UG_THROW("Only one index expected."); + + + // set multiIndex for ExtraDoFs + m_vvvGlobalIndices_linearVel[levIndex][p].push_back(vInd2[0]); + m_vvvGlobalIndices_angularVel[levIndex][p].push_back(vInd1[0]); + + + } // end dim-loop + + } + + + } // end elem-loop + + + if ( !ExtraDoFs_found[p] ) + UG_THROW("ParticleHandlerGlobal:update_global_indices: no ExtraDoFs found for the " << p << "-th particle!\n"); + + } // end prt-loop + + +} + + +template +void CutElementHandlerFlatTop:: +update_marker(ConstSmartPtr dd, const int levIndex) +{ + + // initialize vectors + m_vvvElemList.resize(levIndex + 1); + m_vvvElemListCut.resize(levIndex + 1); + m_vvvElemListOutside.resize(levIndex + 1); + + m_vvvElemList[levIndex].clear(); + m_vvvElemListCut[levIndex].clear(); + m_vvvElemListOutside[levIndex].clear(); + + m_vvvElemList[levIndex].resize(num_particles()); + m_vvvElemListCut[levIndex].resize(num_particles()); + m_vvvElemListOutside[levIndex].resize(num_particles()); + +// get data + typedef typename domain_traits::grid_base_object grid_base_object; +// typedef typename geometry_traits::const_iterator ElemIter; +// ElemIter iterBegin = m_spMG->begin(gridLevel.level()); +// ElemIter iterEnd = m_spMG->end(gridLevel.level()); +// ElemIter iterBegin = m_spMG->begin(m_spMG->top_level()); +// ElemIter iterEnd = m_spMG->end(m_spMG->top_level()); + + typename DoFDistribution::traits::const_iterator iter, iterEnd; + iter = dd->template begin(); + iterEnd = dd->template end(); + + // loop elements in order to compute the volume and set rhs: + for( ; iter != iterEnd; iter++) + { + // get element + grid_base_object* elem = *iter; + + for (int prtIndex = 0; prtIndex < num_particles(); ++prtIndex) + { + //int prtIndex = 0; + + ElementModus elemModus = compute_element_modus(prtIndex, elem); + + if ( elemModus == CUT_BY_INTERFACE ) + { + m_vvvElemList[levIndex][prtIndex].push_back(elem); + m_vvvElemListCut[levIndex][prtIndex].push_back(elem); + + m_spCutMarker->mark(elem); + + // for dim = 3: exclude Pyramids from assembling, i.e. set outside nodes to 'near_interface', so that element lies inside: + bool isPyramid = false; + if ( dim == 3 ) + { + if ( element_is_pyramid(elem) ) + { + isPyramid = true; + //UG_LOG("---------------------------------> is Pyramid\n"); + } + } + + // mark vrt in order to remove them from 'm_spOutsideMarker'-list! + for(size_t i = 0; i < elem->num_vertices(); ++i) + { + if ( is_outsideFluid_prtIndex(prtIndex, elem->vertex(i)) ) + { + m_spCutMarker->mark(elem->vertex(i)); + m_spFlatTopVrtMarker->mark(elem->vertex(i)); + + // for pyramids, set ALL outside nodes to 'nearInterface' nodes + // => in 'get_cutMode()': numOutside == numNearInterface => original tetrahedron + if ( 0 ) //isPyramid ) + { + m_spNearInterfaceVrtMarker->mark(elem->vertex(i)); + } + else if ( set_nearInterface(elem->vertex(i))) + { + if ( !m_spNearInterfaceVrtMarker->is_marked(elem->vertex(i))) + UG_THROW("hmmm...muesste schon laengst markiert sein...oder noch nicht implementiert in 'set_nearInterface!!\n"); + } + } + } + } + else if ( elemModus == OUTSIDE_DOM ) + { + m_spOutsideMarker->mark(elem); + m_vvvElemList[levIndex][prtIndex].push_back(elem); + m_vvvElemListOutside[levIndex][prtIndex].push_back(elem); + } + else // INSIDE_DOM + { + if ( elemModus != INSIDE_DOM ) + UG_THROW("in 'update_marker()': no case found for 'elemModus'!\n"); + } + + } // end particle loop + } // end elem-loop + + UG_LOG("update_marker done...\n"); + + +} + + + +// same fuction as in class 'FlatTopHandler', but since m_spParticleHandlerLocal is not a member of +// CutElementHandlerFlatTop, there is no option for using it +template +bool CutElementHandlerFlatTop:: +element_is_pyramid(grid_base_object* elem) +{ + + size_t numOutside = 0; + size_t numNearInterface = 0; + + for(size_t i = 0; i < elem->num_vertices(); ++i) + { + if ( is_outsideFluid(elem->vertex(i)) ) + { + numOutside++; + if ( is_nearInterfaceVertex(elem->vertex(i), i) ) + numNearInterface++; + } + } + +// Pyramid + if ( numOutside == 2 && numNearInterface == 1 ) + return true; + + return false; + +} + + +template +int CutElementHandlerFlatTop:: +get_Index(const GridLevel& gridLevel, ConstSmartPtr dd) +{ + std::pair::iterator,bool> ret; + ret = m_Map.insert ( std::pair(gridLevel,m_Map.size()) ); +// if ( gridLevel == TOPLEVEL ) +// m_myProvider->set_indexTopGrid(m_Map.size()); + + if (ret.second==false) { +// std::cout << "element already existed"; +// std::cout << " with a value of " << ret.first->second << '\n'; + } + else{ + update_multigrid_data(dd, ret.first->second); + } + + return ret.first->second; +} + +template +int CutElementHandlerFlatTop:: +get_Index(const GridLevel& gridLevel) +{ + std::map::iterator it; + it = m_Map.find(gridLevel); +// if NO element is found for the key 'gridLevel', the iterator points to the end: + if (it == m_Map.end()) + UG_THROW("in CutElementHandlerFlatTop::get_Index(): no data available on gridLevel " << gridLevel << "!\n"); + + return it->second; +} + + +template +int CutElementHandlerFlatTop:: +get_Index_old(const GridLevel& gridLevel) +{ +// get level for computation: + // if gridlevel = TOP: gridLevel->level() = -1 => get regular topLevel + GridLevel level; + if ( gridLevel.level() == -1 ) + { + size_t topLev = m_spMG->num_levels()-1; + level = GridLevel(topLev, GridLevel::LEVEL); + } + else + level = gridLevel; + +// get according map entry + std::pair::iterator,bool> ret; + ret = m_Map.insert ( std::pair(level,m_Map.size()) ); + +// Error if entry did not exist for given level + if ( ret.second ) + UG_THROW("CutElementHandlerFlatTop::get_Index():" + " no data given for grid level " << level.level() << "\n"); + + return ret.first->second; + +} + + +template +void CutElementHandlerFlatTop:: +update_multigrid_data(ConstSmartPtr dd, const int levIndex) +{ +// 1. 'update_marker()', because also the element lists are written, + update_marker(dd, levIndex); +// 2. set 'm_vvvGlobalIndices_linearVel/m_vvvGlobalIndices_angularVel' + update_global_indices(dd, levIndex); + +} + + +template +void CutElementHandlerFlatTop:: +print_elem_lists(ConstSmartPtr dd) +{ + +// get data + typedef typename DoFDistribution::traits::const_iterator ElemIter; + ElemIter iterBegin = dd->begin(); + ElemIter iterEnd = dd->end(); + + const char* filename; + std::string name; + char ext[50]; sprintf(ext, "txt"); + FILE* printFile; + + // loop elements in order to compute the volume and set rhs: + for(ElemIter elemIter = iterBegin; elemIter != iterEnd; ++elemIter) + { + // get element + grid_base_object* elem = *elemIter; + + // get all corner coordinates + std::vector > vCornerCoords; + CollectCornerCoordinates(vCornerCoords, *elem, m_aaPos); + + if ( m_spOutsideMarker->is_marked(elem) ) + { + filename = "File_OutsideMarker."; + name = filename; + name.append(ext); + printFile = fopen(name.c_str(), "a"); + fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); + for ( size_t i = 0; i < 3; ++i ) + fprintf(printFile," vCornerCoords: %e, %e \n", vCornerCoords[i][0], vCornerCoords[i][1]); + fclose(printFile); + } + if ( m_spFlatTopVrtMarker->is_marked(elem) ) + { + filename = "File_TrueCutElemMarker."; + name = filename; + name.append(ext); + printFile = fopen(name.c_str(), "a"); + fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); + for ( size_t i = 0; i < 3; ++i ) + fprintf(printFile," vCornerCoords: %e, %e \n", vCornerCoords[i][0], vCornerCoords[i][1]); + fclose(printFile); + } + + + // loop vertices + for(size_t i = 0; i < elem->num_vertices(); ++i) + { + // get vertex + Vertex* vrt = elem->vertex(i); + if ( m_spFlatTopVrtMarker->is_marked(vrt) ) + { + filename = "File_m_pFlatTopMarker_Vrt."; + name = filename; + name.append(ext); + printFile = fopen(name.c_str(), "a"); + fprintf(printFile," vCornerCoords: %e, %e \n", m_aaPos[vrt][0], m_aaPos[vrt][1]); + fclose(printFile); + } + if ( m_spOutsideMarker->is_marked(vrt) ) + { + filename = "File_m_pOutsideMarker_Vrt."; + name = filename; + name.append(ext); + printFile = fopen(name.c_str(), "a"); + fprintf(printFile," vCornerCoords: %e, %e \n", m_aaPos[vrt][0], m_aaPos[vrt][1]); + fclose(printFile); + } + if ( !m_spOutsideMarker->is_marked(vrt) && !m_spFlatTopVrtMarker->is_marked(vrt) ) + { + filename = "File_m_pInsideMarker_Vrt."; + name = filename; + name.append(ext); + printFile = fopen(name.c_str(), "a"); + fprintf(printFile," vCornerCoords: %e, %e \n", m_aaPos[vrt][0], m_aaPos[vrt][1]); + fclose(printFile); + } + if ( m_spNearInterfaceVrtMarker->is_marked(vrt) ) + { + filename = "File_m_pNearInterfaceVrtMarker_Vrt."; + name = filename; + name.append(ext); + printFile = fopen(name.c_str(), "a"); + fprintf(printFile," vCornerCoords: %e, %e \n", m_aaPos[vrt][0], m_aaPos[vrt][1]); + fclose(printFile); + } + + } + } + + +} + +template +template +void CutElementHandlerFlatTop:: +init(ConstSmartPtr dd, const int baseLevel, const int topLevel) +{ +// clear all marks in grid + clear_bool_marker(); + +// clear data associated to gridlevel + m_Map.clear(); + + update_multigrid_data(dd, topLevel); +/* +// loop all levels: update data associated to gridlevel + for (size_t lev = topLevel; (int)lev >= baseLevel; lev--) + print_elem_lists(dd); + +*/ +} + + + +} // end ug namespace + + + +#endif /* CUT_ELEMENT_HANDLER_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed_impl.h new file mode 100644 index 000000000..5e45fd4ac --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed_impl.h @@ -0,0 +1,288 @@ +/* + * interface_handler_local_impl.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef CUT_ELEMENT_HANDLER_IMMERSED_IMPL_H_ +#define CUT_ELEMENT_HANDLER_IMMERSED_IMPL_H_ + + + +namespace ug{ + + +template +CutElementHandlerImmersed:: +CutElementHandlerImmersed(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider) + : m_spInterfaceProvider(interfaceProvider), + m_fctNames(fctNames), m_spMG(mg.operator->()), + m_bElementNearInterface(false) +{ + m_vPrtIndex.resize(3); + m_vvVertexMode.resize(2); + + m_vThresholdOnLevel.resize(mg->num_levels(), 0.0); + + m_verticesNearPos.clear(); + m_MapNearVertices.clear(); + + // get position attachment + m_aPos = GetDefaultPositionAttachment(); + +// let position accessor access Vertex Coordinates + if(!m_spMG->has_attachment(m_aPos)) + m_spMG->attach_to(m_aPos); + m_aaPos.access(*m_spMG, m_aPos); + +} + + +template +bool CutElementHandlerImmersed:: +is_nearInterface(Vertex* vrt, const number threshold) +{ + number localThres; + // default value of threshold = 0.0 => set minimal thres for 'ON interface'-case! + if (threshold == 0.0) + localThres = 1e-9; + else localThres = threshold; + + const MathVector& center = get_center(0); + const number radius = m_spInterfaceProvider->get_radius(0); + const number dist = VecDistance(m_aaPos[vrt], center); + + if (fabs(dist - radius) < localThres) + { + const char* filename = "0_near_vertex"; + std::string name(filename); + char ext[50]; sprintf(ext, ".txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + fprintf(outputFile,"nearPos: %e \t %e (%e, %e)\n", m_aaPos[vrt][0], m_aaPos[vrt][1], fabs(dist - radius), threshold); + fclose(outputFile); + + return true; + } + return false; +} + +template +bool CutElementHandlerImmersed:: +is_outsideDomain_inverse(Vertex* vrt) +{ +// get data + const MathVector& vrtPos = m_aaPos[vrt]; + const MathVector& center = get_center(0); + const number radius = m_spInterfaceProvider->get_radius(0); + +// compute + if ( is_nearInterface(vrt) ) + return true; + else if ( (VecDistance(vrtPos, center)-radius) > 1e-10) + return true; + + return false; +} + +template +bool CutElementHandlerImmersed:: +is_outsideDomain(Vertex* vrt) +{ +// get data + const MathVector& vrtPos = m_aaPos[vrt]; + const MathVector& center = get_center(0); + const number radius = m_spInterfaceProvider->get_radius(0); + +// compute + if ( is_nearInterface(vrt) ) + return true; + else if ( (VecDistance(vrtPos, center)-radius) < 1e-10) + return true; + + return false; +} + +// methode wegen komplizierten doppelt gemoppelt in 'compute_element_modes(): return bool +// fuer is_outside() und set_interface nicht optimal! +template +VertexModus CutElementHandlerImmersed:: +compute_vertex_modus(Vertex* vrt, const int interfaceOrientation) +{ + if ( is_nearInterface(vrt) ) + return ON_INTERFACE; + else if ( is_outsideDomain(vrt, interfaceOrientation) ) + return OUTSIDE; + else + return INSIDE; +} + +template +size_t CutElementHandlerImmersed:: +get_or_insert_vertex_near(const MathVector& vrtPos) +{ + std::pair,size_t>::iterator,bool> ret; + ret = m_MapNearVertices.insert ( std::pair,size_t>(vrtPos,m_MapNearVertices.size()) ); + + if (ret.second==false) { + //UG_LOG("element already existed with a value of " << ret.first->second << "\n"); + } + else{ + m_verticesNearPos.push_back(vrtPos); + } + + if ( 0 ) + { + UG_LOG("m_verticesNearPos.size(): " << m_verticesNearPos.size() << "\n"); + + for ( size_t i = 0; i < m_verticesNearPos.size(); ++i) + UG_LOG("m_verticesNearPos: " << m_verticesNearPos[i][0] << " , " << m_verticesNearPos[i][1] << "\n"); + } + + return ret.first->second; +} + + +template +ElementModus CutElementHandlerImmersed:: +compute_element_modus(GridObject* elem, const int interfaceOrientation) +{ + size_t localInd = -0.5*interfaceOrientation + 0.5; + m_vvVertexMode[localInd].clear(); + + bool insideFluid = false; + bool outsideFluid = false; + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + m_aaPos.access(*m_spMG, m_aPos); + m_vVertexMode.clear(); + + m_bElementNearInterface = false; + + size_t num_onInterface = 0; + size_t num_outside = 0; + size_t num_inside = 0; + + // loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrt = vVertex[i]; + if ( is_nearInterface(vrt) ) + { + num_onInterface++; + + get_or_insert_vertex_near(m_aaPos[vrt]); + UG_LOG("is near Interface: " << m_aaPos[vrt][0] << "\t" << m_aaPos[vrt][1] << "\n"); + m_vVertexMode.push_back(ON_INTERFACE); + m_vvVertexMode[localInd].push_back(ON_INTERFACE); + outsideFluid = true; + m_bElementNearInterface = true; + } + else if ( is_outsideDomain(vrt, interfaceOrientation) ) + { + num_outside++; + m_vVertexMode.push_back(OUTSIDE); + m_vvVertexMode[localInd].push_back(OUTSIDE); + outsideFluid = true; + } + else + { + num_inside++; + m_vVertexMode.push_back(INSIDE); + m_vvVertexMode[localInd].push_back(INSIDE); + insideFluid = true; + + if ( is_nearInterface(vrt) ) + UG_THROW("CutElementHandlerImmersed::compute_element_modus(): case 'is_nearInterface(vrt) = true' not possible!\n"); + } + } // vertex loop + + size_t checkOut = num_onInterface + num_outside; + size_t checkIn = num_onInterface + num_inside; + + if ( checkOut == vVertex.size() ) m_elementModus = OUTSIDE_DOM; + else if ( checkIn == vVertex.size() ) m_elementModus = INSIDE_DOM; + else if (insideFluid && outsideFluid) + { + m_elementModus = CUT_BY_INTERFACE; + } + else if (outsideFluid) m_elementModus = OUTSIDE_DOM; + else m_elementModus = INSIDE_DOM; + + return m_elementModus; + +} + + + +template +int CutElementHandlerImmersed:: +get_Index(const GridLevel& gridLevel, ConstSmartPtr dd) +{ + std::pair::iterator,bool> ret; + ret = m_Map.insert ( std::pair(gridLevel,m_Map.size()) ); +// if ( gridLevel == TOPLEVEL ) +// m_myProvider->set_indexTopGrid(m_Map.size()); + + if (ret.second==false) { +// std::cout << "element already existed"; +// std::cout << " with a value of " << ret.first->second << '\n'; + } + else{ + //update_multigrid_data(dd, ret.first->second); + } + + return ret.first->second; +} + +template +int CutElementHandlerImmersed:: +get_Index(const GridLevel& gridLevel) +{ + std::map::iterator it; + it = m_Map.find(gridLevel); +// if NO element is found for the key 'gridLevel', the iterator points to the end: + if (it == m_Map.end()) + UG_THROW("in CutElementHandlerImmersed::get_Index(): no data available on gridLevel " << gridLevel << "!\n"); + + return it->second; +} + + +template +int CutElementHandlerImmersed:: +get_Index_old(const GridLevel& gridLevel) +{ +// get level for computation: + // if gridlevel = TOP: gridLevel->level() = -1 => get regular topLevel + GridLevel level; + if ( gridLevel.level() == -1 ) + { + size_t topLev = m_spMG->num_levels()-1; + level = GridLevel(topLev, GridLevel::LEVEL); + } + else + level = gridLevel; + +// get according map entry + std::pair::iterator,bool> ret; + ret = m_Map.insert ( std::pair(level,m_Map.size()) ); + +// Error if entry did not exist for given level + if ( ret.second ) + UG_THROW("CutElementHandlerImmersed::get_Index():" + " no data given for grid level " << level.level() << "\n"); + + return ret.first->second; + +} + + + +} // end ug namespace + + + +#endif /* CUT_ELEMENT_HANDLER_IMMERSED_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer.h b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer.h new file mode 100644 index 000000000..262ed84e7 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer.h @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt + * Author: Susanne Hoellbacher + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__UG__LIB_DISC__OPERATOR__LINEAR_OPERATOR__PARTICLE_TRANSFER__ +#define __H__UG__LIB_DISC__OPERATOR__LINEAR_OPERATOR__PARTICLE_TRANSFER__ + +// extern headers +#include + +// other ug4 modules +#include "common/common.h" +#include "lib_disc/operator/linear_operator/transfer_interface.h" +#include "lib_algebra/operator/debug_writer.h" +#include "../cut_element_handler/cut_element_handler.h" + +#ifdef UG_PARALLEL +#include "lib_disc/parallelization/parallelization_util.h" +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Almost the same implementation as 'StdTransfer' (see std_transfer.h) +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Changes compared to the StdTransfer class are the call of +// 'modify_vector()' in the method 'prolongate()' and 'restrict()'. +// +// The physical solution values are set in each inactive nodes within +// particles in order to transfer the valid solutions between the levels. +//////////////////////////////////////////////////////////////////////////////// + +namespace ug{ + +//template +//class Particle; + +/// Prologation Operator for P1 Approximation Spaces + +template +class ParticleTransfer : + virtual public ITransferOperator +{ + public: + /// world Dimension + static const int dim = TDomain::dim; + + /// Type of base class + typedef ITransferOperator base_type; + + /// Type of Algebra + typedef TAlgebra algebra_type; + + /// Type of Vector + typedef typename TAlgebra::vector_type vector_type; + + /// Type of Matrix + typedef typename TAlgebra::matrix_type matrix_type; + + /// Type of Domain + typedef TDomain domain_type; + + /// Type of GridFunction + typedef GridFunction GF; + + typedef typename domain_traits::grid_base_object grid_base_object; + + public: + /// Constructor + ParticleTransfer(SmartPtr > approxSpace, SmartPtr > cutElementHandler) : + ITransferOperator(), + m_p1LagrangeOptimizationEnabled(true), + m_dampRes(1.0), bCached(true), m_bUseTransposed(false), + m_spDebugWriter(NULL), + m_spParticleHandlerGlobal(cutElementHandler) + {}; + + /// Default constructor + ParticleTransfer() : ITransferOperator(), + m_p1LagrangeOptimizationEnabled(true), + m_dampRes(1.0), m_dampProl(1.0), + bCached(true), m_bUseTransposed(false), + m_spDebugWriter(NULL) + {}; + + /// virtual destructor + virtual ~ParticleTransfer(){}; + + /// set restriction damping (only applied on vector operation, not (!!) in assembled matrices) + void set_restriction_damping(number damp) {m_dampRes = damp;} + + /// set prolongation damping (only applied on vector operation, not (!!) in assembled matrices) + void set_prolongation_damping(number damp) {m_dampProl = damp;} + + /// set debug writer + void set_debug(SmartPtr > spDebugWriter) { + m_spDebugWriter = spDebugWriter; + } + /// computes the mode for setting the weighting alpha for the edges during prolongate_p1(): + size_t get_vertex_mode(Vertex* coarseVrt0, Vertex* coarseVrt1, Vertex* childVrt ); + size_t get_vertex_index(Vertex* vrt, GridObject* elem); + + /// enables/disables an assembling optimization for p1-lagrange elements + /** The optimization is enabled by default. It can however only be used, + * if all elements are refined with their standard refinement rule. If one + * uses anisotropic refinement or refinement with closure, the optimization + * should be disabled. + * \todo The normal assembling strategy should be optimized in such a way + * that the p1-lagrange optimization is no longer required. This + * however involves something like a ref-type-hash for each element, + * which returns a unique number based on the types and order of children.*/ + void enable_p1_lagrange_optimization(bool enable) {m_p1LagrangeOptimizationEnabled = enable;} + bool p1_lagrange_optimization_enabled() const {return m_p1LagrangeOptimizationEnabled;} + + /// sets if restriction and prolongation are transposed + void set_use_transposed(bool bTransposed) {m_bUseTransposed = bTransposed;} + /// sets if restriction and prolongation are transposed + void set_global_handler(SmartPtr > spCutElementHandler) {m_spParticleHandlerGlobal = spCutElementHandler;} + + + public: + /// Set levels + virtual void set_levels(GridLevel coarseLevel, GridLevel fineLevel) {} + + /// initialize the operator + virtual void init() {} + + /// returns new instance with same setting + virtual SmartPtr > clone(); + + /// apply Operator, interpolate function + virtual void prolongate(vector_type& uFine, const vector_type& uCoarse){ + GF* pFine = dynamic_cast(&uFine); + const GF* pCoarse = dynamic_cast(&uCoarse); + if(!pFine || !pCoarse) + UG_THROW("ParticleTransfer: fine and coarse vectors expected to be " + "a grid function."); + prolongate(*pFine, *pCoarse); + } + + /// necessary adjustment for transInd and rotInd: + void adjust_prolongation(vector_type& corrFine, GridLevel fineLvl, + const vector_type& corrCoarse, GridLevel coarseLvl, + ConstSmartPtr > spApproxSpace); + + /// apply transposed Operator, restrict function + virtual void do_restrict(vector_type& uCoarse, const vector_type& uFine){ + const GF* pFine = dynamic_cast(&uFine); + GF* pCoarse = dynamic_cast(&uCoarse); + if(!pFine || !pCoarse) + UG_THROW("ParticleTransfer: fine and coarse vectors expected to be " + "a grid function."); + do_restrict(*pCoarse, *pFine); + } + + /// necessary adjustment for transInd and rotInd: + void adjust_restriction(vector_type& dCoarse, GridLevel coarseLvl, + const vector_type& dFine, GridLevel fineLvl, + ConstSmartPtr > spApproxSpace); + + /// helper function called during adjust_prolongation()/adjust_restriction(): + void set_solution_to_zero(vector_type& sol, const int levIndex, const int prtIndex, ConstSmartPtr dd); + + + public: + /// returns prolongation as a matrix + virtual SmartPtr + prolongation(const GridLevel& fineGL, const GridLevel& coarseGL, + ConstSmartPtr > spApproxSpace); + + /// returns restriction as a matrix + virtual SmartPtr + restriction(const GridLevel& coarseGL, const GridLevel& fineGL, + ConstSmartPtr > spApproxSpace); + + /// apply operator to a grid function + void prolongate(GF& uFine, const GF& uCoarse); + + /// apply operator to a grid function + void do_restrict(GF& uCoarse, const GF& uFine); + + protected: + /// debug writing of matrix + void write_debug(const matrix_type& mat, std::string name, + const GridLevel& glTo, const GridLevel& glFrom); + + template + void assemble_restriction(matrix_type& mat, + const DoFDistribution& coarseDD, + const DoFDistribution& fineDD, + ConstSmartPtr spDomain); + void assemble_restriction(matrix_type& mat, + const DoFDistribution& coarseDD, + const DoFDistribution& fineDD, + ConstSmartPtr spDomain); + + template + void assemble_prolongation(matrix_type& mat, + const DoFDistribution& fineDD, + const DoFDistribution& coarseDD, + ConstSmartPtr spDomain); + void assemble_prolongation(matrix_type& mat, + const DoFDistribution& fineDD, + const DoFDistribution& coarseDD, + ConstSmartPtr spDomain); + + void assemble_prolongation_p1(matrix_type& mat, + const DoFDistribution& fineDD, + const DoFDistribution& coarseDD); + + protected: + /// struct to distinguish already assembled operators + struct TransferKey{ + TransferKey(const GridLevel& toGL_, const GridLevel& fromGL_, + const RevisionCounter& revCnt_) + : toGL(toGL_), fromGL(fromGL_), revCnt(revCnt_) {} + GridLevel toGL, fromGL; + RevisionCounter revCnt; + + bool operator<(const TransferKey& other) const { + if(revCnt != other.revCnt) return revCnt < other.revCnt; + if(toGL != other.toGL) return toGL < other.toGL; + return fromGL < other.fromGL; + } + }; + + typedef std::map > TransferMap; + TransferMap m_mRestriction; + TransferMap m_mProlongation; + + void remove_outdated(TransferMap& map, const RevisionCounter& revCnt) { + typedef typename TransferMap::iterator iterator; + for(iterator iter = map.begin(); iter != map.end();) + { + const RevisionCounter& cnt = iter->first.revCnt; + if((cnt.obj() == revCnt.obj()) && (cnt != revCnt)){ + map.erase(iter++); + } else { + ++iter; + } + } + } + + protected: + /// list of post processes + using base_type::m_vConstraint; + + /// flag for p1-lagrange-optimization + bool m_p1LagrangeOptimizationEnabled; + + /// damping parameter + number m_dampRes; + number m_dampProl; + + /// flag if cached (matrix) transfer used + bool bCached; + + /// flag if transposed is used + bool m_bUseTransposed; + + /// debug writer + SmartPtr > m_spDebugWriter; + + // new member + SmartPtr > m_spParticleHandlerGlobal; + + +}; + +} // end namespace ug + +#include "particle_transfer_impl.h" + +#endif /* __H__UG__LIB_DISC__OPERATOR__LINEAR_OPERATOR__PARTICLE_TRANSFER__ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer_impl.h new file mode 100644 index 000000000..1a4baad6a --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer_impl.h @@ -0,0 +1,1483 @@ +/* + * Copyright (c) 2012-2015: G-CSC, Goethe University Frankfurt + * Author: Susanne Hoellbacher + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__UG__LIB_DISC__OPERATOR__LINEAR_OPERATOR__PARTICLE_TRANSFER_IMPL__ +#define __H__UG__LIB_DISC__OPERATOR__LINEAR_OPERATOR__PARTICLE_TRANSFER_IMPL__ + +#include "particle_transfer.h" +#include "lib_disc/reference_element/reference_mapping_provider.h" +#include "lib_disc/local_finite_element/local_finite_element_provider.h" +#include "lib_disc/function_spaces/grid_function_util.h" +#include "lib_grid/algorithms/debug_util.h" // ElementDebugInfo + +//////////////////////////////////////////////////////////////////////////////// +// Almost the same implementation as 'ParticleTransfer' (see std_transfer.h) +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Changes compared to the 'ParticleTransfer' class are the call of +// 'modify_vector()' in the method 'prolongate()' and 'restrict()'. +// +// The physical solution values are set in each inactive nodes within +// particles in order to transfer the valid solutions between the levels. +//////////////////////////////////////////////////////////////////////////////// + + +namespace ug{ + + template + void ParticleAssembleInjectionForP1Lagrange1(typename TAlgebra::matrix_type& mat, + const DoFDistribution& coarseDD, + const DoFDistribution& fineDD) + { + + PROFILE_FUNC_GROUP("gmg"); + // Allow only lagrange P1 functions + for(size_t fct = 0; fct < fineDD.num_fct(); ++fct) + if(fineDD.local_finite_element_id(fct).type() != LFEID::LAGRANGE || + fineDD.local_finite_element_id(fct).order() != 1) + UG_THROW("AssembleInjectionForP1Lagrange: " + "Interpolation only implemented for Lagrange P1 functions."); + + // get MultiGrid + const MultiGrid& grid = *coarseDD.multi_grid(); + + // get number of dofs on different levels + // const size_t numFineDoFs = fineDD.num_indices(); + // const size_t numCoarseDoFs = coarseDD.num_indices(); + + // resize matrix + //mat.resize_and_clear(numCoarseDoFs, numFineDoFs); + + std::vector coarseInd, fineInd; + + // RegularVertex iterators + typedef DoFDistribution::traits::const_iterator const_iterator; + const_iterator iter, iterBegin, iterEnd; + + iterBegin = fineDD.template begin(); + iterEnd = fineDD.template end(); + + // loop nodes of fine subset + for(iter = iterBegin; iter != iterEnd; ++iter) + { + // get father + GridObject* geomObj = grid.get_parent(*iter); + Vertex* vert = dynamic_cast(geomObj); + + // Check if father is RegularVertex + if(vert != NULL) + { + // get global indices + coarseDD.inner_algebra_indices(vert, coarseInd); + } + else continue; + + // get global indices + fineDD.inner_algebra_indices(*iter, fineInd); + + for(size_t i = 0; i < coarseInd.size(); ++i) + mat(coarseInd[i], fineInd[i]) = 1.0; + } + } + + + template + void ParticleAssembleInjectionForP1Lagrange2(typename TAlgebra::matrix_type& P, + const DoFDistribution& coarseDD, + const DoFDistribution& fineDD) + { + UG_THROW("OK2...\n"); + PROFILE_FUNC_GROUP("gmg"); + // allow only lagrange P1 functions + for(size_t fct = 0; fct < fineDD.num_fct(); ++fct) + if(fineDD.lfeid(fct).type() != LFEID::LAGRANGE || + fineDD.lfeid(fct).order() != 1) + UG_THROW("AssembleStdProlongationForP1Lagrange:" + "Interpolation only implemented for Lagrange P1 functions."); + + // resize matrix + P.resize_and_clear(fineDD.num_indices(), coarseDD.num_indices()); + + // iterators + const MultiGrid& mg = *coarseDD.multi_grid(); + typedef DoFDistribution::traits::const_iterator const_iterator; + const_iterator iter, iterBegin, iterEnd; + + // loop subsets on fine level + std::vector vParentIndex, vChildIndex; + std::vector vParentDoF, vChildDoF; + for(int si = 0; si < fineDD.num_subsets(); ++si) + { + iterBegin = fineDD.template begin(si); + iterEnd = fineDD.template end(si); + + // loop vertices for fine level subset + for(iter = iterBegin; iter != iterEnd; ++iter) + { + // get element + Vertex* child = *iter; + + // get father + GridObject* parent = mg.get_parent(child); + + // check if child contained in coarseDD. This should always be false + // for a GridLevel::LEVEL, but might be the case for GridLevel::SURFACE + // and an adaptive grid-part used by both dds. In such a case we can + // simply set identity. + if(coarseDD.is_contained(child)){ + // get indices + coarseDD.inner_algebra_indices(child, vParentIndex); + fineDD.inner_algebra_indices(child, vChildIndex); + UG_ASSERT(vParentIndex.size() == vChildIndex.size(), "Size mismatch"); + + // set identity + for(size_t i = 0; i < vParentIndex.size(); ++i) + P(vChildIndex[i], vParentIndex[i]) = 1.0; + + // this child is perfectly handled + continue; + } + else{ + // check if parent exists (this should always be the case, except in + // the case that 'child' is a v-slave) + if(!parent) continue; + + if(!coarseDD.is_contained(parent)){ + UG_THROW("ParticleTransfer: A parent element is not contained in " + " coarse-dd nor the child element in the coarse-dd. " + "This should not happen.") + } + } + + // type of father + const ReferenceObjectID roid = parent->reference_object_id(); + + // loop all components + for(size_t fct = 0; fct < fineDD.num_fct(); fct++) + { + // check that fct defined on subset + if(!fineDD.is_def_in_subset(fct, si)) continue; + + // get global indices + fineDD.inner_dof_indices(child, fct, vChildDoF); + + // detect type of father + switch(roid) + { + case ROID_VERTEX: + { + Vertex* vrt = dynamic_cast(parent); + coarseDD.inner_dof_indices(vrt, fct, vParentDoF); + DoFRef(P, vChildDoF[0], vParentDoF[0]) = 1.0; + } + break; + default: UG_THROW("AssembleStdProlongationForP1Lagrange: Element Father" + "is of unsupported type "< + void ParticleTransfer:: + set_solution_to_zero(vector_type& sol, const int levIndex, const int prtIndex, ConstSmartPtr dd) + { + + typedef typename std::vector::iterator ListIter; + std::vector ElemListLog = m_spParticleHandlerGlobal->m_vvvElemListCut[levIndex][prtIndex]; + + for(ListIter listIter = ElemListLog.begin(); listIter != ElemListLog.end(); ++listIter) + { + // collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spParticleHandlerGlobal->m_spMG, *listIter); + + // loop vertices + for(size_t v = 0; v < vVertex.size(); ++v) + { + if ( m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(vVertex[v]) ) + { + // loop velocity DoFs + for (size_t fct = 0; fct < dim; ++fct) + { + // create multi index + std::vector vInd; + // get multi indices + if(dd->inner_dof_indices(vVertex[v], fct, vInd) != 1) + UG_THROW("Only one index expected."); + + // set velocity solution in FlatTopVrt to zero + DoFRef(sol, vInd[0]) = 0.0; + } + } + + } // end vrt-loop + } // end cutElem-loop + + } + + template + void ParticleTransfer:: + adjust_prolongation(vector_type& corrFine, GridLevel fineLvl, + const vector_type& corrCoarse, GridLevel coarseLvl, + ConstSmartPtr > spApproxSpace) + { + const int coarseIndex = m_spParticleHandlerGlobal->get_Index(coarseLvl); + const int fineIndex = m_spParticleHandlerGlobal->get_Index(fineLvl); + + size_t numPrt = m_spParticleHandlerGlobal->num_particles(); + for(size_t p = 0; p < numPrt; ++p) + { + +#ifdef UG_PARALLEL + std::vector< grid_base_object* > ElemList = m_spParticleHandlerGlobal->m_vvvElemListCut[fineIndex][p]; + if( ElemList.size() == 0 ) + continue; +#endif + /////////////////////////////////////////////////////////// + // 1) projection of the defect of extrapolated ghost vrt: + //////////////////////////////////////////////////////////// + + ConstSmartPtr ddFine = spApproxSpace->dof_distribution(fineLvl); + set_solution_to_zero(corrFine, fineIndex, p, ddFine); + + /////////////////////////////////////////////////////////// + // 2) injection for extraDoFs: + //////////////////////////////////////////////////////////// + std::vector transIndCoarse = m_spParticleHandlerGlobal->get_transInd(coarseIndex, p); + std::vector rotIndCoarse = m_spParticleHandlerGlobal->get_rotInd(coarseIndex, p); + + std::vector transIndFine = m_spParticleHandlerGlobal->get_transInd(fineIndex, p); + std::vector rotIndFine = m_spParticleHandlerGlobal->get_rotInd(fineIndex, p); + + for ( int d = 0; d < dim; ++d ) + { + DoFRef(corrFine, transIndFine[d]) = DoFRef(corrCoarse, transIndCoarse[d]); + DoFRef(corrFine, rotIndFine[d]) = DoFRef(corrCoarse, rotIndCoarse[d]); + } + } + + + } + + + template + void ParticleTransfer:: + adjust_restriction(vector_type& dCoarse, GridLevel coarseLvl, + const vector_type& dFine, GridLevel fineLvl, + ConstSmartPtr > spApproxSpace) + { + // UG_LOG("nothing...\n"); + + ConstSmartPtr ddCoarse = spApproxSpace->dof_distribution(coarseLvl); + ConstSmartPtr ddFine = spApproxSpace->dof_distribution(coarseLvl); + + const int coarseIndex = m_spParticleHandlerGlobal->get_Index(coarseLvl,ddCoarse); + const int fineIndex = m_spParticleHandlerGlobal->get_Index(fineLvl,ddFine); + + size_t numPrt = m_spParticleHandlerGlobal->num_particles(); + // loop over all particles and initialize defects: + for(size_t p = 0; p < numPrt; ++p) + { + +#ifdef UG_PARALLEL + std::vector< grid_base_object* > ElemList = m_spParticleHandlerGlobal->m_vvvElemListCut[fineIndex][p]; + if( ElemList.size() == 0 ) + continue; +#endif + + /////////////////////////////////////////////////////////// + // 1) set solution outside fluid to zero: + //////////////////////////////////////////////////////////// + + set_solution_to_zero(dCoarse, coarseIndex, p, ddCoarse); + + /////////////////////////////////////////////////////////// + // 2) injection for extraDoFs: + //////////////////////////////////////////////////////////// + std::vector transIndCoarse = m_spParticleHandlerGlobal->get_transInd(coarseIndex, p); + std::vector rotIndCoarse = m_spParticleHandlerGlobal->get_rotInd(coarseIndex, p); + + std::vector transIndFine = m_spParticleHandlerGlobal->get_transInd(fineIndex, p); + std::vector rotIndFine = m_spParticleHandlerGlobal->get_rotInd(fineIndex, p); + + for ( int d = 0; d < dim; ++d ) + { + DoFRef(dCoarse, transIndCoarse[d]) = DoFRef(dFine, transIndFine[d]); + DoFRef(dCoarse, rotIndCoarse[d]) = DoFRef(dFine, rotIndFine[d]); + } + + } + + } + + + template + size_t ParticleTransfer:: + get_vertex_index(Vertex* vrt, GridObject* elem) + { + std::vector vVertex; + CollectVertices(vVertex, *m_spParticleHandlerGlobal->m_spMG, elem); + + for(size_t i = 0; i < vVertex.size(); ++i) + if ( vrt == vVertex[i]) + return i; + + UG_THROW("in CutElementHandlerImmersed::get_vertex_index: no index found!\n"); + } + + + template + size_t ParticleTransfer:: + get_vertex_mode(Vertex* coarseVrt0, Vertex* coarseVrt1, Vertex* childVrt ) + { + ////////////////////////////////////////////////////////// + // alpha = (0.5, 0.5) => mode = 0 + // alpha = (0.0, 0.0) => mode = 1 + // alpha = (1.0, 0.0) => mode = 2 + // alpha = new weight => mode = 3 + ////////////////////////////////////////////////////////// + + bool bCoarseVrt0_isInside = false; + bool bCoarseVrt1_isInside = false; + bool bChildVrt_isInside = false; + + + if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt0) && !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt0)) + bCoarseVrt0_isInside = true; + if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt1) && !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt1)) + bCoarseVrt1_isInside = true; + if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(childVrt) && !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(childVrt)) + bChildVrt_isInside = true; + + int prtIndex = -1; + bool isOutside_vrt0 = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, coarseVrt0); + bool isOutside_vrt1 = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, coarseVrt1); + + if ( m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt0) && !isOutside_vrt0 ) + UG_THROW("inconsistent 0!\n"); + if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt0) && isOutside_vrt0 ) + UG_THROW("inconsistent 1!\n"); + if ( m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt1) && !isOutside_vrt1 ) + UG_THROW("inconsistent 2!\n"); + if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt1) && isOutside_vrt1 ) + UG_THROW("inconsistent 3!\n"); + + // inside edge => alpha = (0.5, 0.5) + if ( bCoarseVrt0_isInside && bCoarseVrt1_isInside) + return 0; + // flat top edge => alpha = (0.5, 0.5) OR (1.0, 0.0) OR alphaNew! + // both flat top => alpha = (0.5,0.5) for pressure, for vel: reset later during adjust_prolongation: + else if ( m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt0) && m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt1) ) + return 0; + // outside edge => alpha = (0.0, 0.0) + else if ( m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt0) && m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt1) ) + return 1; + else if ( !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt0) && !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt1) ) + {UG_THROW("error in 'particle_transfer_impl:get_vertex_mode': one vertex must be flat top!\n");} + + // check: exactly one vertex must be inside: + else if ( !bCoarseVrt0_isInside && !bCoarseVrt1_isInside ) + {UG_THROW("error in 'particle_transfer_impl:get_vertex_mode': one vertex must be inside!\n");} + // if one vertex is inside, BUT the FlatTopVertex is also ON interface: (0.5, 0.5) ! + else if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker->is_marked(coarseVrt0) || m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker->is_marked(coarseVrt1) ) + { + /* std::vector vParentDoF; + coarseDD.inner_dof_indices(coarseVrt0, 0, vParentDoF); + if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker.is_marked(coarseVrt0) ) + UG_THROW("oho 0: vParentDoF = " << vParentDoF[0] << "\n"); + coarseDD.inner_dof_indices(coarseVrt1, 0, vParentDoF); + if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker.is_marked(coarseVrt1) ) + UG_THROW("oho 1: vParentDoF = " << vParentDoF[0] << "\n");*/ + if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker->is_marked(coarseVrt0) ) + UG_LOG("0 pos: " << m_spParticleHandlerGlobal->m_aaPos[coarseVrt0] << "\n"); + + if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker->is_marked(coarseVrt1) ) + UG_LOG("1: pos: " << m_spParticleHandlerGlobal->m_aaPos[coarseVrt1] << "\n"); + return 0; + } + // childVertex lies inside => compute new weigthing for prolongation! + else if ( bChildVrt_isInside ) + return 3; + // childVertex lies outside AND on flat top edge => constant prologation for pressure and reset during + // adjust_prolongation for velocity: + else + return 2; + + UG_THROW("error in 'particle_transfer_impl:get_vertex_mode': no case found!\n"); + + } + + +////////////////////////////////////////////////////////// +/// Std-Transfer methods +////////////////////////////////////////////////////////// + +template +void ParticleTransfer:: +assemble_prolongation_p1(matrix_type& P, + const DoFDistribution& fineDD, + const DoFDistribution& coarseDD) +{ + PROFILE_FUNC_GROUP("gmg"); +// allow only lagrange P1 functions + for(size_t fct = 0; fct < fineDD.num_fct(); ++fct) + if(fineDD.lfeid(fct).type() != LFEID::LAGRANGE || + fineDD.lfeid(fct).order() != 1) + UG_THROW("AssembleStdProlongationForP1Lagrange:" + "Interpolation only implemented for Lagrange P1 functions."); + +// resize matrix + P.resize_and_clear(fineDD.num_indices(), coarseDD.num_indices()); + + UG_LOG("begin assemble_prolongation_p1:\n"); + +// iterators + const MultiGrid& mg = *coarseDD.multi_grid(); + typedef DoFDistribution::traits::const_iterator const_iterator; + const_iterator iter, iterBegin, iterEnd; + +// loop subsets on fine level + std::vector vParentIndex, vChildIndex; + std::vector vParentDoF, vChildDoF; + for(int si = 0; si < fineDD.num_subsets(); ++si) + { + iterBegin = fineDD.template begin(si); + iterEnd = fineDD.template end(si); + + // loop vertices for fine level subset + for(iter = iterBegin; iter != iterEnd; ++iter) + { + // get element + Vertex* child = *iter; + + // get father + GridObject* parent = mg.get_parent(child); + + // check if child contained in coarseDD. This should always be false + // for a GridLevel::LEVEL, but might be the case for GridLevel::SURFACE + // and an adaptive grid-part used by both dds. In such a case we can + // simply set identity. + if(coarseDD.is_contained(child)){ + // get indices + coarseDD.inner_algebra_indices(child, vParentIndex); + fineDD.inner_algebra_indices(child, vChildIndex); + UG_ASSERT(vParentIndex.size() == vChildIndex.size(), "Size mismatch"); + + // set identity + for(size_t i = 0; i < vParentIndex.size(); ++i) + P(vChildIndex[i], vParentIndex[i]) = 1.0; + + // this child is perfectly handled + continue; + } + else{ + // check if parent exists (this should always be the case, except in + // the case that 'child' is a v-slave) + if(!parent) continue; + + if(!coarseDD.is_contained(parent)){ + UG_THROW("ParticleTransfer: Parent element \n" + << ElementDebugInfo(mg, parent) << + "is not contained in coarse-dd nor the child element\n" + << ElementDebugInfo(mg, child) << + " in the coarse-dd. This should not happen.") + } + } + + // type of father + const ReferenceObjectID roid = parent->reference_object_id(); + + // loop all components + for(size_t fct = 0; fct < fineDD.num_fct(); fct++) + { + // check that fct defined on subset + if(!fineDD.is_def_in_subset(fct, si)) continue; + + // get global indices + fineDD.inner_dof_indices(child, fct, vChildDoF); + + // detect type of father + switch(roid) + { + case ROID_VERTEX: + { + Vertex* vrt = dynamic_cast(parent); + coarseDD.inner_dof_indices(vrt, fct, vParentDoF); + DoFRef(P, vChildDoF[0], vParentDoF[0]) = 1.0; + } + break; + case ROID_EDGE: + { + Edge* edge = dynamic_cast(parent); + std::vector alpha; + alpha.resize(2,0.5); + + bool newWeights1 = false; + bool newWeights2 = false; + MathVector intersectionPnt; + int prtIndex = -1; + + bool isOutside_vrt0 = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, edge->vertex(0)); + bool isOutside_vrt1 = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, edge->vertex(1)); + size_t vrtInd0 = get_vertex_index(edge->vertex(0), parent); + size_t vrtInd1 = get_vertex_index(edge->vertex(1), parent); + + /* + // output stuff: + std::vector vParentDoF1; + coarseDD.inner_dof_indices(edge->vertex(0), 0, vParentDoF1); + UG_LOG("oho 0: vParentDoF1 = " << vParentDoF1[0] << "\n"); + std::vector vParentDoF2; + coarseDD.inner_dof_indices(edge->vertex(1), 0, vParentDoF2); + UG_LOG("oho 1: vParentDoF2 = " << vParentDoF2[0] << "\n"); + */ + size_t vertexMode = get_vertex_mode(edge->vertex(0), edge->vertex(1), child); + + //bool isOutside_childDoF = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, child); + + + if ( vertexMode == 1 ) + { + alpha[1] = alpha[0] = 0.0; + } + else if ( vertexMode == 2 ) + { + if ( isOutside_vrt0 && isOutside_vrt1 ) + UG_THROW("hmmmm\n"); + if ( isOutside_vrt0 ) + {alpha[1] = 0.0; alpha[0] = 1.0;} + else + {alpha[1] = 1.0; alpha[0] = 0.0;} + } + // only new weighting, if childDoF insideFluid => get boolian isInside_childDoF + else if ( vertexMode == 3 ) //!isOutside_childDoF ) + { + UG_LOG("vertexMode == 3\n"); + + // case1: vrt0 = insideFluid && vrt1 = outsideFluid: + if ( !isOutside_vrt0 && isOutside_vrt1 ){ + + coarseDD.inner_dof_indices(edge->vertex(1), fct, vParentDoF); + if ( m_spParticleHandlerGlobal->is_nearInterfaceVertex(edge->vertex(1), vrtInd1) ) + UG_THROW("1 oho, vParentDoF = " << vParentDoF[0] << "\n"); + + + m_spParticleHandlerGlobal->m_spInterfaceProvider->get_intersection_point(intersectionPnt, m_spParticleHandlerGlobal->m_aaPos[edge->vertex(0)], m_spParticleHandlerGlobal->m_aaPos[edge->vertex(1)], prtIndex, alpha); + newWeights1 = true; + coarseDD.inner_dof_indices(edge->vertex(0), fct, vParentDoF); + UG_LOG("1: vertex[0] = " << vParentDoF[0] << "\n"); + UG_LOG("1: alpha = " << alpha[0] << ", " << alpha[1] << "\n"); + UG_LOG("VORHER: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); + + alpha[0] = 0.5/alpha[0]; + alpha[1] = 1.0 - alpha[0]; + // UG_THROW("NACHHER: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); + } + // case1: vrt0 = outsideFluid && vrt1 = insideFluid: + else if ( isOutside_vrt0 && !isOutside_vrt1 ){ + + coarseDD.inner_dof_indices(edge->vertex(0), fct, vParentDoF); + if ( m_spParticleHandlerGlobal->is_nearInterfaceVertex(edge->vertex(0), vrtInd0) ) + UG_THROW("2 oho, vParentDoF = " << vParentDoF[0] << "\n"); + + m_spParticleHandlerGlobal->m_spInterfaceProvider->get_intersection_point(intersectionPnt, m_spParticleHandlerGlobal->m_aaPos[edge->vertex(1)], m_spParticleHandlerGlobal->m_aaPos[edge->vertex(0)], prtIndex, alpha); + newWeights2 = true; + coarseDD.inner_dof_indices(edge->vertex(1), fct, vParentDoF); + UG_LOG("2: vertex[0] = " << vParentDoF[0] << "\n"); + UG_LOG("2: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); + UG_LOG("VORHER: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); + + // switch also ordering of original alpha!!! + alpha[1] = 0.5/alpha[0]; + alpha[0] = 1.0 - alpha[1]; + // UG_THROW("NACHHER: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); + } + else + UG_THROW("vertexMode == 3: hmmm\n"); + + } // end if (vertexMode == 3 ) + else if ( vertexMode != 0 ) + UG_THROW("in particle_transfer_impl.h: no valid vertexMode computed: vertexMode = " << vertexMode << "\n"); + + + for(int i = 0; i < 2; ++i) + { + Edge* edge = dynamic_cast(parent); + coarseDD.inner_dof_indices(edge->vertex(i), fct, vParentDoF); + + // use prtIndices for prolongation if 'isOutside_parentDoF': + bool isOutside_parentDoF = false; + + if ( newWeights2 || newWeights1 ) + isOutside_parentDoF = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, edge->vertex(i)); + + if ( isOutside_parentDoF && fct != dim ) + { + const int coarseIndex = m_spParticleHandlerGlobal->get_Index(coarseDD.grid_level()); + + std::vector transIndCoarse = m_spParticleHandlerGlobal->get_transInd(coarseIndex, prtIndex); + + std::vector rotIndCoarse = m_spParticleHandlerGlobal->get_rotInd(coarseIndex, prtIndex); + + /* UG_LOG("fct = " << fct << "\n"); + UG_LOG("transIndCoarse[0] = " << transIndCoarse[0] << "\n"); + UG_LOG("transIndCoarse[1] = " << transIndCoarse[1] << "\n"); + UG_LOG("transIndCoarse[fct] = " << transIndCoarse[fct] << "\n"); + */ + + // use of 'transIndCoarse[fct]', since 'normally' it is: + // fct == vParentDoF[0][1] + DoFRef(P, vChildDoF[0], transIndCoarse[fct]) = alpha[i]; + DoFRef(P, vChildDoF[0], rotIndCoarse[fct]) = alpha[i]; + // iff NOT 'normal' case: EXIT!! + if ( vParentDoF[0][1] != fct ) + UG_THROW("no natural index mapping => use of incex 'fct' not valid for next operation!\n"); + + } + else + DoFRef(P, vChildDoF[0], vParentDoF[0]) = alpha[i]; + if ( 0 ) //newWeights2 || newWeights1 ) + { + UG_LOG("intersectionPnt = " << intersectionPnt << "\n"); + UG_LOG("i = " << i << "vParentDoF[0] = " << vParentDoF[0] << "\n"); + UG_LOG("i = " << i << "vChildDoF[0] = " << vChildDoF[0] << "\n"); + UG_LOG("alpha[i] = " << alpha[i] << "\n"); + + UG_LOG("DoFRef(P, vChildDoF[0], vParentDoF[0]) = " << DoFRef(P, vChildDoF[0], vParentDoF[0]) << "\n"); + + } + + } + } + break; + case ROID_QUADRILATERAL: + for(int i = 0; i < 4; ++i) + { + Face* face = dynamic_cast(parent); + coarseDD.inner_dof_indices(face->vertex(i), fct, vParentDoF); + DoFRef(P, vChildDoF[0], vParentDoF[0]) = 0.25; + } + break; + case ROID_HEXAHEDRON: + for(int i = 0; i < 8; ++i) + { + Volume* hexaeder = dynamic_cast(parent); + coarseDD.inner_dof_indices(hexaeder->vertex(i), fct, vParentDoF); + DoFRef(P, vChildDoF[0], vParentDoF[0]) = 0.125; + } + break; + default: UG_THROW("AssembleStdProlongationForP1Lagrange: Element father" + " is of unsupported type "<< roid << " for " + << ElementDebugInfo(mg, child) << "."); + } + } + } + } +} +/* +template +void ProjectGlobalPositionToElem(std::vector >& vGlobPos, + GridObject* parent, const TDomain& domain) +{ + const int parentDim = parent->base_object_id(); + + // vertex and full dim parent must match + if(parentDim == 0 || parentDim == TDomain::dim) + return; + +// get the vertices + std::vector > vCornerCoord; + switch(parentDim) + { + case EDGE: + { + CollectCornerCoordinates(vCornerCoord, *static_cast(parent), domain, true); + MathVector dir; + VecSubtract(dir, vCornerCoord[1], vCornerCoord[0]); + for(size_t p = 0; p < vGlobPos.size(); ++p){ + ProjectPointToRay(vGlobPos[p], vGlobPos[p], vCornerCoord[0], dir); + } + } + break; + case FACE: + { + CollectCornerCoordinates(vCornerCoord, *static_cast(parent), domain, true); + MathVector normal; + MathVector a, b; + VecSubtract(a, vCornerCoord[1], vCornerCoord[0]); + VecSubtract(b, vCornerCoord[2], vCornerCoord[0]); + VecCross(normal, a,b); + + for(size_t p = 0; p < vGlobPos.size(); ++p){ + ProjectPointToPlane(vGlobPos[p], vGlobPos[p], vCornerCoord[0], normal); + } + } + break; + default: UG_THROW( "Base Object type not found."); + } +} +*/ + + +template +template +void ParticleTransfer:: +assemble_prolongation(matrix_type& P, + const DoFDistribution& fineDD, + const DoFDistribution& coarseDD, + ConstSmartPtr spDomain) +{ + PROFILE_FUNC_GROUP("gmg"); + +// iterators + MultiGrid& mg = *const_cast(coarseDD.multi_grid().get()); + typedef typename DoFDistribution::traits::const_iterator const_iterator; + const_iterator iter, iterBegin, iterEnd; + +// loop subsets on coarse level + std::vector vParentDoF, vChildDoF; + std::vector vParentIndex, vChildIndex; + for(int si = 0; si < fineDD.num_subsets(); ++si) + { + iterBegin = fineDD.template begin(si); + iterEnd = fineDD.template end(si); + + // check, which cmps to consider on this subset + std::vector vLFEID; + std::vector vFct; + for(size_t fct = 0; fct < fineDD.num_fct(); ++fct){ + if(fineDD.max_fct_dofs(fct, TChild::dim, si) == 0) continue; + vFct.push_back(fct); + vLFEID.push_back(fineDD.lfeid(fct)); + } + if(vFct.empty()) continue; + + // loop elems on coarse level for subset + for(iter = iterBegin; iter != iterEnd; ++iter) + { + // get child + TChild* child = *iter; + + // get parent + GridObject* parent = mg.get_parent(child); + + // check if child contained in coarseDD. This should always be false + // for a GridLevel::LEVEL, but might be the case for GridLevel::SURFACE + // and an adaptive grid-part used by both dds. In such a case we can + // simply set identity. + if(coarseDD.is_contained(child)){ + // get indices + coarseDD.inner_algebra_indices(child, vParentIndex); + fineDD.inner_algebra_indices(child, vChildIndex); + UG_ASSERT(vParentIndex.size() == vChildIndex.size(), "Size mismatch"); + + // set identity + for(size_t i = 0; i < vParentIndex.size(); ++i) + P(vChildIndex[i], vParentIndex[i]) = 1.0; + + // this child is perfectly handled + continue; + } + else{ + + // check if parent exists (this should always be the case, except in + // the case that 'child' is a v-slave) + if(!parent) continue; + + if(!coarseDD.is_contained(parent)){ + UG_THROW("ParticleTransfer: A parent element is not contained in " + " coarse-dd nor the child element in the coarse-dd. " + "This should not happen.") + } + } + + // loop all components + for(size_t f = 0; f < vFct.size(); f++) + { + // get comp and lfeid + const size_t fct = vFct[f]; + const LFEID& lfeID = vLFEID[f]; + + // get global indices + fineDD.inner_dof_indices(child, fct, vChildDoF); + + // switch space type + switch(lfeID.type()) + { + case LFEID::PIECEWISE_CONSTANT: + { + coarseDD.dof_indices(parent, fct, vParentDoF); + UG_ASSERT(vChildDoF.size() == 1, "Must be one."); + UG_ASSERT(vParentDoF.size() == 1, "Must be one."); + + DoFRef(P, vChildDoF[0], vParentDoF[0]) = 1.0; + } + break; + + case LFEID::CROUZEIX_RAVIART: + { + // get dimension of parent + const int parentDim = parent->base_object_id(); + std::vector vParent; + + // check if to interpolate from neighbor elems + if(parentDim == lfeID.dim()){ + // case: Side inner to parent. --> Parent fine. + vParent.push_back(parent); + } else if(parentDim == lfeID.dim() - 1){ + // case: parent is Side. --> Get neighbor elems + typedef typename TChild::sideof TElem; + std::vector vElem; + coarseDD.collect_associated(vElem, parent); + for(size_t p = 0; p < vElem.size(); ++p) + vParent.push_back(vElem[p]); + + } else { + UG_THROW("ParticleTransfer: For CR parent must be full-dim " + "elem or a side (dim-1). But has dim: "< > vDoFPos; + InnerDoFPosition(vDoFPos, child, *spDomain, lfeID); + + // loop contributions from parents + for(size_t i = 0; i < vParent.size(); ++i) + { + // get coarse indices + coarseDD.dof_indices(vParent[i], fct, vParentDoF); + + // get shapes at global positions + std::vector > vvShape; + ShapesAtGlobalPosition(vvShape, vDoFPos, vParent[i], *spDomain, lfeID); + + // add restriction + for(size_t ip = 0; ip < vvShape.size(); ++ip) + for(size_t sh = 0; sh < vvShape[ip].size(); ++sh) + DoFRef(P, vChildDoF[ip], vParentDoF[sh]) += + (1./vParent.size()) * vvShape[ip][sh]; + } + } + break; + + case LFEID::LAGRANGE: + { + // get coarse indices + coarseDD.dof_indices(parent, fct, vParentDoF); + + // global positions of child dofs + std::vector > vDoFPos; + InnerDoFPosition(vDoFPos, child, *spDomain, lfeID); + + // project + // ProjectGlobalPositionToElem(vDoFPos, parent, *spDomain); + + // get shapes at global positions + std::vector > vvShape; + ShapesAtGlobalPosition(vvShape, vDoFPos, parent, *spDomain, lfeID); + + // set restriction + for(size_t ip = 0; ip < vvShape.size(); ++ip) + for(size_t sh = 0; sh < vvShape[ip].size(); ++sh) + DoFRef(P, vChildDoF[ip], vParentDoF[sh]) = vvShape[ip][sh]; + } + break; + + default: + UG_THROW("ParticleTransfer: Local-Finite-Element: "< +void ParticleTransfer:: +assemble_prolongation(matrix_type& P, + const DoFDistribution& fineDD, + const DoFDistribution& coarseDD, + ConstSmartPtr spDomain) +{ + // resize matrix + P.resize_and_clear(fineDD.num_indices(), coarseDD.num_indices()); + + // loop all base types carrying indices on fine elems + if(fineDD.max_dofs(VERTEX)) assemble_prolongation(P, fineDD, coarseDD, spDomain); + if(fineDD.max_dofs(EDGE)) assemble_prolongation(P, fineDD, coarseDD, spDomain); + if(fineDD.max_dofs(FACE)) assemble_prolongation(P, fineDD, coarseDD, spDomain); + if(fineDD.max_dofs(VOLUME)) assemble_prolongation(P, fineDD, coarseDD, spDomain); +} + + +template +template +void ParticleTransfer:: +assemble_restriction(matrix_type& R, + const DoFDistribution& coarseDD, + const DoFDistribution& fineDD, + ConstSmartPtr spDomain) +{ + PROFILE_FUNC_GROUP("gmg"); + +// iterators + MultiGrid& mg = *const_cast(coarseDD.multi_grid().get()); + typedef typename DoFDistribution::traits::const_iterator const_iterator; + const_iterator iter, iterBegin, iterEnd; + +// loop subsets on coarse level + std::vector vParentDoF, vChildDoF; + std::vector vParentIndex, vChildIndex; + for(int si = 0; si < fineDD.num_subsets(); ++si) + { + iterBegin = fineDD.template begin(si); + iterEnd = fineDD.template end(si); + + // check, which cmps to consider on this subset + std::vector vLFEID; + std::vector vFct; + for(size_t fct = 0; fct < fineDD.num_fct(); ++fct){ + if(fineDD.max_fct_dofs(fct, TChild::dim, si) == 0) continue; + vFct.push_back(fct); + vLFEID.push_back(fineDD.lfeid(fct)); + } + if(vFct.empty()) continue; + + // loop elems on coarse level for subset + for(iter = iterBegin; iter != iterEnd; ++iter) + { + // get child + TChild* child = *iter; + + // get parent + GridObject* parent = mg.get_parent(child); + + // check if child contained in coarseDD. This should always be false + // for a GridLevel::LEVEL, but might be the case for GridLevel::SURFACE + // and an adaptive grid-part used by both dds. In such a case we can + // simply set identity. + if(coarseDD.is_contained(child)){ + // get indices + coarseDD.inner_algebra_indices(child, vParentIndex); + fineDD.inner_algebra_indices(child, vChildIndex); + UG_ASSERT(vParentIndex.size() == vChildIndex.size(), "Size mismatch"); + + // set identity + for(size_t i = 0; i < vParentIndex.size(); ++i) + R(vParentIndex[i], vChildIndex[i]) = 1.0; + + // this child is perfectly handled + continue; + } + else{ + + // check if parent exists (this should always be the case, except in + // the case that 'child' is a v-slave) + if(!parent) continue; + + if(!coarseDD.is_contained(parent)){ + UG_THROW("ParticleTransfer: A parent element is not contained in " + " coarse-dd nor the child element in the coarse-dd. " + "This should not happen.") + } + } + + // loop all components + for(size_t f = 0; f < vFct.size(); f++) + { + // get comp and lfeid + const size_t fct = vFct[f]; + const LFEID& lfeID = vLFEID[f]; + + // get global indices + fineDD.inner_dof_indices(child, fct, vChildDoF); + + // switch space type + switch(lfeID.type()) + { + case LFEID::PIECEWISE_CONSTANT: + { + coarseDD.dof_indices(parent, fct, vParentDoF); + UG_ASSERT(vChildDoF.size() == 1, "Must be one."); + UG_ASSERT(vParentDoF.size() == 1, "Must be one."); + + DoFRef(R, vParentDoF[0], vChildDoF[0]) = 1.0; + } + break; + + case LFEID::CROUZEIX_RAVIART: + { + // get dimension of parent + const int parentDim = parent->base_object_id(); + std::vector vParent; + + // check if to interpolate from neighbor elems + if(parentDim == lfeID.dim()){ + // case: Side inner to parent. --> Parent fine. + vParent.push_back(parent); + } else if(parentDim == lfeID.dim() - 1){ + // case: parent is Side. --> Get neighbor elems + typedef typename TChild::sideof TElem; + std::vector vElem; + coarseDD.collect_associated(vElem, parent); + for(size_t p = 0; p < vElem.size(); ++p){ + // NOTE: This is not the transposed of the prolongation + // in adaptive case, since we only restrict to + // covered parts. + if(mg.num_children(vElem[p]) > 0) + vParent.push_back(vElem[p]); + } + + } else { + UG_THROW("ParticleTransfer: For CR parent must be full-dim " + "elem or a side (dim-1). But has dim: "< > vDoFPos; + InnerDoFPosition(vDoFPos, child, *spDomain, lfeID); + + // loop contributions from parents + for(size_t i = 0; i < vParent.size(); ++i) + { + // get coarse indices + coarseDD.dof_indices(vParent[i], fct, vParentDoF); + + // get shapes at global positions + std::vector > vvShape; + ShapesAtGlobalPosition(vvShape, vDoFPos, vParent[i], *spDomain, lfeID); + + // add restriction + for(size_t ip = 0; ip < vvShape.size(); ++ip) + for(size_t sh = 0; sh < vvShape[ip].size(); ++sh) + DoFRef(R, vParentDoF[sh], vChildDoF[ip]) += + (1./vParent.size()) * vvShape[ip][sh]; + } + } + break; + + case LFEID::LAGRANGE: + { + // get coarse indices + coarseDD.dof_indices(parent, fct, vParentDoF); + + // global positions of child dofs + std::vector > vDoFPos; + InnerDoFPosition(vDoFPos, child, *spDomain, lfeID); + + // get shapes at global positions + std::vector > vvShape; + ShapesAtGlobalPosition(vvShape, vDoFPos, parent, *spDomain, lfeID); + + // set restriction + for(size_t ip = 0; ip < vvShape.size(); ++ip) + { + + for(size_t sh = 0; sh < vvShape[ip].size(); ++sh) + { + // vertex on coarse grid which is FT can possibly have no child => injection fails! + // => project average of neighbouring pressure - which is naturally zero in irrelevant vertices:-) + + // global positions of child dofs + std::vector > vDoFPosParent; + InnerDoFPosition(vDoFPosParent, parent, *spDomain, lfeID); + if ( vDoFPosParent.size() == 2 ) + UG_THROW("vDoFPosParent.size() == 2, but = " << vDoFPosParent.size() << "\n"); + + switch(parent->base_object_id()) + { + case VERTEX: + { + const char* filename = "parent_vertex"; + std::string name(filename); + char ext[50]; sprintf(ext, ".txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + // create multi index + std::vector vInd; // ToDo: hier std::vector?? + // get multi indices + Vertex* vrt = static_cast(parent); + if(coarseDD.dof_indices(vrt, fct, vInd) != 1) + UG_THROW("Only one index expected."); + if ( m_spParticleHandlerGlobal->is_FTVertex(vrt) ) + { + fprintf(outputFile,"ParentPos: %e \t %e (index = %lu)\n", vDoFPosParent[0][0], vDoFPosParent[0][1], vInd[0][0]); + DoFRef(R, vParentDoF[sh], vChildDoF[ip]) = vvShape[ip][sh]; + } + fclose(outputFile); + + } + break; + case EDGE: + { + + const char* filename = "parent_edge"; + std::string name(filename); + char ext[50]; sprintf(ext, ".txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + Edge* edge = dynamic_cast(parent); + + for ( size_t i = 0; i < 2; ++i ) + { + // create multi index + std::vector vInd; // ToDo: hier std::vector?? + // get multi indices + if(coarseDD.dof_indices(edge->vertex(i), fct, vInd) != 1) + UG_THROW("Only one index expected."); + if ( m_spParticleHandlerGlobal->is_FTVertex(edge->vertex(i)) && vParentDoF[sh][0] == vInd[0][0] ) + { + fprintf(outputFile,"vParentDoF[%lu], vInd[0]: %lu \t %lu \n", i, vParentDoF[sh][0], vInd[0][0]); + DoFRef(R, vParentDoF[sh], vChildDoF[ip]) = vvShape[ip][sh]; + } + } + fclose(outputFile); + + + } + break; + case FACE: UG_THROW("Parent type wrong: Is FACE, but should be always VERTEX for triangular grids!"); break; + case VOLUME: UG_THROW("Parent type wrong: Is VOLUME, but should be always VERTEX for triangular grids!"); break; + default: UG_THROW("Base Object type not found."); + } + // if ( vParentDoF[sh] ) + + } + } + } + break; + + default: + UG_THROW("ParticleTransfer: Local-Finite-Element: "< +void ParticleTransfer:: +assemble_restriction(matrix_type& R, + const DoFDistribution& coarseDD, + const DoFDistribution& fineDD, + ConstSmartPtr spDomain) +{ + // resize matrix + R.resize_and_clear(coarseDD.num_indices(), fineDD.num_indices()); + + // loop all base types carrying indices on fine elems + if(fineDD.max_dofs(VERTEX)) assemble_restriction(R, coarseDD, fineDD, spDomain); + if(fineDD.max_dofs(EDGE)) assemble_restriction(R, coarseDD, fineDD, spDomain); + if(fineDD.max_dofs(FACE)) assemble_restriction(R, coarseDD, fineDD, spDomain); + if(fineDD.max_dofs(VOLUME)) assemble_restriction(R, coarseDD, fineDD, spDomain); +} + + +template +SmartPtr +ParticleTransfer:: +prolongation(const GridLevel& fineGL, const GridLevel& coarseGL, + ConstSmartPtr > spApproxSpace) +{ + UG_LOG("begin prolongation:\n"); + + if(fineGL.level() - coarseGL.level() != 1) + UG_THROW("ParticleTransfer: Can only project between successive level, " + "but fine = "< +SmartPtr +ParticleTransfer:: +restriction(const GridLevel& coarseGL, const GridLevel& fineGL, + ConstSmartPtr > spApproxSpace) +{ + if(fineGL.level() - coarseGL.level() != 1) + UG_THROW("ParticleTransfer: Can only project between successive level, " + "but fine = "< +void ParticleTransfer:: +prolongate(GF& uFine, const GF& uCoarse) +{ + PROFILE_FUNC_GROUP("gmg"); + + if(!bCached) + UG_THROW("ParticleTransfer: currently only cached implemented."); + + const GridLevel& coarseGL = uCoarse.grid_level(); + const GridLevel& fineGL = uFine.grid_level(); + ConstSmartPtr > spApproxSpace = uFine.approx_space(); + if(uCoarse.approx_space() != spApproxSpace) + UG_THROW("ParticleTransfer: cannot prolongate between grid functions from " + "different approximation spaces."); + + try{ + //prolongation(fineGL, coarseGL, spApproxSpace)->apply(uFine, uCoarse); +#ifdef UG_PARALLEL + MatMultDirect(uFine, m_dampProl, *prolongation(fineGL, coarseGL, spApproxSpace), uCoarse); +#else + prolongation(fineGL, coarseGL, spApproxSpace)->axpy(uFine, 0.0, uFine, m_dampProl, uCoarse); +#endif + + // adjust using constraints + for (int type = 1; type < CT_ALL; type = type << 1) + { + for (size_t i = 0; i < m_vConstraint.size(); ++i) + { + if (m_vConstraint[i]->type() & type) + m_vConstraint[i]->adjust_prolongation(uFine, fineGL, uCoarse, coarseGL, type); + } + } + + adjust_prolongation(uFine, fineGL, uCoarse, coarseGL, spApproxSpace); + + } + UG_CATCH_THROW("ParticleTransfer:prolongation: Failed for fine = "< > spApproxSpace = uFine.approx_space(); + if(uCoarse.approx_space() != spApproxSpace) + UG_THROW("ParticleTransfer: cannot prolongate between grid functions from " + "different approximation spaces."); + try{ + + restriction(coarseGL, fineGL, spApproxSpace)-> + apply_ignore_zero_rows(uCoarse, m_dampRes, uFine); + + +// m_spParticleHandlerGlobal->plotCoarse(uCoarse); +// m_spParticleHandlerGlobal->plotFine(uFine); + + // adjust using constraints + for (int type = 1; type < CT_ALL; type = type << 1) + { + for (size_t i = 0; i < m_vConstraint.size(); ++i) + { + if (m_vConstraint[i]->type() & type) + m_vConstraint[i]->adjust_restriction(uCoarse, coarseGL, uFine, fineGL, type); + } + } + + adjust_restriction(uCoarse, coarseGL, uFine, fineGL, spApproxSpace); + + } UG_CATCH_THROW("ParticleTransfer:do_restrict: Failed for fine = "< > dbgWriter = + m_spDebugWriter.template cast_dynamic >(); + +// check success + if(dbgWriter.invalid()) return; + +// add iter count to name + name.append("_").append(ToString(glTo.level())); + name.append("_").append(ToString(glFrom.level())); + name.append(".mat"); + +// write + GridLevel gridLev = dbgWriter->grid_level(); + dbgWriter->set_grid_levels(glFrom, glTo); + dbgWriter->write_matrix(mat, name.c_str()); + dbgWriter->set_grid_level(gridLev); +} + +} // end namespace ug + +#endif /* __H__UG__LIB_DISC__OPERATOR__LINEAR_OPERATOR__PARTICLE_TRANSFER_IMPL__ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base.h b/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base.h new file mode 100644 index 000000000..afc7802ad --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base.h @@ -0,0 +1,209 @@ +/* + * moving_interface.h + * + * Created on: 15.01.2015 + * Author: susanne hoellbacher + */ + +#ifndef IMMERSED_INTERFACE_BASE_H_ +#define IMMERSED_INTERFACE_BASE_H_ + +#include "lib_disc/assemble_interface.h" +#include "lib_disc/spatial_disc/local_to_global/local_to_global_mapper.h" +#include "interface_handler/interface_handler_base.h" +#include "lib_disc/spatial_disc/disc_util/fv1Cut_geom.h" +#include "lib_disc/spatial_disc/disc_util/fv1FT_geom.h" + +namespace ug{ + +////////////////////////////////////////////////////////////////////////////////// +// class 'IInterfaceMapper': member of class 'IMovingInterface' (see below) +////////////////////////////////////////////////////////////////////////////////// + +template +class IInterfaceMapper : public ILocalToGlobalMapper +{ + public: + /// Algebra type + typedef TAlgebra algebra_type; + + /// Type of algebra matrix + typedef typename algebra_type::matrix_type matrix_type; + + /// Type of algebra vector + typedef typename algebra_type::vector_type vector_type; + + public: + /// default Constructor + IInterfaceMapper(){}; + + IInterfaceMapper(SmartPtr localHandler); + + /// send local entries to global matrix + virtual void add_local_mat_to_global(matrix_type& mat, const LocalMatrix& lmat, + ConstSmartPtr dd); + virtual void add_local_mat_to_global_interface(matrix_type& mat, const LocalMatrix& lmat, + ConstSmartPtr dd){}; + virtual void add_local_mat_to_global_interface_for2(matrix_type& mat, const LocalMatrix& lmat, + ConstSmartPtr dd){}; + + /// send local entries to global rhs + virtual void add_local_vec_to_global(vector_type& vec, const LocalVector& lvec, + ConstSmartPtr dd); + virtual void add_local_vec_to_global_interface(vector_type& vec, const LocalVector& lvec, + ConstSmartPtr dd){} + virtual void add_local_vec_to_global_interface_for2(vector_type& vec, const LocalVector& lvec, + ConstSmartPtr dd){} + + /// modifies local solution vector for adapted defect computation + virtual void modify_LocalData(LocalMatrix& locJ, LocalVector& locU, + ConstSmartPtr dd){}; + virtual void modify_LocalData(LocalVectorTimeSeries& uT, LocalMatrix& locJ, LocalVector& locU, + ConstSmartPtr dd){}; + + virtual void modify_LocalData(LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, + ConstSmartPtr dd){}; + virtual void modify_LocalData(LocalVectorTimeSeries& uT, LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, + ConstSmartPtr dd, size_t t){}; + + /// modifies global solution vector for adapted defect computation + virtual void modify_GlobalSol(vector_type& vecMod, const vector_type& vec, + ConstSmartPtr dd){}; + + virtual void modify_GlobalSol(SmartPtr > vSolMod, + ConstSmartPtr > vSol, + ConstSmartPtr dd){}; + + virtual void set_identity_mat(matrix_type& mat, const LocalMatrix& lmat, + ConstSmartPtr dd); + + /// virtual destructor + virtual ~IInterfaceMapper() {}; + + private: + SmartPtr m_spInterfaceHandlerLocal; + + +}; + +////////////////////////////////////////////////////////////////////////////////// +// class 'IInterfaceBndCond': member of class 'IMovingInterface' (see below) +////////////////////////////////////////////////////////////////////////////////// + +template +class IInterfaceBndCond : public IElemDisc +{ + /// world Dimension + static const int dim = TDomain::dim; + + public: + /// defautl constructor + IInterfaceBndCond(const char* functions, const char* subsets, + SmartPtr localHandler); + IInterfaceBndCond(const std::vector& vFct, const std::vector& vSubset, + SmartPtr localHandler); + /// virtual destructor + ~IInterfaceBndCond() {}; +/* + public: + /// type of trial space for each function used + void prepare_setting(const std::vector& vLfeID, bool bNonRegularGrid, bool bStaticRoid) + { UG_THROW("'IInterfaceBndCond::prepare_setting' not implemented!\n"); } + + /// prepares the element loop + template + void prep_elem_loop(const ReferenceObjectID roid, const int si) + { UG_THROW("'IInterfaceBndCond::prep_elem_loop' not implemented!\n"); } + + /// prepares the element for evaluation + template + void prep_elem(const LocalVector& u, GridObject* elem, + const ReferenceObjectID roid, const MathVector vCornerCoords[]) + { UG_THROW("'IInterfaceBndCond::prep_elem' not implemented!\n"); } + + /// finishes the element loop + template + void fsh_elem_loop() + { UG_THROW("'IInterfaceBndCond::fsh_elem_loop' not implemented!\n"); } + + /// adds the stiffness part to the local jacobian + template + void add_jac_A_elem(LocalMatrix& J, const LocalVector& u, GridObject* elem, + const MathVector vCornerCoords[]) + { UG_THROW("'IInterfaceBndCond::add_jac_A_elem' not implemented!\n"); } + + /// adds the stiffness part to the local defect + template + void add_def_A_elem(LocalVector& d, const LocalVector& u, GridObject* elem, + const MathVector vCornerCoords[]) + { UG_THROW("'IInterfaceBndCond::add_def_A_elem' not implemented!\n"); } + + template + void add_jac_M_elem(LocalMatrix& J, const LocalVector& u, GridObject* elem, + const MathVector vCornerCoords[]) + { UG_THROW("'IInterfaceBndCond::add_jac_M_elem' not implemented!\n"); } + + template + void add_def_M_elem(LocalVector& d, const LocalVector& u, GridObject* elem, + const MathVector vCornerCoords[]) + { UG_THROW("'IInterfaceBndCond::add_def_M_elem' not implemented!\n"); } + + template + void add_rhs_elem(LocalVector& d, GridObject* elem, const MathVector vCornerCoords[]) + { UG_THROW("'IInterfaceBndCond::add_rhs_elem' not implemented!\n"); } + +*/ + private: + SmartPtr m_spInterfaceHandlerLocal; + +}; + + +////////////////////////////////////////////////////////////////////////////////// +// main class 'IMovingInterface' +////////////////////////////////////////////////////////////////////////////////// + +template +class IMovingInterface +{ + public: + /// world Dimension + static const int dim = TDomain::dim; + + /// Algebra type + typedef TAlgebra algebra_type; + + /// Type of algebra matrix + typedef typename algebra_type::matrix_type matrix_type; + + /// Type of algebra vector + typedef typename algebra_type::vector_type vector_type; + + // default constructor + IMovingInterface(){}; + + IMovingInterface(SmartPtr > ass, + const char* functions, const char* subsets, + SmartPtr localHandler); + IMovingInterface(SmartPtr > ass, + const std::vector& vFct, const std::vector& vSubset, + SmartPtr localHandler); + + virtual ~IMovingInterface() {} + + + private: + + SmartPtr m_spInterfaceHandlerLocal; + SmartPtr > m_spInterfaceMapper; // contains member of class 'IInterfaceHandlerLocal' + SmartPtr > m_spInterfaceBndCond; // contains member of class 'IInterfaceHandlerLocal' + + +}; + + +}// end namespace ug + +#include "immersed_interface_base_impl.h" + +#endif /* IMMERSED_INTERFACE_BASE_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base_impl.h new file mode 100644 index 000000000..7cb7923f7 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base_impl.h @@ -0,0 +1,174 @@ +/* + * moving_interface_impl.h + * + * Created on: 15.01.2015 + * Author: suze + */ + +#ifndef IMMERSED_INTERFACE_BASE_IMPL_ +#define IMMERSED_INTERFACE_BASE_IMPL_ + + +namespace ug{ + +/////////////////////////////////////////////////////////// +// Implementation of the methods class +// 'IInterfaceMapper' +/////////////////////////////////////////////////////////// +template +IInterfaceMapper:: +IInterfaceMapper(SmartPtr localHandler) + : m_spInterfaceHandlerLocal(localHandler) +{ +} + + +template +void IInterfaceMapper:: +set_identity_mat(matrix_type& mat, const LocalMatrix& lmat, ConstSmartPtr dd) +{ + const LocalIndices& rowInd = lmat.get_row_indices(); + + for(size_t fct1=0; fct1 < lmat.num_all_row_fct(); ++fct1) + for(size_t dof1=0; dof1 < lmat.num_all_row_dof(fct1); ++dof1) + { + const size_t rowIndex = rowInd.index(fct1,dof1); + const size_t rowComp = rowInd.comp(fct1,dof1); + + BlockRef(mat(rowIndex, rowIndex), rowComp, rowComp) = 1.0; + + } + +} + + +template +void IInterfaceMapper:: +add_local_mat_to_global(matrix_type& mat, const LocalMatrix& lmat, ConstSmartPtr dd) +{ + ElementModus modus = m_spInterfaceHandlerLocal->elementModus(); + + switch(modus) + { + case OUTSIDE_DOM: + set_identity_mat(mat, lmat, dd); + break; + case INSIDE_DOM: + AddLocalMatrixToGlobal(mat, lmat); + break; + case CUT_BY_INTERFACE: + add_local_mat_to_global_interface(mat, lmat, dd); + break; + case CUT_BY_2_INTERFACE: + add_local_mat_to_global_interface_for2(mat, lmat, dd); + break; + default: + throw(UGError("Error in IInterfaceMapper::add_local_mat_to_global()!")); + + } + +} + + +template +void IInterfaceMapper:: +add_local_vec_to_global(vector_type& vec, const LocalVector& lvec, ConstSmartPtr dd) +{ + ElementModus modus = m_spInterfaceHandlerLocal->elementModus(); + + switch(modus) + { + case OUTSIDE_DOM: + // add nothing; + break; + case INSIDE_DOM: + AddLocalVector(vec, lvec); + break; + case CUT_BY_INTERFACE: + add_local_vec_to_global_interface(vec, lvec, dd); + break; + case CUT_BY_2_INTERFACE: + add_local_vec_to_global_interface_for2(vec, lvec, dd); + break; + default: + throw(UGError("Error in IInterfaceMapper::add_local_vec_to_global()!")); + + } +} + + +/////////////////////////////////////////////////////////// +// Implementation of the methods class +// 'IInterfaceBndCond' +/////////////////////////////////////////////////////////// + +template +IInterfaceBndCond:: +IInterfaceBndCond(const char* functions, const char* subsets, + SmartPtr localHandler) + : IElemDisc(functions, subsets), + m_spInterfaceHandlerLocal(localHandler) +{ +} + +template +IInterfaceBndCond:: +IInterfaceBndCond(const std::vector& vFct, const std::vector& vSubset, + SmartPtr localHandler) + : IElemDisc(vFct, vSubset), + m_spInterfaceHandlerLocal(localHandler) +{ +} + + +/////////////////////////////////////////////////////////// +// Implementation of the methods class +// 'IMovingInterface' +/////////////////////////////////////////////////////////// +template +IMovingInterface:: +IMovingInterface(SmartPtr > ass, + const char* functions, const char* subsets, + SmartPtr localHandler) + : m_spInterfaceHandlerLocal(localHandler), + m_spInterfaceMapper(new IInterfaceMapper(localHandler)), + m_spInterfaceBndCond(new IInterfaceBndCond(functions, subsets, localHandler)) +{ + +// m_spInterfaceHandlerLocal = localHandler; + +// m_spInterfaceMapper = make_sp(new IInterfaceMapper(localHandler)); +// m_spInterfaceBndCond = make_sp(new IInterfaceBndCond(localHandler)); + + SmartPtr > assAdapt = ass->ass_tuner(); + assAdapt->set_mapping(m_spInterfaceMapper.get()); +// assAdapt->enable_modify_solution(true); // ToDo: brauche ich das in der base class? + +} + +template +IMovingInterface:: +IMovingInterface(SmartPtr > ass, + const std::vector& vFct, const std::vector& vSubset, + SmartPtr localHandler) + : m_spInterfaceHandlerLocal(localHandler), + m_spInterfaceMapper(new IInterfaceMapper(localHandler)), + m_spInterfaceBndCond(new IInterfaceBndCond(vFct, vSubset, localHandler)) +{ + +// m_spInterfaceHandlerLocal = localHandler; + +// m_spInterfaceMapper = make_sp(new IInterfaceMapper(localHandler)); +// m_spInterfaceBndCond = make_sp(new IInterfaceBndCond(localHandler)); + + SmartPtr > assAdapt = ass->ass_tuner(); + assAdapt->set_mapping(m_spInterfaceMapper.get()); +// assAdapt->enable_modify_solution(true); // ToDo: brauche ich das in der base class? + +} + + +} // end ug namespace + + +#endif /* IMMERSED_INTERFACE_BASE_IMPL_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base.h new file mode 100644 index 000000000..0c658daa6 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base.h @@ -0,0 +1,274 @@ +/* + * interface_handler_local.h + * + * Created on: 15.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_BASE_H_ +#define INTERFACE_HANDLER_BASE_H_ + +#include "lib_grid/multi_grid.h" +#include "../cut_element_handler/cut_element_handler.h" +#include "../interface_provider/interface_provider_particle.h" + +namespace ug{ + +template +class DimFV1CutGeometry; + + +//////////////////////////////////////////////////////////////////////// +// + +class IInterfaceHandlerLocal +{ + + public: + IInterfaceHandlerLocal() : m_elemModus(INSIDE_DOM){}; + + virtual ~IInterfaceHandlerLocal(){} + + /// access to element modus + ElementModus elementModus(){ return m_elemModus; } + + //////////////////////////////////////////////////////////////////////// + /// virtual class contains all methods which need to be implemented by + /// the class, derived from 'InterfaceHandlerLocalBase' + //////////////////////////////////////////////////////////////////////// + + /// computes the element modus and writes it to 'm_elemModus' + virtual ElementModus get_element_modus(GridObject* elem) + { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: get_element_modus()."); } + + virtual ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation) + { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: compute_element_modus()."); } + + virtual bool is_FTVertex(Vertex* vrt, size_t vrtIndex) + { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: is_FTVertex()."); } + + virtual bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: is_OutsideVertex()."); } + + virtual bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: is_nearInterfaceVertex()."); } + + + protected: + /// is actual element inside or outside domain or cut by the interface? + ElementModus m_elemModus; + +}; + +template +class InterfaceHandlerLocalBase : public IInterfaceHandlerLocal +{ + +public: +/// world dimension + static const int dim = TWorldDim; + +/// max number of geometric objects in a dimension +// (most objects in 1 dim, i.e. number of edges, but +1 for 1D) + static const int maxMid = 2*dim + 1; + +/// used traits + typedef fv1_dim_traits traits; + +/// Type of position coordinates + typedef MathVector position_type; + +/// Type of Position Attachment + typedef Attachment position_attachment_type; + +/// Type of Accessor to the Position Data Attachment + typedef Grid::VertexAttachmentAccessor position_accessor_type; + + + InterfaceHandlerLocalBase(SmartPtr > cutElementHandler); + InterfaceHandlerLocalBase(SmartPtr > cutElementHandler); + + ~InterfaceHandlerLocalBase(){} + + ////////////////////////////////////////////////////////// + /// virtual base class methods: + ////////////////////////////////////////////////////////// + + /* + // used for method 'CollectCorners_': + virtual number get_LSvalue_byPosition(MathVector vrtPos) + { + // ToDo + // if ( m_prtIndex == -1 ) + // UG_THROW("'get_LSvalue_byPosition()': value of m_prtIndex not valid!\n"); + + return m_spCutElementHandler->get_LSvalue_byPosition(vrtPos); + } + virtual number get_LSvalue(Vertex* vrt, const int prtIndex) + { return m_spCutElementHandler->get_LSvalue(vrt, prtIndex); } + */ + virtual number get_LSvalue_byPosition(MathVector vrtPos) = 0; + virtual number get_LSvalue(Vertex* vrt, const int prtIndex) = 0; + + number get_edge_intersection(Vertex* vrt1, Vertex* vrt2); + + virtual bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc) = 0; + virtual bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc, std::vector& alphaOut)= 0; + + + ////////////////////////////////////////////////////////// + /// base class methods: _impl.h + ////////////////////////////////////////////////////////// + bool update_elem(GridObject* elem, const MathVector* vCornerCoords); + + /// sets data needed for usual computations in case of INSIDE_DOM: 'm_vCornerCoords' and 'm_roid' + void set_flat_top_data(GridObject* elem, const MathVector* vCornerCoords, ReferenceObjectID roid); + + /// updates all std::vectors-data and especially derives 'm_roid' + void compute_flat_top_data(GridObject* elem); + + + /// updates inner boundary data (called during FV1CutGeom::update()) + void update_inner_boundary(const std::vector > vCornerCoords){}; + void update_inner_boundary_for2(){}; + + ////////////////////////////////////////////////////////// + /// helper methods for 'update()': _tools.h + ////////////////////////////////////////////////////////// + + /// collects all corners of the flat top element + int CollectCorners_StdFV(GridObject* elem); + int CollectCorners_FlatTop_2d(GridObject* elem); + int CollectCorners_FlatTop_3d(GridObject* elem); + int get_cutMode(std::vector vVertex); + int CollectCorners_FlatTop_Prism3(GridObject* elem); + int CollectCorners_FlatTop_Prism4(GridObject* elem); + int CollectCorners_FlatTop_Pyramid(GridObject* elem); + int CollectCorners_FlatTop_originalTet(GridObject* elem); + + void ResortQuadrilateral(std::vector, size_t > > vInsideCorners, + std::vector, size_t > > vOutsideCorners, + MathVector normalDir); + + bool isIncluded(std::vector > vCheckList, MathVector checkPoint); + bool isCCW(std::vector > vCornerCoords, MathVector normal); + + + ////////////////////////////////////////////////////////// + /// further helper methods + ////////////////////////////////////////////////////////// + + /// for boundary computations + bool lies_onInterface(const size_t newID); + + bool remapped_fromInterface(const size_t origID); + bool remapped_fromInterface(const size_t origID, size_t& get_interfaceID); + bool is_boundary_face(const size_t sideID); + + + + ////////////////////////////////////////////////////////// + /// getter methods + ////////////////////////////////////////////////////////// + + size_t get_vertex_index(Vertex* vrt, GridObject* elem); + + /// access to roid + ReferenceObjectID roid(){ return m_roid; } + + /// access to 'm_vCornerCoords' + const std::vector > corners() const { return m_vCornerCoords; } + const MathVector* pCorners() const { return &m_vCornerCoords[0]; } + /// access to single entry of 'm_vCornerCoords' + const MathVector corner(size_t i) { return m_vCornerCoords[i]; } + /// access to 'm_vInterfaceID' + std::vector interface_id_all() { return m_vInterfaceID; } + /// access to single entry of 'm_vInterfaceID' + size_t interface_id(size_t i) { return m_vInterfaceID[i]; } + /// access to single entry of 'm_vOriginalCornerID' + const size_t corner_orig(size_t i) const { return m_vOriginalCornerID[i]; } + + /// access to single entry of 'm_vNOInterfaceID' + size_t NOinterface_id(size_t i) { return m_vNOInterfaceID[i]; } + + size_t numCo() { return m_vCornerCoords.size(); } + + + ////////////////////////////////////////////////////////// + /// setter methods + ////////////////////////////////////////////////////////// + + /// writes member 'm_roid' + void set_roid_2d(); + void set_roid_3d(); + + /// called during modify_LocalData()->set_QuadriSol() for case CUT_BY_2_INTERFACE + void set_QuadriSol(LocalVector locD, LocalVector locU) + { m_quadriLocD = locD; m_quadriLocU = locU;} + + void set_StdFV_assembling(bool bValue) { m_bUseStdFVAssembling = bValue; } + bool StdFV_assembling() { return m_bUseStdFVAssembling; } + + // called by FV1Geom during geo.update() of ElemDisc: + void set_orientation(const int orientation) + { m_orientationInterface = orientation; } + int get_orientation() + { return m_orientationInterface; } + + + void print_InterfaceDdata(); + + /////////////////////////////////////////////////////////////// + /// base members + /////////////////////////////////////////////////////////////// + + //private: + SmartPtr m_spMG; + position_attachment_type m_aPos; /// > m_vCornerCoords; + + /// current indices of flat top corners + std::vector m_vInterfaceID; + + /// current indices of all not-flat-top corners + std::vector m_vNOInterfaceID; + + /// maps the new corner indices to the original indices: + /// -> vOriginalCornerID[i] = j => the j-th corner of the original + /// element is associated with the i-th corner of the new element + std::vector m_vOriginalCornerID; + + + /// 4 corners forming the quadrilateral of an element cut by 2 particles + /// ---> REMARK: made sure by CollectCorner-methods, that corner 1,2 belong to prtIndex 0 + /// and corner 3,4 belong to prtIndex 1 + std::vector m_vQuadriOrigID; + LocalVector m_quadriLocD; + LocalVector m_quadriLocU; + + int m_orientationInterface; + + + /// flag for call of CollectCorners_StdFV() + bool m_bUseStdFVAssembling; // default = false + + /// contains radius, center and density of all given particles + SmartPtr > m_spCutElementHandler; + +}; + + + +}// end namespace ug + +#include "interface_handler_base_tools.h" +#include "interface_handler_base_impl.h" + +#endif /* INTERFACE_HANDLER_BASE_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_impl.h new file mode 100644 index 000000000..a5492883e --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_impl.h @@ -0,0 +1,218 @@ +/* + * interface_handler_local_impl.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_LOCAL_BASE_IMPL_H_ +#define INTERFACE_HANDLER_LOCAL_BASE_IMPL_H_ + + + +namespace ug{ + +/////////////////////////////////////////////////////////////// +/// methods for class 'IInterfaceHandlerLocal' +/////////////////////////////////////////////////////////////// + + + +/////////////////////////////////////////////////////////////// +/// methods for class 'InterfaceHandlerLocalBase' +/////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////// +// Constructor +/////////////////////////////////////////////////////////////// +template +InterfaceHandlerLocalBase:: +InterfaceHandlerLocalBase(SmartPtr > cutElementHandler) : + m_spMG(cutElementHandler->m_spMG), + m_roid(ROID_UNKNOWN), + m_orientationInterface(1), + m_bUseStdFVAssembling(false), + m_spCutElementHandler((SmartPtr >)cutElementHandler) +{ +// get position attachment + m_aPos = GetDefaultPositionAttachment(); + +// let position accessor access Vertex Coordinates + if(!m_spMG->has_attachment(m_aPos)) + m_spMG->attach_to(m_aPos); + m_aaPos.access(*m_spMG, m_aPos); + +// clear member + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vNOInterfaceID.clear(); + m_vOriginalCornerID.clear(); +} + +template +InterfaceHandlerLocalBase:: +InterfaceHandlerLocalBase(SmartPtr > cutElementHandler) : + m_spMG(cutElementHandler->m_spMG), + m_roid(ROID_UNKNOWN), + m_orientationInterface(1), + m_bUseStdFVAssembling(false), + m_spCutElementHandler((SmartPtr >)cutElementHandler) +{ + // get position attachment + m_aPos = GetDefaultPositionAttachment(); + + // let position accessor access Vertex Coordinates + if(!m_spMG->has_attachment(m_aPos)) + m_spMG->attach_to(m_aPos); + m_aaPos.access(*m_spMG, m_aPos); + + // clear member + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vNOInterfaceID.clear(); + m_vOriginalCornerID.clear(); +} + + +// see mod_elem_flat_top() of flat_top.h +template +void InterfaceHandlerLocalBase:: +compute_flat_top_data(GridObject* elem) +{ + bool output = true; + +// get new element corners and according element type + if ( StdFV_assembling() ) // Version an Stelle von 'm_bUsualAss = true' + { + CollectCorners_StdFV(elem); + + if ( dim == 2 ) set_roid_2d(); + if ( dim == 3 ) set_roid_3d(); + } + else + { + if ( dim == 2 ) { CollectCorners_FlatTop_2d(elem); set_roid_2d(); } + if ( dim == 3 ) { CollectCorners_FlatTop_3d(elem); set_roid_3d(); } + } + + // some checks: + if ( m_vCornerCoords.size() == 0 ) + UG_THROW("m_vCornerCoords.size() = " << m_vCornerCoords.size() << "not possible!\n"); + + if ( dim == 2 ) + if ( elem->reference_object_id() != ROID_TRIANGLE ) + UG_THROW("Discretisation only coded for triangular elements!\n"); + + if ( dim == 3 ) + if ( elem->reference_object_id() != ROID_TETRAHEDRON ) + UG_THROW("Discretisation only coded for tetrahedral elements!\n"); + + + m_elemModus = get_element_modus(elem); // computed via 'compute_element_modus()' during 'update_marker()' + + if ( output ){ + if( m_elemModus == CUT_BY_INTERFACE) + { + UG_LOG("_________________ compute_flat_top_data()_________________\n"); + + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); + for ( size_t i = 0; i < m_vOriginalCornerID.size(); ++i ) + UG_LOG("Original: id = " << m_vOriginalCornerID[i] << "\n"); + UG_LOG("\n"); + for ( size_t i = 0; i < m_vInterfaceID.size(); ++i ) + UG_LOG("Interface: id = " << m_vInterfaceID[i] << "\n"); + UG_LOG("\n"); + } + + } + +} + +template +void InterfaceHandlerLocalBase:: +set_flat_top_data(GridObject* elem, const MathVector* vCornerCoords, ReferenceObjectID roid) +{ + size_t numCo = dim+1; // -> ok, since implemented only for Triangles and Tetrahedra + +// set 'm_vCornerCoords' + m_vCornerCoords.clear(); + for ( size_t i = 0; i < numCo; ++i ) + m_vCornerCoords.push_back(vCornerCoords[i]); + +// set 'm_roid' + m_roid = roid; + + //if ( roid != ROID_UNKNOWN ) return; + + +// for OUTSIDE_DOM, also fill 'vOriginalCornerID' and 'vInterfaceID': + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + m_vCornerCoords.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + +// loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + if ( !is_FTVertex(vrtRoot, -1) ) + { + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + } + else + { + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + } + + } + +} + + + +// see preprocess() of flat_top.h +// called by geo.update()!! +template +bool InterfaceHandlerLocalBase:: +update_elem(GridObject* elem, const MathVector* vCornerCoords) +{ + bool do_update_local = false; + +// computing flat top modus + m_elemModus = compute_element_modus(elem, m_orientationInterface); + + switch(m_elemModus) + { + case INSIDE_DOM: if ( dim == 2 ) set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + break; // usual assembling + case OUTSIDE_DOM: if ( dim == 2 ) set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + break; // usual assembling + case CUT_BY_INTERFACE: compute_flat_top_data(elem); + //if ( m_roid == ROID_PYRAMID )UG_THROW("PYRAMID\n"); + do_update_local = true; + break; // flat top assembling + default: + throw(UGError("Error in InterfaceHandlerLocalBase::update(): switch(m_elemModus)!")); + } + + return do_update_local; + +} + + +} // end ug namespace + + + +#endif /* INTERFACE_HANDLER_LOCAL_BASE_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_tools.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_tools.h new file mode 100644 index 000000000..748220149 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_tools.h @@ -0,0 +1,1914 @@ +/* + * interface_handler_local_tools.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_LOCAL_BASE_TOOLS_H_ +#define INTERFACE_HANDLER_LOCAL_BASE_TOOLS_H_ + +namespace ug{ + +//////////////////////////////////////////////////////////////////////////////// +// FlatTopBase methods - ROID/CollectCorners... +//////////////////////////////////////////////////////////////////////////////// + +template +number InterfaceHandlerLocalBase:: +get_edge_intersection(Vertex* vrt1, Vertex* vrt2) +{ + + number LSvalue1 = get_LSvalue(vrt1, 0); + number LSvalue2 = get_LSvalue(vrt2, 0); + + number alpha = LSvalue1 / (LSvalue1 - LSvalue2); + + return alpha; +} + +// used for boundary implementation +template +bool InterfaceHandlerLocalBase:: +lies_onInterface(const size_t newID) +{ + for ( size_t i = 0; i < m_vInterfaceID.size(); ++i) + if ( m_vInterfaceID[i] == newID ) + return true; + + return false; +} + + +template +bool InterfaceHandlerLocalBase:: +remapped_fromInterface(const size_t origID, size_t& get_interfaceID) +{ + for ( size_t i = 0; i < m_vQuadriOrigID.size(); ++i) + { + size_t origID_of_interface_corners = m_vQuadriOrigID[i]; + if ( origID_of_interface_corners == origID ) + { + get_interfaceID = i; + return true; + } + } + + return false; +} + +template +bool InterfaceHandlerLocalBase:: +remapped_fromInterface(const size_t origID) +{ + for ( size_t i = 0; i < m_vInterfaceID.size(); ++i) + { + size_t interfaceID = m_vInterfaceID[i]; + size_t origID_of_interface_corners = m_vOriginalCornerID[interfaceID]; + if ( origID_of_interface_corners == origID ) + return true; + } + + return false; +} + + +template +bool InterfaceHandlerLocalBase:: +is_boundary_face(const size_t sideID) +{ +// get data + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(m_roid); + +// number of corners of side (special case bottom side pyramid) + const int coOfSide = (m_roid != ROID_PYRAMID || sideID != 0) + ? rRefElem.num(dim-1, sideID, 0) : rRefElem.num(dim-1, sideID, 0) + 2; + + for(int co = 0; co < coOfSide; ++co) + { + size_t cornerID; + if (m_roid != ROID_PYRAMID || sideID != 0) + cornerID = rRefElem.id(dim-1, sideID, 0, co); + else + cornerID = rRefElem.id(dim-1, sideID, 0, (co % 3) + (co>3 ? 1 : 0)); + + if ( !lies_onInterface(cornerID) ) + return false; + } + + return true; + +} + +/* +// compare implementation of 'DimFV1Geometry::update_boundary_faces()' +template +void InterfaceHandlerLocalBase:: +update_inner_boundary_faces() +{ + + ///////////////////////////////////////////////////////////////////////////// + // get general data + ///////////////////////////////////////////////////////////////////////////// + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(this->m_roid); + + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(this->m_roid); + rMapping.update(this->m_vCornerCoords); + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(this->m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + + ///////////////////////////////////////////////////////////////////////////// + // compute local and global geom object midpoints for each dimension + ///////////////////////////////////////////////////////////////////////////// + + MathVector vvLocMid[dim+1][maxMid]; + MathVector vvGloMid[dim+1][maxMid]; + + // set corners of element as local centers of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + vvLocMid[0][i] = rRefElem.corner(i); + + // compute local midpoints + interfaceComputeMidPoints, maxMid>(rRefElem, vvLocMid[0], vvLocMid); + + // remember global position of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + vvGloMid[0][i] = this->m_vCornerCoords[i]; + // compute local midpoints + interfaceComputeMidPoints, maxMid>(rRefElem, vvGloMid[0], vvGloMid); + + ///////////////////////////////////////////////////////////////////////////// + // collect boudary faces + ///////////////////////////////////////////////////////////////////////////// + + // get number of sides of element + size_t numSides = 0; + numSides = rRefElem.num(dim-1); + + // current number of bf + size_t curr_bf = 0; + + m_vBF.clear(); + // loop sides of element + for(size_t side = 0; side < numSides; ++side) + { + // side is no boundary face => continue + if ( !is_boundary_face(side) ) + continue; + + // number of corners of side (special case bottom side pyramid) + const int coOfSide = (this->m_roid != ROID_PYRAMID || side != 0) + ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; + + // resize vector + m_vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + interfaceBF& bf = m_vBF[curr_bf]; + + // set node id == scv this bf belongs to + if (this->m_roid != ROID_PYRAMID || side != 0) + bf.nodeId = rRefElem.id(dim-1, side, 0, co); + else + { + // map according to order defined in ComputeBFMidID + bf.nodeId = rRefElem.id(dim-1, side, 0, (co % 3) + (co>3 ? 1 : 0)); + } + + // Compute MidID for BF + interfaceComputeBFMidID(rRefElem, side, bf.vMidID, co); + + // copy corners of bf + interfaceCopyCornerByMidID(bf.vLocPos, bf.vMidID, vvLocMid, interfaceBF::numCo); + interfaceCopyCornerByMidID(bf.vGloPos, bf.vMidID, vvGloMid, interfaceBF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, interfaceBF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, interfaceBF::numCo); + + // normal on scvf + traits::NormalOnSCVF(bf.Normal, bf.vGloPos, vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + // compute shapes and grads + bf.numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + // get reference mapping + rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = rMapping.sqrt_gram_det(bf.localIP); + + // compute global gradients + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + + } // end loop of corners of side + + } // end loop sides of element + + +} +*/ +template +void InterfaceHandlerLocalBase:: +set_roid_2d() +{ + size_t numCo = m_vCornerCoords.size(); + + switch(numCo) + { + case 0: m_roid = ROID_UNKNOWN; break; + case 3: m_roid = ROID_TRIANGLE; break; + case 4: m_roid = ROID_QUADRILATERAL; break; + + default: throw(UGError("during switch in 'set_roid_2d()': " + "m_numCo invalid => default case chosen")); + } + +} + +template +void InterfaceHandlerLocalBase:: +set_roid_3d() +{ + size_t numCo = m_vCornerCoords.size(); + + switch(numCo) + { + case 0: m_roid = ROID_UNKNOWN; break; + case 4: m_roid = ROID_TETRAHEDRON; break; + case 5: m_roid = ROID_PYRAMID; break; + case 6: m_roid = ROID_PRISM; break; + + default: throw(UGError("during switch in 'set_roid_3d()': " + "m_numCo invalid => default case chosen")); + } + + +} + +// parameter 'normal' is the direction from the triangle into the inner of the prism +template +bool InterfaceHandlerLocalBase:: +isCCW(std::vector > vCornerCoords, MathVector normal) +{ + + if ( dim != 3 ) + UG_THROW("stop: in 2d the method VecCross() may not be used!\n"); + + MathVector e1, e2; + VecSubtract(e1, vCornerCoords[1], vCornerCoords[0]); + VecSubtract(e2, vCornerCoords[2], vCornerCoords[0]); + + MathVector n; + VecCross(n, e1, e2); + VecNormalize(n,n); + VecNormalize(normal,normal); + + if ( fabs(VecDot(n, normal)) < 1e-6 ) + UG_THROW("in 'isCCW()': vectors are perpendicular.\n"); + + if ( VecDot(n, normal) > 0 ) return true; // CCW + else return false; + +} + +template +bool InterfaceHandlerLocalBase:: +isIncluded(std::vector > vCheckList, MathVector checkPoint) +{ + for(size_t i = 0; i < vCheckList.size(); ++i) + { + bool isEqual = true; + + if ( VecDistance(vCheckList[i],checkPoint) > 1e-10) + isEqual = false; + + if ( isEqual ) + return true; + + } + + return false; +} + +template +void InterfaceHandlerLocalBase:: +ResortQuadrilateral(std::vector, size_t > > vInsideCorners, + std::vector, size_t > > vOutsideCorners, + MathVector normalDir) +{ +// some checks: + if ( vOutsideCorners.size() != 2 ) UG_THROW("vOutsideCorners.size() has to be 2 in 2d case, but is " << vOutsideCorners.size() << ".\n"); + if ( vInsideCorners.size() != 2 ) UG_THROW("vInsideCorners.size() has to be 2 in 2d case, but is " << vInsideCorners.size() << ".\n"); + if ( vOutsideCorners[0].second != vOutsideCorners[1].second ) UG_THROW("Outside indices must be identical!\n"); + +//////////////////////////////////////////////////////////////////////////////////////////// +// 1) Copy 'vOutsideCorners'/'vOutsideCorners' to 'm_vCornerCoords' in special order: +// -> ordering: 1. insideCorner, 2./3. outsideCorner, 4. insideCorner +//////////////////////////////////////////////////////////////////////////////////////////// + + m_vCornerCoords.clear(); m_vCornerCoords.resize(4); + m_vOriginalCornerID.clear(); m_vOriginalCornerID.resize(4); +// fill with insideCorners+indices: + m_vCornerCoords[0] = vInsideCorners[0].first; + m_vOriginalCornerID[0] = vInsideCorners[0].second; + + m_vCornerCoords[3] = vInsideCorners[1].first; + m_vOriginalCornerID[3] = vInsideCorners[1].second; + +// fill with outsideCorners+indices: + m_vCornerCoords[1] = vOutsideCorners[0].first; + m_vOriginalCornerID[1] = vOutsideCorners[0].second; + + m_vCornerCoords[2] = vOutsideCorners[1].first; + m_vOriginalCornerID[2] = vOutsideCorners[1].second; + +// remember outside Index in order to fill 'vm_vInterfaceID' after re-ordering. + size_t outInd = vOutsideCorners[0].second; + +//////////////////////////////////////////////////////////////////////////////////////////// +// 2) Check for potential cross-ordering or not-CCW +//////////////////////////////////////////////////////////////////////////////////////////// + MathVector<3> vNormOut1, vNormOut2; + std::vector > vCornerCoordsBlow; vCornerCoordsBlow.resize(4); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + { + for ( size_t d = 0; d < dim; ++d ) + vCornerCoordsBlow[i][d] = m_vCornerCoords[i][d]; + vCornerCoordsBlow[i][2] = 0.0; + } + + CalculateTriangleNormalNoNormalize(vNormOut1, vCornerCoordsBlow[0], vCornerCoordsBlow[1], vCornerCoordsBlow[2]); + CalculateTriangleNormalNoNormalize(vNormOut2, vCornerCoordsBlow[2], vCornerCoordsBlow[3], vCornerCoordsBlow[0]); + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Check 1 - cross-ordering +// VecDot(vNormOut1,vNormOut2) < 0 => corners of quadrilateral are not ordered along the +// endges, i.e. across the diagonal => switch order of the two outideCorners, i.e. index [1],[2] +///////////////////////////////////////////////////////////////////////////////////////////////////////// + if ( VecDot(vNormOut1, vNormOut2) < 0 ) + { + MathVector bufferCoord = m_vCornerCoords[1]; + size_t bufferInd = m_vOriginalCornerID[1]; + + m_vCornerCoords[1] = m_vCornerCoords[2]; + m_vOriginalCornerID[1] = m_vOriginalCornerID[2]; + + m_vCornerCoords[2] = bufferCoord; + m_vOriginalCornerID[2] = bufferInd; + } + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Check 2 - CCW? +// VecDot(vNormOut1,zDir) < 0 => corners of quadrilateral are not CCW: +///////////////////////////////////////////////////////////////////////////////////////////////////////// + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + { + for ( size_t d = 0; d < dim; ++d ) + vCornerCoordsBlow[i][d] = m_vCornerCoords[i][d]; + if ( dim == 2 ) vCornerCoordsBlow[i][2] = 0.0; + + + } + CalculateTriangleNormalNoNormalize(vNormOut1, vCornerCoordsBlow[0], vCornerCoordsBlow[1], vCornerCoordsBlow[2]); + CalculateTriangleNormalNoNormalize(vNormOut2, vCornerCoordsBlow[2], vCornerCoordsBlow[3], vCornerCoordsBlow[0]); + + if ( VecDot(vNormOut1, vNormOut2) < 0 ) UG_THROW("check 1 failed after second check!\n"); + + +// pure copy of 'normalDir' data because of data type inconsistence (MathVector<3> vs. MathVector) + MathVector<3> _normalDir; + for ( size_t i = 0; i < 2; ++i ) + _normalDir[i] = normalDir[i]; + if ( dim == 2 ) _normalDir[2] = 1.0; + if ( dim == 3 ) _normalDir[2] = normalDir[2]; + + if ( VecDot(vNormOut1, _normalDir) < 0 ) + { + + MathVector bufferCoord = m_vCornerCoords[1]; + size_t bufferInd = m_vOriginalCornerID[1]; + + m_vCornerCoords[1] = m_vCornerCoords[3]; + m_vOriginalCornerID[1] = m_vOriginalCornerID[3]; + + m_vCornerCoords[3] = bufferCoord; + m_vOriginalCornerID[3] = bufferInd; + } + +// fill 'vInterfaceID': + m_vInterfaceID.clear(); + for ( size_t i = 0; i < m_vOriginalCornerID.size(); ++i ) + if ( m_vOriginalCornerID[i] == outInd ) + m_vInterfaceID.push_back(i); + +} + + + +template +int InterfaceHandlerLocalBase:: +CollectCorners_StdFV(GridObject* elem) +{ + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::vector, size_t > > vNearIntCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + + bool isOutsideVertex = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // remember boolian for check, weather there existe at least one vertex, which is FT! + if ( is_OutsideVertex(vVertex[i], i) || is_FTVertex(vVertex[i], i) ) + { + isOutsideVertex = true; + break; + } + } + + if ( !isOutsideVertex ) + UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); + +// loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + ////////////////////////////////////////////// + // case 1: + // vertex insideFluid => Position und index puschen + if ( !is_FTVertex(vVertex[i], i) ) + { + if ( is_nearInterfaceVertex(vrtRoot, i) ) + { + UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); + } + else + { + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + vInsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + } + + } + else + { + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + + } + + } + + // skip whole element, since only FT points are included + if ( dim == 2 && m_vCornerCoords.size() != 3 ) + UG_THROW("in 'CollectCorners_StdFV()': m_vCornerCoords.size() " + "= " << m_vCornerCoords.size() << "not possible!\n"); + if ( dim == 3 && m_vCornerCoords.size() != 4 ) + UG_THROW("in 'CollectCorners_StdFV()': m_vCornerCoords.size() " + "= " << m_vCornerCoords.size() << "not possible!\n"); + +//////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////// + + const char* filename; + filename = "output_StdFV."; + + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + fprintf(outputFile,"\n_________________________ begin 'CollectIBCorners_StdFV' ________________________\n"); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); + + fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); + + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + + + fprintf(outputFile,"\n_________________________ end 'CollectIBCorners_StdFV()' ______________________________\n\n"); + + fclose(outputFile); + + + + return m_vCornerCoords.size(); +} + + + +template +size_t InterfaceHandlerLocalBase:: +get_vertex_index(Vertex* vrt, GridObject* elem) +{ + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + + for(size_t i = 0; i < vVertex.size(); ++i) + if ( vrt == vVertex[i]) + return i; + + UG_THROW("in CutElementHandlerImmersed::get_vertex_index: no index found!\n"); +} + +/* +template +int InterfaceHandlerLocalBase:: +CollectCorners_FlatTop_2d(GridObject* elem) +{ + bool bOutput = false; + + if ( bOutput ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_2d()' ______________________________\n\n"); + + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::vector, size_t > > vNearIntCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + bool isFTVertex = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // remember boolian for check, weather there existe at least one vertex, which is FT! + isFTVertex = is_FTVertex(vVertex[i], i); + if ( isFTVertex ) + break; + } + + if ( !isFTVertex ) + UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // loop vertices + ////////////////////////////////////////////// + // REMARK: + // order is the same as in 'vCornerCoords', therefore we can be sure, that the + // order of the new 'vCornerIBCoords' will be consistent with the grid standard + ////////////////////////////////////////////// + + bool bNearInterface = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + + // get element + Vertex* vrtRoot = vVertex[i]; + + ////////////////////////////////////////////// + // case 1: + // vertex insideFluid + // => Position und index puschen + if ( ! is_FTVertex(vrtRoot, i) ) + { + + if ( is_nearInterfaceVertex(vrtRoot, i) ) + { + UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); + } + else + { + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + vInsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + } + + } + ////////////////////////////////////////////// + // case 2: + // vertex = FT + ON interface + // => KEINE Berechnung von 'intersectionPoint' notwendig! -> pushen und alten index pushen + + // REMARK: is_nearInterfaceVerx = false per default, if m_vThresholdOnLevel = 0.0 + else if ( is_nearInterfaceVertex(vrtRoot, i) ) + { + bNearInterface = true; + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + vNearIntCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + + } + ////////////////////////////////////////////// + // case 3: + // vertex 'outsideFluid' + // => NEUE Position berechen+pushen und alten index pushen + else + { + ////////////////////////////////////////////////////////////////////////////////////////// + // loop alle edges, die interface schneiden und damit einen neuen intersectionPnt + // beitragen zum damit assoziierten alten index + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("error in collecting vertices associated to an edge!....EXIT!...\n"); + + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + size_t vrtInd1 = get_vertex_index(vrt1, elem); + size_t vrtInd2 = get_vertex_index(vrt2, elem); + + MathVector intersectionPnt; + + /////////////////////////////////////////////////////////////////// + // lies vrtRoot on a cutted edge? + /////////////////////////////////////////////////////////////////// + // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! + if ( is_nearInterfaceVertex(vrt2, vrtInd2) || is_nearInterfaceVertex(vrt1, vrtInd1) ) + { bNearInterface = true; continue; } + // case2: vert2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt1 && !is_FTVertex(vrt2, vrtInd2) ){ + get_intersection_point(intersectionPnt, vrt2, vrt1); + } + // case3: vrt1 = outsideParticle && vrt2 = insideParticle: + else if ( vrtRoot == vrt2 && !is_FTVertex(vrt1, vrtInd1) ) + get_intersection_point(intersectionPnt, vrt1, vrt2); + else + continue; + + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + + + /////////////////////////////////////////////////////////////////// + // only push_back, if not included yet! + // -> can be ONLY the case, if the intersectionPoint is a node + if ( ! isIncluded(m_vCornerCoords, intersectionPnt) ) + { + + m_vCornerCoords.push_back(intersectionPnt); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(intersectionPnt, i)); + } + + + } // end edge-loop + + } // end else-case + + } // end vrt-loop + +//////////////////////////////////////////////////////////////////////////////////////////// +// Postprecessing for quadrilaterals ( <=> vOutsideCorners == 2 ) +// (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface +// => no Quadrilateral, but Triangle!! +//////////////////////////////////////////////////////////////////////////////////////////// + MathVector normalDir(0.0); + if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) + ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); + else if ( bNearInterface ) + { + // Quadrilateral -> Triangle + if ( vInsideCorners.size() == 1 ) // case 1 + { + // do nothing, since re-sorting not necessary...??? + } + // skip whole element, since only FT points are included + else if ( vInsideCorners.size() == 0 ) + UG_THROW("in 'CollectCorners_FlatTop_2d()': vInsideCorners.size() " + "= " << vInsideCorners.size() << "not possible!\n"); + } + + + if ( bOutput) + { +//////////////////////////////////////////////////////////////////////////////////////////// +// Wirte to files: +//////////////////////////////////////////////////////////////////////////////////////////// + if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) + { + const char* filename = "File_Quadrilateral."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* printFile = fopen(name.c_str(), "a"); + fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(printFile," vCornerCoords: %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1]); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(printFile,"OriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(printFile,"m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + for ( size_t i = 0; i < vInsideCorners.size(); ++i ) + fprintf(printFile," vInsideCorners: %e, %e \n", vInsideCorners[i].first[0], vInsideCorners[i].first[1]); + for ( size_t i = 0; i < vNearIntCorners.size(); ++i ) + fprintf(printFile," vNearIntCorners: %e, %e \n", vNearIntCorners[i].first[0], vNearIntCorners[i].first[1]); + for ( size_t i = 0; i < vOutsideCorners.size(); ++i ) + fprintf(printFile," vOutsideCorners: %e, %e \n", vOutsideCorners[i].first[0], vOutsideCorners[i].first[1]); + fclose(printFile); + } + else if ( bNearInterface ) + { + // Quadrilateral -> Triangle + if ( vInsideCorners.size() == 1 ) // case 1 + { + // do nothing, since re-sorting not necessary...??? + + const char* filename = "File_newTirangle."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* printFile = fopen(name.c_str(), "a"); + fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(printFile," vCornerCoords: %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1]); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(printFile,"OriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(printFile,"m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + for ( size_t i = 0; i < vInsideCorners.size(); ++i ) + fprintf(printFile," vInsideCorners: %e, %e \n", vInsideCorners[i].first[0], vInsideCorners[i].first[1]); + for ( size_t i = 0; i < vNearIntCorners.size(); ++i ) + fprintf(printFile," vNearIntCorners: %e, %e \n", vNearIntCorners[i].first[0], vNearIntCorners[i].first[1]); + for ( size_t i = 0; i < vOutsideCorners.size(); ++i ) + fprintf(printFile," vOutsideCorners: %e, %e \n", vOutsideCorners[i].first[0], vOutsideCorners[i].first[1]); + fclose(printFile); + } + + } +//////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////// + + if (bOutput) + { + const char* filename = "output."; + std::string name(filename); + char ext[50]; + if ( dim == 2 ) + sprintf(ext, "2d.txt"); + if ( dim == 3 ) + sprintf(ext, "3d.txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + fprintf(outputFile,"\n_________________________ begin 'CollectIBCorners2d' ________________________\n"); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); + + fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); + + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + + + fprintf(outputFile,"\n_________________________ end 'CollectIBCorners2d()' ______________________________\n\n"); + + fclose(outputFile); + + } + } + if ( bOutput ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_2d()' ______________________________\n\n"); + + return m_vCornerCoords.size(); + +} +*/ + + + + +template +int InterfaceHandlerLocalBase:: +CollectCorners_FlatTop_2d(GridObject* elem) +{ + bool bOutput = false; + bool bOutputToFile = false; + if ( bOutput ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_2d()' ______________________________\n\n"); + + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::vector, size_t > > vNearIntCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + bool isFTVertex = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // remember boolian for check, weather there existe at least one vertex, which is FT! + isFTVertex = is_FTVertex(vVertex[i], i); + if ( isFTVertex ) + break; + } + + + if ( !isFTVertex ) + UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // loop vertices + ////////////////////////////////////////////// + // REMARK: + // order is the same as in 'vCornerCoords', therefore we can be sure, that the + // order of the new 'vCornerIBCoords' will be consistent with the grid standard + ////////////////////////////////////////////// + + bool bNearInterface = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + + // get element + Vertex* vrtRoot = vVertex[i]; + + if ( (fabs(m_aaPos[vVertex[i]][0] - 1.08941) < 1e-4) && (fabs(m_aaPos[vVertex[i]][1] + 0.140733) < 1e-4) ) + UG_LOG("stop here..\n"); + + ////////////////////////////////////////////// + // case 1: + // vertex insideFluid + // => Position und index puschen + if ( ! is_FTVertex(vrtRoot, i) ) + { + + if ( is_nearInterfaceVertex(vrtRoot, i) ) + { + UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); + } + else + { + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + vInsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + } + + } + ////////////////////////////////////////////// + // case 2: + // vertex = FT + ON interface + // => KEINE Berechnung von 'intersectionPoint' notwendig! -> pushen und alten index pushen + + // REMARK: is_nearInterfaceVerx = false per default, if m_vThresholdOnLevel = 0.0 + else if ( is_nearInterfaceVertex(vrtRoot, i) ) + { + bNearInterface = true; + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + vNearIntCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + + } + ////////////////////////////////////////////// + // case 3: + // vertex 'outsideFluid' + // => NEUE Position berechen+pushen und alten index pushen + else + { + ////////////////////////////////////////////////////////////////////////////////////////// + // loop alle edges, die interface schneiden und damit einen neuen intersectionPnt + // beitragen zum damit assoziierten alten index + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("error in collecting vertices associated to an edge!....EXIT!...\n"); + + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + size_t vrtInd1 = get_vertex_index(vrt1, elem); + size_t vrtInd2 = get_vertex_index(vrt2, elem); + + MathVector intersectionPnt; + + /////////////////////////////////////////////////////////////////// + // lies vrtRoot on a cutted edge? + /////////////////////////////////////////////////////////////////// + // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! + if ( is_nearInterfaceVertex(vrt2, vrtInd2) || is_nearInterfaceVertex(vrt1, vrtInd1) ) + { bNearInterface = true; continue; } + // case2: vert2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt1 && !is_FTVertex(vrt2, vrtInd2) ){ + get_intersection_point(intersectionPnt, vrt2, vrt1); + } + // case3: vrt1 = outsideParticle && vrt2 = insideParticle: + else if ( vrtRoot == vrt2 && !is_FTVertex(vrt1, vrtInd1) ) + get_intersection_point(intersectionPnt, vrt1, vrt2); + else + continue; + + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + + + /////////////////////////////////////////////////////////////////// + // only push_back, if not included yet! + // -> can be ONLY the case, if the intersectionPoint is a node + if ( ! isIncluded(m_vCornerCoords, intersectionPnt) ) + { + + m_vCornerCoords.push_back(intersectionPnt); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(intersectionPnt, i)); + } + + + } // end edge-loop + + } // end else-case + + } // end vrt-loop + +//////////////////////////////////////////////////////////////////////////////////////////// +// Postprecessing for quadrilaterals ( <=> vOutsideCorners == 2 ) +// (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface +// => no Quadrilateral, but Triangle!! +//////////////////////////////////////////////////////////////////////////////////////////// + MathVector normalDir(0.0); + if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) + ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); + else if ( bNearInterface ) + { + // Quadrilateral -> Triangle + if ( vInsideCorners.size() == 1 ) // case 1 + { + // do nothing, since re-sorting not necessary...??? + } + // skip whole element, since only FT points are included + else if ( vInsideCorners.size() == 0 ) + UG_THROW("in 'CollectCorners_FlatTop_2d()': vInsideCorners.size() " + "= " << vInsideCorners.size() << "not possible!\n"); + } + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Wirte to files: +//////////////////////////////////////////////////////////////////////////////////////////// +if ( bOutputToFile ) +{ + if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) + { + const char* filename = "File_Quadrilateral."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* printFile = fopen(name.c_str(), "a"); + fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(printFile," vCornerCoords: %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1]); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(printFile,"OriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(printFile,"m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + for ( size_t i = 0; i < vInsideCorners.size(); ++i ) + fprintf(printFile," vInsideCorners: %e, %e \n", vInsideCorners[i].first[0], vInsideCorners[i].first[1]); + for ( size_t i = 0; i < vNearIntCorners.size(); ++i ) + fprintf(printFile," vNearIntCorners: %e, %e \n", vNearIntCorners[i].first[0], vNearIntCorners[i].first[1]); + for ( size_t i = 0; i < vOutsideCorners.size(); ++i ) + fprintf(printFile," vOutsideCorners: %e, %e \n", vOutsideCorners[i].first[0], vOutsideCorners[i].first[1]); + fclose(printFile); + } + else if ( bNearInterface ) + { + // Quadrilateral -> Triangle + if ( vInsideCorners.size() == 1 ) // case 1 + { + // do nothing, since re-sorting not necessary...??? + + const char* filename = "File_newTirangle."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* printFile = fopen(name.c_str(), "a"); + fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(printFile," vCornerCoords: %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1]); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(printFile,"OriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(printFile,"m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + for ( size_t i = 0; i < vInsideCorners.size(); ++i ) + fprintf(printFile," vInsideCorners: %e, %e \n", vInsideCorners[i].first[0], vInsideCorners[i].first[1]); + for ( size_t i = 0; i < vNearIntCorners.size(); ++i ) + fprintf(printFile," vNearIntCorners: %e, %e \n", vNearIntCorners[i].first[0], vNearIntCorners[i].first[1]); + for ( size_t i = 0; i < vOutsideCorners.size(); ++i ) + fprintf(printFile," vOutsideCorners: %e, %e \n", vOutsideCorners[i].first[0], vOutsideCorners[i].first[1]); + fclose(printFile); + } + + } +//////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////// + + const char* filename = "output."; + std::string name(filename); + char ext[50]; + if ( dim == 2 ) + sprintf(ext, "2d.txt"); + if ( dim == 3 ) + sprintf(ext, "3d.txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + fprintf(outputFile,"\n_________________________ begin 'CollectIBCorners2d' ________________________\n"); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); + + fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); + + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + + + fprintf(outputFile,"\n_________________________ end 'CollectIBCorners2d()' ______________________________\n\n"); + + fclose(outputFile); + + +} // end if ( bOutputToFile ) + + if ( bOutput ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_2d()' ______________________________\n\n"); + + return m_vCornerCoords.size(); + +} + +template +int InterfaceHandlerLocalBase:: +CollectCorners_FlatTop_Prism3(GridObject* elem) +{ +/////////////////////////////////////////////////////////////////// +// 1) push_back into 'vInsideCorners' +// 2) collect according outsideCorner (lying on the commom edge) +// 3) push_back into 'vOutsideCorners' +/////////////////////////////////////////////////////////////////// + + bool output = false; + + if ( output ) UG_LOG("_________________________ begin 'CollectIBCorners3d_Prism3()' ______________________________\n\n"); + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + + std::vector > vOutsideCorners; + std::vector > vInsideCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // loop vertices + size_t outsideInd; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + if ( ! is_FTVertex(vrtRoot, i) ) + { + /////////////////////////////////////////////////////////////////// + // 1) push_back into 'vInsideCorners' + vInsideCorners.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + /////////////////////////////////////////////////////////////////// + // 2) collect according outsideCorner (lying on the commom edge) + bool outsideCornerFound = false; + MathVector intersectionPnt; + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("in 'NEWcall_Extrapolation': error in collecting vertices associated to an edge!....EXIT!...\n"); + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + size_t vrtInd1 = get_vertex_index(vrt1, elem); + size_t vrtInd2 = get_vertex_index(vrt2, elem); + + // lies vrtRoot on a cutted edge? + // case1: vrt1 = outsideParticle && vrt2 = insideParticle: + if ( vrtRoot == vrt1 && is_FTVertex(vrt2, vrtInd2) ) + {outsideCornerFound = get_intersection_point(intersectionPnt, vrt1, vrt2);} + // case2: vrt2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt2 && is_FTVertex(vrt1, vrtInd1) ) + {outsideCornerFound = get_intersection_point(intersectionPnt, vrt2, vrt1);} + // NO nearInterface handling necessary, since this is Pyramid or Tetrahedron case! + else if ( is_nearInterfaceVertex(vrt2, vrtInd2) || is_nearInterfaceVertex(vrt1, vrtInd1) ) + {UG_THROW("in 'CollectCorners_Prism3()': no nearInterface case possible!\n");} + else + continue; + + // check for correct intersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners3d_Prism3()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + + } // end edge-loop + + if ( !outsideCornerFound ) + UG_THROW("During edge-loop no outsideCorner found!\n"); + + /////////////////////////////////////////////////////////////////// + // 3) push_back into 'vOutsideCorners' + // check for 'isIndluded(), BUT: ALL 3 intersectionPonits need to be included for PRISM!! + if ( isIncluded(vOutsideCorners, intersectionPnt) ) + UG_THROW("intersectionPnt allready included? ERROR\n"); + vOutsideCorners.push_back(intersectionPnt); + + } // end inside-case + else + // recall ousideIndex for 'm_vOriginalCornerID' + outsideInd = i; + + } // end vertex-loop + + for(size_t i = 0; i < 3; ++i) + { + m_vOriginalCornerID.push_back(outsideInd); + m_vInterfaceID.push_back(3+i); + } + +// WRITE 'vCornerCoords': FIRST insideCorners, SECOND outsideCorners + m_vCornerCoords.clear(); + for(size_t i = 0; i < 3; ++i) + m_vCornerCoords.push_back(vInsideCorners[i]); + for(size_t i = 0; i < 3; ++i) + m_vCornerCoords.push_back(vOutsideCorners[i]); + +// some checks: + if ( m_vInterfaceID.size() != 3 ) UG_THROW("wrong size for m_vInterfaceID! Should be 3 and is " << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 6 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 6 and is " << m_vOriginalCornerID.size() << "\n"); + if ( vInsideCorners.size() != 3 ) UG_THROW("wrong size for vInsideCorners! Should be 3 and is " << vInsideCorners.size() << "\n"); + if ( vOutsideCorners.size() != 3 ) UG_THROW("wrong size for vOutsideCorners! Should be 3 and is " << vOutsideCorners.size() << "\n"); + if ( m_vCornerCoords.size()!= 6 ) UG_THROW("wrong size for m_vCornerCoords! Should be 6 and is " << m_vCornerCoords.size() << "\n"); + + if ( output ) + { + UG_LOG("---------- vor SWITCH ---------- \n"); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); + } +// check 'vOutsideCorners'-array for CCW: +// get normal to triangle, built by 'vOutsideCorners'-array: + MathVector normal = vInsideCorners[0]; + VecSubtract(normal, vOutsideCorners[0], normal); + + if ( !isCCW(vOutsideCorners, normal) ) + { + // switch ' m_vCornerCoords' + m_vCornerCoords[4] = vOutsideCorners[2]; + m_vCornerCoords[5] = vOutsideCorners[1]; + // switch ' m_vOriginalCornerID' + size_t buffer = m_vOriginalCornerID[4]; + m_vOriginalCornerID[4] = m_vOriginalCornerID[5]; + m_vOriginalCornerID[5] = buffer; + if ( output ) UG_LOG("SWITCH vOutsideCorneers\n"); + } + +// check 'vInsideCorners'-array for CCW: + if ( !isCCW(vInsideCorners, normal) ) + { + // switch ' m_vCornerCoords' + m_vCornerCoords[1] = vInsideCorners[2]; + m_vCornerCoords[2] = vInsideCorners[1]; + // switch ' m_vOriginalCornerID' + size_t buffer = m_vOriginalCornerID[1]; + m_vOriginalCornerID[1] = m_vOriginalCornerID[2]; + m_vOriginalCornerID[2] = buffer; + if ( output ) UG_LOG("SWITCH vInsideCorneers\n"); + } + + if ( output ) + { + UG_LOG("---------- nach SWITCH ---------- \n"); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); + } + +/* + for(size_t i = 0; i < 3; ++i) + UG_LOG("vOutsideCorners[i] = " << vOutsideCorners[i] << "\n"); + for(size_t i = 0; i < 3; ++i) + UG_LOG("vInsideCorners[i] = " << vInsideCorners[i] << "\n"); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + UG_LOG("m_vInterfaceID[i] = " << m_vInterfaceID[i] << "\n"); + for(size_t i = 0; i < 6; ++i) + UG_LOG("m_vCornerCoords[i] = " << m_vCornerCoords[i] << "\n"); +*/ + + if ( output ) + { + const char* filename = "output3d."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + + fprintf(outputFile,"\n_________________________ begin 'Prism3' ________________________\n"); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); + + fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); + + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + + + fprintf(outputFile,"\n_________________________ end 'Prism3' ______________________________\n\n"); + + fclose(outputFile); + //UG_THROW("first check: Prism3\n"); + } + return m_vCornerCoords.size(); + +} + +template +int InterfaceHandlerLocalBase:: +CollectCorners_FlatTop_Prism4(GridObject* elem) +{ +/////////////////////////////////////////////////////////////////// +// 1) push_back 'insideCorner' into 'm_vCornerCoords' +// 2) collect according outsideCorner (lying on the commom edge) +// 3) push_back 'intersectionPoints' into 'm_vCornerCoords' +// 4) check for CCW-property +/////////////////////////////////////////////////////////////////// + + bool output = false; + if ( output ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_Prism4()' ______________________________\n\n"); + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // collect outside indices: + std::vector outsideInd; + for(size_t i = 0; i < vVertex.size(); ++i) + if ( is_FTVertex(vVertex[i], i) ) + outsideInd.push_back(i); + + if ( outsideInd.size() != 2 ) UG_THROW("Wrong number of outsideInd!\n"); + for(size_t i = 0; i < outsideInd.size(); ++i) + if ( output ) UG_LOG("outsideInd = " << outsideInd[i] << "\n"); + + // loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrtRoot = vVertex[i]; + if ( ! is_FTVertex(vrtRoot, i) ) + { + /////////////////////////////////////////////////////////////////// + // 1) push_back 'insideCorner' into 'm_vCornerCoords' + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + /////////////////////////////////////////////////////////////////// + // 2) collect according outsideCorner (lying on the commom edge) + MathVector intersectionPnt; + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("error in collecting vertices associated to an edge!\n"); + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + size_t vrtInd1 = get_vertex_index(vrt1, elem); + size_t vrtInd2 = get_vertex_index(vrt2, elem); + + // lies vrtRoot on a cutted edge? + // case1: vrt1 = outsideParticle && vrt2 = insideParticle: + if ( vrtRoot == vrt1 && is_FTVertex(vrt2, vrtInd2) ) + { + /////////////////////////////////////////////////////////////////// + // 3) push_back 'intersectionPnt' into 'm_vCornerCoords' + get_intersection_point(intersectionPnt, vrt1, vrt2); + m_vCornerCoords.push_back(intersectionPnt); + + if ( vrt2 == vVertex[outsideInd[0]] ) + m_vOriginalCornerID.push_back(outsideInd[0]); + else if ( vrt2 == vVertex[outsideInd[1]] ) + m_vOriginalCornerID.push_back(outsideInd[1]); + else UG_THROW("No outsideInd found.\n"); + } + // case2: vrt1 = insideParticle && vrt2 = outsideParticle: + else if ( vrtRoot == vrt2 && is_FTVertex(vrt1, vrtInd1) ) + { + /////////////////////////////////////////////////////////////////// + // 3) push_back 'intersectionPnt' into 'm_vCornerCoords' + get_intersection_point(intersectionPnt, vrt2, vrt1); + m_vCornerCoords.push_back(intersectionPnt); + + if ( vrt1 == vVertex[outsideInd[0]] ) + m_vOriginalCornerID.push_back(outsideInd[0]); + else if ( vrt1 == vVertex[outsideInd[1]] ) + m_vOriginalCornerID.push_back(outsideInd[1]); + else UG_THROW("No outsideInd found.\n"); + } + else + continue; + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners3d_Prism2()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " + << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + } // end edge-loop + } // end inside-case + } // end vertex-loop + + m_vInterfaceID.push_back(1); + m_vInterfaceID.push_back(2); + m_vInterfaceID.push_back(4); + m_vInterfaceID.push_back(5); + + +// some checks: + if ( m_vInterfaceID.size() != 4 ) UG_THROW("wrong size for m_vInterfaceID! Should be 4 and is " << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 6 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 6 and is " << m_vOriginalCornerID.size() << "\n"); + if ( m_vCornerCoords.size()!= 6 ) UG_THROW("wrong size for m_vCornerCoords! Should be 6 and is " << m_vCornerCoords.size() << "\n"); + +/////////////////////////////////////////////////////////////////// +// 4) check for CCW-property + + if ( output ) + { + UG_LOG("---------- vor SWITCH ---------- \n"); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); + } + + std::vector > vTriangleCorners1; + std::vector > vTriangleCorners2; + for(size_t i = 0; i < 3; ++i){ + vTriangleCorners1.push_back(m_vCornerCoords[i]); + vTriangleCorners2.push_back(m_vCornerCoords[3+i]); + } +// get normal to triangle, built by 'vOutsideCorners'-array: + MathVector normal = m_vCornerCoords[0]; + VecSubtract(normal, m_vCornerCoords[3], normal); + + if ( !isCCW(vTriangleCorners1, normal) ) + { + // switch ' m_vCornerCoords' + m_vCornerCoords[1] = vTriangleCorners1[2]; + m_vCornerCoords[2] = vTriangleCorners1[1]; + // switch ' m_vOriginalCornerID' + size_t buffer = m_vOriginalCornerID[1]; + m_vOriginalCornerID[1] = m_vOriginalCornerID[2]; + m_vOriginalCornerID[2] = buffer; + if ( output ) UG_LOG("SWITCH vTriangleCorners1\n"); + + } + +// check 'vInsideCorners'-array for CCW: + if ( !isCCW(vTriangleCorners2, normal) ) + { + // switch ' m_vCornerCoords' + m_vCornerCoords[4] = vTriangleCorners2[2]; + m_vCornerCoords[5] = vTriangleCorners2[1]; + // switch ' m_vOriginalCornerID' + size_t buffer = m_vOriginalCornerID[4]; + m_vOriginalCornerID[4] = m_vOriginalCornerID[5]; + m_vOriginalCornerID[5] = buffer; + if ( output ) UG_LOG("SWITCH vTriangleCorners2\n"); + } + + if ( output ) + { + UG_LOG("---------- nach SWITCH ---------- \n"); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); + } + +/* + for(size_t i = 0; i < 3; ++i) + UG_LOG("vTriangleCorners1[i] = " << vTriangleCorners1[i] << "\n"); + for(size_t i = 0; i < 3; ++i) + UG_LOG("vTriangleCorners2[i] = " << vTriangleCorners2[i] << "\n"); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + UG_LOG("m_vInterfaceID[i] = " << m_vInterfaceID[i] << "\n"); + for(size_t i = 0; i < 6; ++i) + UG_LOG("m_vCornerCoords[i] = " << m_vCornerCoords[i] << "\n"); +*/ + + if ( output ) + { + UG_LOG("_________________________ end 'CollectCorners_FlatTop_Prism4()' ______________________________\n\n"); + + + const char* filename = "output3d."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + fprintf(outputFile,"\n_________________________ begin 'Prism4' ________________________\n"); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); + + fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); + + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + + + fprintf(outputFile,"\n_________________________ end 'Prism4' ______________________________\n\n"); + + fclose(outputFile); + //UG_THROW("first check: Prism2\n"); + } + return m_vCornerCoords.size(); + +} + +template +int InterfaceHandlerLocalBase:: +CollectCorners_FlatTop_Pyramid(GridObject* elem) +{ +/////////////////////////////////////////////////////////////////// +// 1) push_back into 'vInsideCorners' +// 2) push_back into 'vOutsideCorners' the 2 outsideCorners on a cut edge +// 3) write nearInterfaceCorner on m_vCornerCoords[4], since in this setting it +// is ALWAYS the top of the Pyramid! --> see grid_object_3d.h for ordering! +/////////////////////////////////////////////////////////////////// + + bool output = false; + + if ( output ) + UG_LOG("_________________________ begin 'CollectCorners_FlatTop_Pyramid()' ______________________________\n\n"); + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) - for application of 'ResortQuadrilateral'! + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::pair, size_t > nearInterfaceData; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // loop vertices + size_t outsideInd; + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrtRoot = vVertex[i]; + + // get nearInterfaceData and directly write cornerCoords to data: + if ( is_nearInterfaceVertex(vrtRoot, i) ) + nearInterfaceData = std::make_pair(m_aaPos[vrtRoot], i); + else if ( ! is_FTVertex(vrtRoot, i) ) + { + /////////////////////////////////////////////////////////////////// + // 1) push_back into 'vInsideCorners' + vInsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); + m_vOriginalCornerID.push_back(i); + + /////////////////////////////////////////////////////////////////// + // 2) collect according outsideCorner (lying on the commom edge) + bool outsideCornerFound = false; + MathVector intersectionPnt; + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("in 'NEWcall_Extrapolation': error in collecting vertices associated to an edge!....EXIT!...\n"); + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + size_t vrtInd1 = get_vertex_index(vrt1, elem); + size_t vrtInd2 = get_vertex_index(vrt2, elem); + + // lies vrtRoot on a cutted edge? + // do nothing for edges with 1 insideCorner and 1 nearInterface corner: + if ( is_nearInterfaceVertex(vrt1,vrtInd1) || is_nearInterfaceVertex(vrt2,vrtInd2) ) + continue; + // case2: vrt1 = outsideParticle && vrt2 = insideParticle: + else if ( vrtRoot == vrt1 && is_FTVertex(vrt2, vrtInd2) ) + {outsideCornerFound = get_intersection_point(intersectionPnt, vrt1, vrt2);} + // case3: vrt2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt2 && is_FTVertex(vrt1, vrtInd1) ) + {outsideCornerFound = get_intersection_point(intersectionPnt, vrt2, vrt1);} + else + continue; + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners3d_Prism3()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + + } // end edge-loop + + if ( !outsideCornerFound ) + UG_THROW("During edge-loop no outsideCorner found!\n"); + + /////////////////////////////////////////////////////////////////// + // 3) push_back into 'vOutsideCorners' + vOutsideCorners.push_back(std::make_pair(intersectionPnt, 0)); + + } // end inside-case + else + // recall ousideIndex for 'm_vOriginalCornerID' + outsideInd = i; + + } // end vertex-loop + +// some checks: + if ( vInsideCorners.size() != 2 ) UG_THROW("wrong size for vInsideCorners! Should be 2 and is " << vInsideCorners.size() << "\n"); + if ( vOutsideCorners.size() != 2 ) UG_THROW("wrong size for vOutsideCorners! Should be 2 and is " << vOutsideCorners.size() << "\n"); + + for(size_t i = 0; i < vOutsideCorners.size(); ++i) + vOutsideCorners[i].second = outsideInd; + +// during ResortQuadrilateral: m_vCornerCoords.resize(4) and m_vOriginalCornerID.resize(4)! + MathVector normalDir; + VecSubtract(normalDir, nearInterfaceData.first, vOutsideCorners[0].first); + ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); + + m_vCornerCoords.push_back(nearInterfaceData.first); + m_vOriginalCornerID.push_back(nearInterfaceData.second); + m_vInterfaceID.push_back(4); + +// some checks: + if ( m_vInterfaceID.size() != 3 ) UG_THROW("wrong size for m_vInterfaceID! Should be 3 and is " << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 5 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 5 and is " << m_vOriginalCornerID.size() << "\n"); + if ( m_vCornerCoords.size()!= 5 ) UG_THROW("wrong size for m_vCornerCoords! Should be 5 and is " << m_vCornerCoords.size() << "\n"); + +/* + for(size_t i = 0; i < 2; ++i) + UG_LOG("vOutsideCorners[i] = " << vOutsideCorners[i] << "\n"); + for(size_t i = 0; i < 2; ++i) + UG_LOG("vInsideCorners[i] = " << vInsideCorners[i] << "\n"); + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + UG_LOG("m_vInterfaceID[i] = " << m_vInterfaceID[i] << "\n"); + for(size_t i = 0; i < 5; ++i) + UG_LOG("m_vCornerCoords[i] = " << m_vCornerCoords[i] << "\n"); +*/ + + const char* filename = "output3d_Prism."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + + fprintf(outputFile,"\n_________________________ begin 'Pyramid' ________________________\n"); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); + + fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); +/* + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); + +*/ + fprintf(outputFile,"\n_________________________ end 'Pyramid' ______________________________\n\n"); + + fclose(outputFile); + //UG_THROW("first check: Prism3\n"); + + return m_vCornerCoords.size(); + +} + +template +int InterfaceHandlerLocalBase:: +CollectCorners_FlatTop_originalTet(GridObject* elem) +{ + if ( 0 ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_originalTet()' ______________________________\n\n"); + + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + for(size_t i = 0; i < vVertex.size(); ++i) + is_FTVertex(vVertex[i], i); + + // loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + if ( ! is_FTVertex(vrtRoot, i) ) + { + if ( is_nearInterfaceVertex(vrtRoot, i) ) + { UG_THROW("NearInterface BUT !is_FTVertex() => error!\n"); } + else + { + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + } + + } + else if ( is_nearInterfaceVertex(vrtRoot, i) ) + { + m_vCornerCoords.push_back(m_aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); + } + else + UG_THROW("in 'CollectCorners_FlatTop_originalTet()': outside fluid and NOT nearInterface case not possible!\n"); + } + + if ( 0 ) UG_LOG("_________________________ end 'CollectCorners_FlatTop_originalTet()' ______________________________\n\n"); + + return m_vCornerCoords.size(); + +} + +template +int InterfaceHandlerLocalBase:: +get_cutMode(std::vector vVertex) +{ + size_t numOutside = 0; + size_t numNearInterface = 0; + for(size_t i = 0; i < vVertex.size(); ++i) + { + if ( is_FTVertex(vVertex[i], i) ) + { + numOutside++; + if ( is_nearInterfaceVertex(vVertex[i], i) ) + numNearInterface++; + } + } + + bool logMode = false; + +// if all outside corners are nearInterface, no computation of intersectionPoints +// => purely collecting of corners necessary: + if ( numOutside == numNearInterface ) + { + if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 0\n"); + return 0; // original + } + else if ( numOutside == 1 ) + { + if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 1\n"); + return 1; // Prism3 + } + else if ( numOutside == 2 && numNearInterface == 0 ) + { + if ( logMode ) if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 2\n"); + return 2; // Prism4 + } + else if ( numOutside == 2 && numNearInterface == 1 ) + { + if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 3\n"); + return 3; // Pyramid + } + else if ( numOutside == 3 ) + { + if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 4\n"); + return 4; // Tetrahedron + } + return -1; + +} + +template +int InterfaceHandlerLocalBase:: +CollectCorners_FlatTop_3d(GridObject* elem) +{ + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + size_t cutMode = get_cutMode(vVertex); + + switch(cutMode) + { + case 0: return CollectCorners_FlatTop_originalTet(elem); // Tetrahedron with 1 corner nearInterface + case 1: return CollectCorners_FlatTop_Prism3(elem); // Prism3 with 3 corners outside + case 2: return CollectCorners_FlatTop_Prism4(elem); // Prism4 with 4 corners outside + case 3: return CollectCorners_FlatTop_Pyramid(elem); // Pyramid with 2 corners outside and 1 corner nearInterface + case 4: return CollectCorners_FlatTop_2d(elem); // Tetrahedron with 3 corners outside + default: { UG_LOG("cutMode = " << cutMode << "\n"); + throw(UGError("Error in calling case dependent CollectIBCorners3d()!")); + } + } + + +} + +template +void InterfaceHandlerLocalBase:: +print_InterfaceDdata() +{ + UG_LOG(" ------------ print_InterfaceIDdata -----------\n"); + + if ( m_roid == ROID_QUADRILATERAL ) + UG_LOG("ín add_jac_A_elem ---------ROID_QUADRILATERAL--------\n"); + if ( m_roid == ROID_TRIANGLE ) + UG_LOG("ín add_jac_A_elem ---------ROID_TRIANGLE--------\n"); + + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); + for ( size_t i = 0; i < m_vOriginalCornerID.size(); ++i ) + UG_LOG("Original: id = " << m_vOriginalCornerID[i] << "\n"); + UG_LOG("\n"); + for ( size_t i = 0; i < m_vInterfaceID.size(); ++i ) + UG_LOG("Interface: id = " << m_vInterfaceID[i] << "\n"); + UG_LOG("\n"); + +} + +} // end namespace ug + + + +#endif /* INTERFACE_HANDLER_LOCAL_BASE_TOOLS_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h new file mode 100644 index 000000000..19ba1ade0 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h @@ -0,0 +1,346 @@ +/* + * interface_handler_local.h + * + * Created on: 15.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_FLAT_TOP_H_ +#define INTERFACE_HANDLER_FLAT_TOP_H_ + +#include "lib_disc/spatial_disc/disc_util/geom_provider.h" +#include "lib_grid/multi_grid.h" + +#include "../interface_handler_base.h" + +#include + +namespace ug{ + + +template +class DimFV1FTGeometry; + +template +class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase +//class FlatTopHandler : public IInterfaceHandlerLocal +{ + + public: + /// world dimension + static const int dim = TWorldDim; + + /// max number of geometric objects in a dimension + // (most objects in 1 dim, i.e. number of edges, but +1 for 1D) + static const int maxMid = DimFV1FTGeometry >::maxNumSCVF + 1; + + /// used traits + typedef fv1_dim_traits traits; + + /// used boundary face type + typedef typename DimFV1FTGeometry >::BF interfaceBF; + + /// Type of position coordinates + typedef MathVector position_type; + + /// Type of Position Attachment + typedef Attachment position_attachment_type; + + /// Type of Accessor to the Position Data Attachment + typedef Grid::VertexAttachmentAccessor position_accessor_type; + + + InterfaceHandlerLocalParticle(SmartPtr > cutElementHandler, + number fluidDensity, number fluidKinVisc); + + + virtual ~InterfaceHandlerLocalParticle() {} + + ////////////////////////////////////////////////////////////////// + /// virtual base class methods which need to be implemented: + ////////////////////////////////////////////////////////////////// + + // used for method 'CollectCorners_': + number get_LSvalue_byPosition(MathVector vrtPos) + { + // ToTo + // if ( m_prtIndex == -1 ) + // UG_THROW("'get_LSvalue_byPosition()': value of m_prtIndex not valid!\n"); + return m_spCutElementHandler->get_LSvalue_byPosition(vrtPos, m_prtIndex); + } + number get_LSvalue(Vertex* vrt, const int prtIndex) + { + UG_THROW("Attention in 'get_LSvalue(vrt, prtIndex)': check if second argument = prtIndex is valid!...prtIndex = " << prtIndex << "\n"); + return m_spCutElementHandler->get_LSvalue(vrt, prtIndex); + } + + + bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc) + { + const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; + const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; + + if ( this->m_orientationInterface == 1 ) + return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, m_prtIndex); + // inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' + // to avoid error for alpha < 0: + else if ( this->m_orientationInterface == -1 ) + { + if ( m_prtIndex == -1 ) UG_THROW("'get_intersection_point()': value of m_prtIndex not valid!\n"); + return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, m_prtIndex); + } + else + UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); + } + + bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc, std::vector& alphaOut) + { + const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; + const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; + + if ( this->m_orientationInterface == 1 ) + return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, m_prtIndex, alphaOut); + // inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' + // to avoid error for alpha < 0: + else if ( this->m_orientationInterface == -1 ) + { + if ( m_prtIndex == -1 ) UG_THROW("'get_intersection_point()': value of m_prtIndex not valid!\n"); + return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, m_prtIndex, alphaOut); + } + else + UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); + } + + ////////////////////////////////////////////////////////// + /// original class methods + ////////////////////////////////////////////////////////// + + bool update_elem(GridObject* elem, const MathVector* vCornerCoords) + { + set_prtIndex(elem); + return update(elem, vCornerCoords); + } + + void update_inner_boundary(const MathVector* vCornerCoords) + { + if ( this->StdFV_assembling() ) + update_inner_boundary_radial_StdFV(vCornerCoords); + else + update_inner_boundary_radial(vCornerCoords); + } + + void update_inner_boundary_for2() + { + if ( this->StdFV_assembling() ) + {update_inner_boundary_radial_for2_StdFV();} + else + {update_inner_boundary_radial_for2();} + } + + // new methods + void update_inner_boundary_radial(const MathVector* vCornerCoords); + void update_inner_boundary_radial_for2(); + void update_inner_boundary_radial_for2_StdFV(); + void update_inner_boundary_radial_old(); + void update_inner_boundary_radial_StdFV(const MathVector* vCornerCoords); + + ////////////////////////////////////////////////////////// + /// original class methods + helper methods for 'update()' + ////////////////////////////////////////////////////////// + + /// collects all corners of the flat top element + int CollectCorners_FlatTop_3d(GridObject* elem); + int get_cutMode(std::vector vVertex); + int CollectCorners_FlatTop_Prism3(GridObject* elem); + int CollectCorners_FlatTop_Prism4(GridObject* elem); + int CollectCorners_FlatTop_Pyramid(GridObject* elem); + int CollectCorners_FlatTop_originalTet(GridObject* elem); + + /// !!! nicht in Base! + /*void ResortQuadrilateral_for2(std::vector > vQuadriCorners); + + int CollectCorners_StdFV_for2(GridObject* elem); + int CollectCorners_FlatTop_2d_for2(GridObject* elem); + int CollectTriangle_and_Quadri_for2(GridObject* elem, Vertex* vrtInside); + int CollectQuadrilateral_besideTri_for2(GridObject* elem); + int CollectQuadrilateral_for2(GridObject* elem); + + void compute_flat_top_data_for2(GridObject* elem); + + */ + + ////////////////////////////////////////////////////////////////////////// + /// methods, which need to be implemented originating from the base class + ////////////////////////////////////////////////////////////////////////// + + bool is_FTVertex(Vertex* vrt) + { + if ( m_prtIndex == -1 ) {return m_spCutElementHandler->is_FTVertex(m_prtIndex, vrt);} + else return m_spCutElementHandler->is_FTVertex(vrt); } + bool is_FTVertex(Vertex* vrt, size_t vrtIndex) + { return is_FTVertex(vrt); } + + + bool is_FTVertex(int& prtIndex, Vertex* vrt) + { return m_spCutElementHandler->is_outsideFluid(prtIndex, vrt); } + + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { if ( m_prtIndex == -1 ) return m_spCutElementHandler->is_FTVertex(m_prtIndex, vrt); + else return m_spCutElementHandler->is_OutsideVertex(vrt, vrtIndex); } + + + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { return m_spCutElementHandler->is_nearInterfaceVertex(vrt, vrtIndex); } + bool is_nearInterfaceVertex(Vertex* vrt) + { return is_nearInterfaceVertex(vrt, 0); } + + + + /////////////////////////////////////////////////////////////// + /// new methods + /////////////////////////////////////////////////////////////// + + /// for boundary computations + bool is_boundary_face_for2(const size_t sideID); + + /// acces to 'm_vQuadriCorners_for2' + const std::vector > quadriCorners() const { return m_vQuadriCorners_for2; } + + /// needed during 'CollectQuadrilateral_besideTri_for2()': + void switch_order(); + + void set_prtIndex(GridObject* elem); + + /// called during 'ParticleMapper::modify_LocalData()': + void resize_local_indices(LocalVector& locU); + void resize_local_indices(LocalVector& locU, size_t numCo); + + SmartPtr > get_cutElementHandler() { return m_spCutElementHandler; } + + /// updates 'm_elemModus'; called by FV1FTGeom::update()!! + bool update(GridObject* elem, const MathVector* vCornerCoords); // = preprocess() of flat_top.h + + /// should be called by 'CutElementHandler::update()' directly => no call via this method! + ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation) + { return m_spCutElementHandler->compute_element_modus(elem, interfaceOrientation); } + + /// called by 'InterfaceHandlerLocalParticle::update()' + ElementModus get_element_modus(GridObject* elem) + { return m_spCutElementHandler->get_element_modus(elem); } + + + /////////////////////////////////////////////////////////////// + /// new setter methods + /////////////////////////////////////////////////////////////// + + void set_local_couplings_jac(LocalMatrix rotJ_ind, LocalMatrix rotJ_rot) + { m_rotJ_ind = rotJ_ind; m_rotJ_rot = rotJ_rot; } + + void set_local_couplings_def(LocalVector rotD) + { m_rotD = rotD;} + + /////////////////////////////////////////////////////////////// + /// new getter methods + /////////////////////////////////////////////////////////////// + + number get_density(int prtIndex) { return m_spCutElementHandler->get_density(prtIndex); } + number get_density_fluid() { return m_fluidDensity; } + number get_kinVisc_fluid() { return m_fluidKinVisc; } + MathVector get_center(int prtIndex){ return m_spCutElementHandler->get_center(prtIndex);} + + /// access to single entry of 'm_vRadialAtIP' + MathVector radial_at_ip(size_t i) { return m_vRadialAtIP[i]; } + /// access to single entry of 'm_vRadialAtCo' + MathVector radial_at_co(size_t i) { return m_vRadialAtCo[i]; } + + SmartPtr > get_particles() { return m_spCutElementHandler->get_particles(); } + + size_t num_particles() const { return m_spCutElementHandler->num_particles();} + + std::vector& get_boundary_faces() { return this->m_vBF; } + + const LocalIndices& get_local_indices() const { return m_ind; } + + int get_prtIndex() + { if ( m_prtIndex == -1 ) UG_THROW("InterfaceHandlerLocalParticle::apper::get_prtIndex(): prtIndex not set!(): prtIndex not set!\n"); + return m_prtIndex; + } + int getPrtIndex(size_t dof) + { + int prtIndex = m_spCutElementHandler->get_prtIndex(dof); + return prtIndex; + } + + /// used in mapper: + number get_rotJ_ind(size_t fct1, size_t dof1, size_t fct2, size_t dof2) + { return m_rotJ_ind(fct1, dof1, fct2, dof2); } + number get_rotJ_rot(size_t fct1, size_t dof1, size_t fct2, size_t dof2) + { return m_rotJ_rot(fct1, dof1, fct2, dof2); } + + number get_rotD(size_t fct, size_t dof) + { return m_rotD(fct, dof); } + + /////////////////////////////////////////////////////////////// + /// get solution values (used by 'immersedbnd_cond.h' + + MathVector get_transSol(size_t prtIndex, size_t timeSeriesInd) + { return m_spCutElementHandler->get_transSol(prtIndex, timeSeriesInd); } + MathVector get_rotSol(size_t prtIndex, size_t timeSeriesInd) + { return m_spCutElementHandler->get_rotSol(prtIndex, timeSeriesInd); } + + MathMatrix get_rotationMat(MathVector radialVector) + { return m_spCutElementHandler->get_rotationMat(radialVector); } + + + /////////////////////////////////////////////////////////////// + /// data for Particle + /////////////////////////////////////////////////////////////// + + std::vector m_vBF; // updated during FV1FTGeom::update_inner_boundary_faces() + + /// actual particle index: set during 'm_spCutElementHandler->compute_element_modus()'!!! + int m_prtIndex; + + std::map m_vPrtIndices; + + /// fuid parameter imported by Constructor() + number m_fluidDensity; + number m_fluidKinVisc; + + /// local data for assembling: + LocalMatrix m_rotJ_ind; + LocalMatrix m_rotJ_rot; + LocalVector m_rotD; + + /// size of local algebra for flat top element: 'm_numFct' x 'm_numCo' + size_t m_numFct; + + /// number of corners of flat top element + size_t m_numCo; + + /// new local algebra for resized flat top element + LocalIndices m_ind; + + std::vector > m_vRadialAtIP; // global position of scvf on interface + std::vector > m_vRadialAtCo; // global position of scv on interface + + /// flag for computation of 'm_vRadialAtIP' during call of 'update_inner_boundary_faces()' + const bool m_bRadial_forMassEq_equals_Normal; // default = true + + + /// flag indiating if local data needs to be updated + bool m_bBndDataNeeded; // default = false; + // flag used e.g. in 'FV1FTGeometry::update()' + + std::vector > m_vQuadriCorners_for2; + + SmartPtr > m_spCutElementHandler; + }; + + +}// end namespace ug + +#include "interface_handler_particle_tools.h" +#include "interface_handler_particle_impl.h" + +#endif /* INTERFACE_HANDLER_FLAT_TOP_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_impl.h new file mode 100644 index 000000000..a4f4b6ca8 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_impl.h @@ -0,0 +1,254 @@ +/* + * interface_handler_local_impl.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_FLAT_TOP_IMPL_H_ +#define INTERFACE_HANDLER_FLAT_TOP_IMPL_H_ + + + +namespace ug{ + +/////////////////////////////////////////////////////////////// +/// methods for class 'IInterfaceHandlerLocal' +/////////////////////////////////////////////////////////////// + + + +/////////////////////////////////////////////////////////////// +/// methods for class 'InterfaceHandlerLocalParticle' +/////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////// +// Constructor +/////////////////////////////////////////////////////////////// +template +InterfaceHandlerLocalParticle:: +InterfaceHandlerLocalParticle(SmartPtr > cutElementHandler, + number fluidDensity, number fluidKinVisc) : + InterfaceHandlerLocalBase(cutElementHandler), + m_prtIndex(-1), + m_fluidDensity(fluidDensity), + m_fluidKinVisc(fluidKinVisc), + m_numFct(0), m_numCo(0), + m_bRadial_forMassEq_equals_Normal(true), + m_bBndDataNeeded(false), +// m_spInterfaceProvider(interfaceProvider), + m_spCutElementHandler(cutElementHandler) +{ + + m_vRadialAtIP.clear(); + m_vRadialAtCo.clear(); +} + + +template +void InterfaceHandlerLocalParticle:: +resize_local_indices(LocalVector& locU) +{ +// 1. get global indices + m_ind = locU.get_indices(); + m_numFct = m_ind.num_fct(); + m_numCo = this->numCo(); + +// 2. get new local algebra with potentially more indices + m_ind.resize_fct(m_numFct); + // -> here, the original data, i.e. global index information of u.m_pIndex (-> 'u.m_pIndex.m_vvIndex[num_fct][num_dof]'), + // is preserved, and for the new indices, global index = 0 is appended! + for (size_t fct = 0; fct < m_numFct; ++fct) + m_ind.resize_dof(fct, m_numCo); + + return; +} + +template +void InterfaceHandlerLocalParticle::resize_local_indices(LocalVector& locU, size_t numCo) +{ +// 1. get global indices + m_ind = locU.get_indices(); + m_numFct = m_ind.num_fct(); +// m_numCo = numCo; + +// 2. get new local algebra with potentially more indices + m_ind.resize_fct(m_numFct); + // -> here, the original data, i.e. global index information of u.m_pIndex (-> 'u.m_pIndex.m_vvIndex[num_fct][num_dof]'), + // is preserved, and for the new indices, global index = 0 is appended! + for (size_t fct = 0; fct < m_numFct; ++fct) + m_ind.resize_dof(fct, numCo); + + return; +} + +template +void InterfaceHandlerLocalParticle:: +set_prtIndex(GridObject* elem) +{ + int isOutside = 0; + + // collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + + std::vector vPrtIndex(vVertex.size(), -1); + + m_vPrtIndices.clear(); + + int refIndex = -1; + for(size_t i = 0; i < vVertex.size(); ++i) + { + if ( is_FTVertex(vVertex[i]) ) + { + if ( !m_spCutElementHandler->is_outsideFluid(vPrtIndex[i], vVertex[i]) ) + UG_THROW("in InterfaceHandlerLocalParticle::get_vPrtIndex(): inconsisent boolian for vertex: " + "is_FTVertex = true, but is_outsideFLuid = false!\n"); + refIndex = vPrtIndex[i]; + m_vPrtIndices[vVertex[i]] = refIndex; + isOutside++; + } + } + + bool set_prtIndex = true; + if ( isOutside > 0 ) + { + for(size_t i = 0; i < vVertex.size(); ++i) + { + if ( vPrtIndex[i] != refIndex && vPrtIndex[i] != -1) + { + set_prtIndex = false; + UG_LOG("SPECIAL case: 1 element is cut by 2 DIFFERENT particles! EXIT...\n"); + } + } + + } + + + // set m_prtIndex to unique prtIndex found: + if ( set_prtIndex ) m_prtIndex = refIndex; + + +} + +template +void InterfaceHandlerLocalParticle:: +switch_order() +{ + UG_LOG("============= VOR switch_order ===============\n"); + for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) + UG_LOG("buffer_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); + +// A: switch 'buffer_vCornerCoords' + std::vector > buffer_vCornerCoords; + buffer_vCornerCoords.push_back(m_vQuadriCorners_for2[1]); + buffer_vCornerCoords.push_back(m_vQuadriCorners_for2[0]); + + m_vQuadriCorners_for2.clear(); + m_vQuadriCorners_for2.push_back(buffer_vCornerCoords[0]); + m_vQuadriCorners_for2.push_back(buffer_vCornerCoords[1]); + +// B: switch 'buffer_vQuadriOrigID': + std::vector buffer_vQuadriOrigID; + buffer_vQuadriOrigID.push_back(this->m_vQuadriOrigID[1]); + buffer_vQuadriOrigID.push_back(this->m_vQuadriOrigID[0]); + + this->m_vQuadriOrigID.clear(); + this->m_vQuadriOrigID.push_back(buffer_vQuadriOrigID[0]); + this->m_vQuadriOrigID.push_back(buffer_vQuadriOrigID[1]); + + UG_LOG("============= NACH switch_order ===============\n"); + for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) + UG_LOG("m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); + +} + +/* +template +void InterfaceHandlerLocalParticle:: +compute_flat_top_data_for2(GridObject* elem) +{ + + if ( dim == 2 ) { CollectCorners_FlatTop_2d_for2(elem); } + if ( dim == 3 ) + UG_THROW("compute_flat_top_data_for2() not implemented for dim = 3!\n"); + + + // some checks: + if ( this->m_vCornerCoords.size() == 0 ) + UG_THROW("this->m_vCornerCoords.size() = " << this->m_vCornerCoords.size() << "not possible!\n"); + + if ( dim == 2 ) + if ( elem->reference_object_id() != ROID_TRIANGLE ) + UG_THROW("Discretisation only coded for triangular elements!\n"); + + if ( dim == 3 ) + if ( elem->reference_object_id() != ROID_TETRAHEDRON ) + UG_THROW("Discretisation only coded for tetrahedral elements!\n"); + + // output routines + if ( 0 ) + { + UG_LOG("_________________ compute_flat_top_data_for2()_________________\n"); + + for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) + UG_LOG("this->m_vCornerCoords = " << this->m_vCornerCoords[i] << "\n"); + for ( size_t i = 0; i < this->m_vOriginalCornerID.size(); ++i ) + UG_LOG("Original: id = " << this->m_vOriginalCornerID[i] << "\n"); + UG_LOG("\n"); + for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i ) + UG_LOG("Interface: id = " << this->m_vInterfaceID[i] << "\n"); + UG_LOG("\n"); + } + +} +*/ + +// see preprocess() of flat_top.h +// called by geo.update()!! +template +bool InterfaceHandlerLocalParticle:: +update(GridObject* elem, const MathVector* vCornerCoords) +{ + bool do_update_local = false; +// reset data + m_vBF.clear(); + +// computing flat top modus + this->m_elemModus = this->get_element_modus(elem); // computed via 'compute_element_modus()' during 'update_marker()' + + switch(this->m_elemModus) + { + case INSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + break; // usual assembling + case OUTSIDE_DOM: if ( this->StdFV_assembling() ){ + //compute_flat_top_data(elem); + this->set_flat_top_data(elem, vCornerCoords, ROID_UNKNOWN); // => enforce update_local() for next element! (necessary, because hereafter num_SCVF == 0!!) + } + else + this->set_flat_top_data(elem, vCornerCoords, ROID_UNKNOWN); // => enforce update_local() for next element! (necessary, because hereafter num_SCVF == 0!!) + break; + case CUT_BY_INTERFACE: this->compute_flat_top_data(elem); + //if ( this->m_roid == ROID_PYRAMID )UG_THROW("PYRAMID\n"); + do_update_local = true; + break; // flat top assembling +/* case CUT_BY_2_INTERFACE: if ( this->StdFV_assembling() ) + this->compute_flat_top_data(elem); + else + compute_flat_top_data_for2(elem); + do_update_local = true; + break;*/ + default: + throw(UGError("Error in InterfaceHandlerLocalParticle::update(): switch(m_elemModus)!")); + } + + return do_update_local; + +} + +} // end namespace ug + + + +#endif /* INTERFACE_HANDLER_FLAT_TOP_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_tools.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_tools.h new file mode 100644 index 000000000..6f73187bd --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_tools.h @@ -0,0 +1,1408 @@ +/* + * interface_handler_local_tools.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_FLAT_TOP_TOOLS_H_ +#define INTERFACE_HANDLER_FLAT_TOP_TOOLS_H_ + +namespace ug{ + +//////////////////////////////////////////////////////////////////////////////// +// FlatTopBase methods - ROID/CollectCorners... +//////////////////////////////////////////////////////////////////////////////// + + +template +bool InterfaceHandlerLocalParticle:: +is_boundary_face_for2(const size_t sideID) +{ + if ( dim == 3 ) + UG_THROW("in 'is_boundary_face_for2()': only implemented for 2d!!\n"); + +// get data + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(this->m_roid); + + // number of corners of side (special case bottom side pyramid) + const int coOfSide = (this->m_roid != ROID_PYRAMID || sideID != 0) + ? rRefElem.num(dim-1, sideID, 0) : rRefElem.num(dim-1, sideID, 0) + 2; + + if ( coOfSide > 2 ) + UG_THROW("in 'is_boundary_face_for2()': hmm...coOfSide > 2 ??? \n coOfSide = " << coOfSide << "\n"); + + std::vector prtIndex(2); + + for(int co = 0; co < coOfSide; ++co) + { + size_t cornerID; + if (this->m_roid != ROID_PYRAMID || sideID != 0) + cornerID = rRefElem.id(dim-1, sideID, 0, co); + else + cornerID = rRefElem.id(dim-1, sideID, 0, (co % 3) + (co>3 ? 1 : 0)); + + if ( !this->lies_onInterface(cornerID) ) + return false; + else + prtIndex[co] = getPrtIndex(co); + + } + + UG_LOG("prtIndex[0]: " << prtIndex[0] << "\n"); + UG_LOG("prtIndex[1]: " << prtIndex[1] << "\n"); + + if ( prtIndex[0] == prtIndex[1] ) + { UG_THROW("========= is_boundary_face = TRUE\n"); + + return true; + } + UG_LOG("========= is_boundary_face = FALSE\n"); + + return false; +} + + + +/* +// compare implementation of 'DimFV1Geometry::update_boundary_faces()' +template +void InterfaceHandlerLocalParticle:: +update_inner_boundary_faces() +{ + + ///////////////////////////////////////////////////////////////////////////// + // get general data + ///////////////////////////////////////////////////////////////////////////// + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(this->m_roid); + + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(this->m_roid); + rMapping.update(this->m_vCornerCoords); + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(this->m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + + ///////////////////////////////////////////////////////////////////////////// + // compute local and global geom object midpoints for each dimension + ///////////////////////////////////////////////////////////////////////////// + + MathVector vvLocMid[dim+1][maxMid]; + MathVector vvGloMid[dim+1][maxMid]; + + // set corners of element as local centers of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + vvLocMid[0][i] = rRefElem.corner(i); + + // compute local midpoints + interfaceComputeMidPoints, maxMid>(rRefElem, vvLocMid[0], vvLocMid); + + // remember global position of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + vvGloMid[0][i] = this->m_vCornerCoords[i]; + // compute local midpoints + interfaceComputeMidPoints, maxMid>(rRefElem, vvGloMid[0], vvGloMid); + + ///////////////////////////////////////////////////////////////////////////// + // collect boudary faces + ///////////////////////////////////////////////////////////////////////////// + + // get number of sides of element + size_t numSides = 0; + numSides = rRefElem.num(dim-1); + + // current number of bf + size_t curr_bf = 0; + + m_vBF.clear(); + // loop sides of element + for(size_t side = 0; side < numSides; ++side) + { + // side is no boundary face => continue + if ( !is_boundary_face(side) ) + continue; + + // number of corners of side (special case bottom side pyramid) + const int coOfSide = (this->m_roid != ROID_PYRAMID || side != 0) + ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; + + // resize vector + m_vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + interfaceBF& bf = m_vBF[curr_bf]; + + // set node id == scv this bf belongs to + if (this->m_roid != ROID_PYRAMID || side != 0) + bf.nodeId = rRefElem.id(dim-1, side, 0, co); + else + { + // map according to order defined in ComputeBFMidID + bf.nodeId = rRefElem.id(dim-1, side, 0, (co % 3) + (co>3 ? 1 : 0)); + } + + // Compute MidID for BF + interfaceComputeBFMidID(rRefElem, side, bf.vMidID, co); + + // copy corners of bf + interfaceCopyCornerByMidID(bf.vLocPos, bf.vMidID, vvLocMid, interfaceBF::numCo); + interfaceCopyCornerByMidID(bf.vGloPos, bf.vMidID, vvGloMid, interfaceBF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, interfaceBF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, interfaceBF::numCo); + + // normal on scvf + traits::NormalOnSCVF(bf.Normal, bf.vGloPos, vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + // compute shapes and grads + bf.numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + // get reference mapping + rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = rMapping.sqrt_gram_det(bf.localIP); + + // compute global gradients + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + + } // end loop of corners of side + + } // end loop sides of element + + +} +*/ + + + + + +/* +template +int InterfaceHandlerLocalParticle:: +CollectCorners_StdFV_for2(GridObject* elem) +{ + + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + this->m_vCornerCoords.clear(); + this->m_vInterfaceID.clear(); + this->m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::vector, size_t > > vNearIntCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + + // get prtIndex: + bool isOutsideVertex = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // remember boolian for check, weather there existe at least one vertex, which is FT! + if ( is_OutsideVertex(vVertex[i]) || is_FTVertex(vVertex[i]) ) + { + isOutsideVertex = true; + break; + } + } + + if ( !isOutsideVertex ) + UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); + +// loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + int prtIndex; + + ////////////////////////////////////////////// + // case 1: + // vertex insideFluid => Position und index puschen + if ( !is_FTVertex(vrtRoot, i) ) + + //if ( !is_OutsideVertex(vrtRoot) && !is_FTVertex(vVertex[i])) + { + if ( is_nearInterfaceVertex(vrtRoot) ) + { + UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); + } + else + { + this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); + this->m_vOriginalCornerID.push_back(i); + + vInsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); + } + + } + else + { + this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); + this->m_vOriginalCornerID.push_back(i); + this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); // attention: push AFTER 'this->m_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); + + } + + } + + // skip whole element, since only FT points are included + if ( dim == 2 && this->m_vCornerCoords.size() != 3 ) + UG_THROW("in 'CollectCorners_StdFV()': this->m_vCornerCoords.size() " + "= " << this->m_vCornerCoords.size() << "not possible!\n"); + if ( dim == 3 && this->m_vCornerCoords.size() != 4 ) + UG_THROW("in 'CollectCorners_StdFV()': this->m_vCornerCoords.size() " + "= " << this->m_vCornerCoords.size() << "not possible!\n"); + +//////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////// + + const char* filename; + filename = "output_StdFV."; + + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + fprintf(outputFile,"\n_________________________ begin 'CollectIBCorners_StdFV' ________________________\n"); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", this->m_aaPos[vVertex[i]][0] , this->m_aaPos[vVertex[i]][1], this->m_aaPos[vVertex[i]][2]); + + fprintf(outputFile,"\n****Nachher: this->m_vCornerCoords.size() %lu \n", this->m_vCornerCoords.size()); + + for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) + fprintf(outputFile,"%e, %e, %e \n", this->m_vCornerCoords[i][0], this->m_vCornerCoords[i][1], this->m_vCornerCoords[i][2]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < this->m_vInterfaceID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: this->m_vInterfaceID = %lu\n", this->m_vInterfaceID[i]); + + fprintf(outputFile,"\n"); + + for(size_t i = 0; i < this->m_vOriginalCornerID.size(); ++i) + fprintf(outputFile,"Check in CollectIBCorner: this->m_vOriginalCornerID = %lu\n", this->m_vOriginalCornerID[i]); + + + fprintf(outputFile,"\n_________________________ end 'CollectIBCorners_StdFV()' ______________________________\n\n"); + + fclose(outputFile); + + + + return this->m_vCornerCoords.size(); + +} + + +template +void InterfaceHandlerLocalParticle:: +ResortQuadrilateral_for2(std::vector > vQuadriCorners) +{ + + UG_LOG("start ResortQuadrilateral_for2()...\n"); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // Check for CCW + // VecDot(vNormOut1,zDir) < 0 => corners of quadrilateral are not CCW: + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + MathVector<3> vNormOut1, vNormOut2; + std::vector > vCornerCoordsBlow; vCornerCoordsBlow.resize(4); + for ( size_t i = 0; i < vQuadriCorners.size(); ++i ) + { + for ( size_t d = 0; d < dim; ++d ) + vCornerCoordsBlow[i][d] = vQuadriCorners[i][d]; + if ( dim == 2 ) vCornerCoordsBlow[i][2] = 0.0; + } + CalculateTriangleNormalNoNormalize(vNormOut1, vCornerCoordsBlow[0], vCornerCoordsBlow[1], vCornerCoordsBlow[2]); + CalculateTriangleNormalNoNormalize(vNormOut2, vCornerCoordsBlow[2], vCornerCoordsBlow[3], vCornerCoordsBlow[0]); + + UG_LOG("vNormOut1: " << vNormOut1 << "\n"); + UG_LOG("vNormOut2: " << vNormOut2 << "\n"); + + if ( VecDot(vNormOut1, vNormOut2) < 0 ) UG_THROW("----> check 1 failed after second check!\n"); + + + MathVector<3> normalDir; + for ( size_t i = 0; i < 2; ++i ) + normalDir[i] = 0.0; + normalDir[2] = 1.0; + + if ( VecDot(vNormOut1, normalDir) < 0 && VecDot(vNormOut2, normalDir) > 0) + { + UG_THROW("case1: inconsistent orientation: VecDot(vNormOut1, normalDir): " << VecDot(vNormOut1, normalDir) << + ", VecDot(vNormOut2, normalDir): " << VecDot(vNormOut2, normalDir) <<"\n"); + } + else if ( VecDot(vNormOut1, normalDir) > 0 && VecDot(vNormOut2, normalDir) < 0) + { + UG_THROW("case1: inconsistent orientation: VecDot(vNormOut1, normalDir): " << VecDot(vNormOut1, normalDir) << + ", VecDot(vNormOut2, normalDir): " << VecDot(vNormOut2, normalDir) <<"\n"); + } + else + { + std::vector > vCornerCoordsBuffer; + vCornerCoordsBuffer.clear(); + m_vQuadriCorners_for2.clear(); + std::vector vQuadriIDBuffer; + vQuadriIDBuffer.clear(); + if ( vQuadriCorners.size() != 4 ) + UG_THROW("wrong size of vQuadriCorners: " << vQuadriCorners.size() << "\n"); + + // A: change orientation OR simply copy: + if ( VecDot(vNormOut1, normalDir) < 0 && VecDot(vNormOut2, normalDir) < 0) + { + for ( size_t i = 0; i < 4; ++i ) + { + vCornerCoordsBuffer.push_back(vQuadriCorners[3-i]); + vQuadriIDBuffer.push_back(this->m_vQuadriOrigID[3-i]); + } + } + else + { + for ( size_t i = 0; i < 4; ++i ) + { + vCornerCoordsBuffer.push_back(vQuadriCorners[i]); + vQuadriIDBuffer.push_back(this->m_vQuadriOrigID[i]); + } + } + // B: re-order, s.t. 1.,2. node with prtIndex = 0; 3.,4. node with prtIndex = 1: + this->m_vQuadriOrigID.clear(); + for ( size_t i = 0; i < 3; ++i ) + { + m_vQuadriCorners_for2.push_back(vCornerCoordsBuffer[i+1]); + this->m_vQuadriOrigID.push_back(vQuadriIDBuffer[i+1]); + } + m_vQuadriCorners_for2.push_back(vCornerCoordsBuffer[0]); + this->m_vQuadriOrigID.push_back(vQuadriIDBuffer[0]); + + } + + +} + +template +int InterfaceHandlerLocalParticle:: +CollectTriangle_and_Quadri_for2(GridObject* elem, Vertex* vrtInside) +{ + UG_LOG("start CollectTriangle_and_Quadri_for2()...\n"); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + UG_LOG("pos[" << i << "]: " << this->m_aaPos[vVertex[i]] << "\n"); + +// collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *this->m_spMG, elem); + + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrtRoot = vVertex[i]; + + if ( !is_FTVertex(vrtRoot) ) + { + if ( vrtRoot != vrtInside ) + UG_THROW("in 'CollectTriangle_and_Quadri_for2()': error in collecting inside vertex\n"); + this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); + this->m_vOriginalCornerID.push_back(i); + this->m_vNOInterfaceID.push_back(i); + } + else + { + + // compute intersection point of edge, build by vrtRoot and vrtInside: + MathVector intersectionPnt; + get_intersection_point(intersectionPnt, vrtInside, vrtRoot); + + UG_LOG("posRoot: " << this->m_aaPos[vrtRoot] << "posInside: " << this->m_aaPos[vrtInside] << "\n"); + UG_LOG("intersectionPnt: " << intersectionPnt << "\n"); + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectTriangle_and_Quadri_for2()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + + this->m_vCornerCoords.push_back(intersectionPnt); + this->m_vOriginalCornerID.push_back(i); + this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); + m_vQuadriCorners_for2.push_back(intersectionPnt); + this->m_vQuadriOrigID.push_back(i); + + } + + } // end vrt-loop + + CollectQuadrilateral_besideTri_for2(elem); + +} + + + +template +int InterfaceHandlerLocalParticle:: +CollectQuadrilateral_besideTri_for2(GridObject* elem) +{ + UG_LOG("start CollectQuadrilateral_besideTri_for2()...\n"); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + +// collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *this->m_spMG, elem); + + ////////////////////////////////////////////////////////////////////////////////////////// + // A: start with ordering 1 0 for the first corners in 'm_vQuardi_for2' + // => if ordering is 0 1 ---> switch + // B: add the two further corners in the order 0 1 + // => we end up with the setting 1 0 0 1 + // C: reorder as done in 'ResortQuadrilateral_for2(): + // => final order as it ought to be: 0 0 1 1 :-) + ////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////////////////////// + // A: check for ordering, weather it is 0 1: + if ( m_vQuadriCorners_for2.size() != 2 ) + UG_THROW("worng start in 'CollectQuadrilateral_besideTri_for2'!\n"); + + size_t index_of_first_quadri_corner = this->m_vInterfaceID[0]; + Vertex* vrt = vVertex[index_of_first_quadri_corner]; + int prtIndex_of_first_quadri_corner; +// get prtIndex of first quadri corner: + if ( !is_FTVertex(prtIndex_of_first_quadri_corner, vrt) ) + UG_THROW("error in 'CollectQuadrilateral_besideTri_for2()'...\n"); + + UG_LOG("prtIndex_of_first_quadri_corner: " << prtIndex_of_first_quadri_corner << "\n"); + + if ( prtIndex_of_first_quadri_corner == 0 ) + this->switch_order(); + + UG_LOG("============= after A: CHECK order ===============\n"); + for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) + UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); + for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) + UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); + + ////////////////////////////////////////////////////////////////////////////////////////// + // B: add the two further corners in the order 0 1 + // => we end up with the setting 1 0 0 1 + + // loop edges and get edge, cut by both particles: + bool pushOrderSwitch = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + size_t j = i+1; + if ( j == vVertex.size() ) j = 0; + + Vertex* vrt1 = vVertex[i]; + Vertex* vrt2 = vVertex[j]; + int prtIndex1, prtIndex2; + + MathVector intersectionPnt1, intersectionPnt2; + + if ( !is_FTVertex(prtIndex1, vrt1) || !is_FTVertex(prtIndex2, vrt2) ) + continue; + + UG_LOG("this->m_aaPos[vrt1] = " << this->m_aaPos[vrt1] << "\n"); + UG_LOG("this->m_aaPos[vrt2] = " << this->m_aaPos[vrt2] << "\n"); + UG_LOG("prtIndex1 = " << prtIndex1 << ", prtIndex2 = " << prtIndex2 << "\n"); + + if ( prtIndex1 == prtIndex2 ) + UG_THROW("prtIndex1 == prtIndex2 NOT POSSIBLE on this element!\n"); + + /// intersectionPnt1 := intersection with prtIndex1 and vrt1 = inside circle of particle with prtIndex1 + get_intersection_point_for2(intersectionPnt1, vrt2, vrt1, prtIndex1); + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition_for2(intersectionPnt1, prtIndex1)) > 1e-6 ) + UG_THROW("in 'CollectQuadrilateral_besideTri_for2()': Error in computation of 'intersectionPnt1':\n " + " intersectionPnt1 = " << intersectionPnt1 << "\n distance from interace = " << fabs(get_LSvalue_byPosition_for2(intersectionPnt1, prtIndex1)) << "\n"); + + /// intersectionPnt2 := intersection with prtIndex2 and vrt2 = inside circle of particle with prtIndex2 + get_intersection_point_for2(intersectionPnt2, vrt1, vrt2, prtIndex2); + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition_for2(intersectionPnt2, prtIndex2)) > 1e-6 ) + UG_THROW("in 'CollectQuadrilateral_besideTri_for2()': Error in computation of 'intersectionPnt2':\n " + " intersectionPnt2 = " << intersectionPnt2 << "\n distance from interace = " << fabs(get_LSvalue_byPosition_for2(intersectionPnt2, prtIndex2)) << "\n"); + + UG_LOG("intersectionPnt1 = " << intersectionPnt1 << "\n"); + UG_LOG("intersectionPnt2 = " << intersectionPnt2 << "\n"); + + // FIRST: push intersectionpoint of particle 0, SECOND: push intersectionpoint of particle 1 + if ( prtIndex1 == 0 ) + { + m_vQuadriCorners_for2.push_back(intersectionPnt1); + m_vQuadriCorners_for2.push_back(intersectionPnt2); + + this->m_vQuadriOrigID.push_back(i); + this->m_vQuadriOrigID.push_back(j); + + } + else + { + m_vQuadriCorners_for2.push_back(intersectionPnt2); + m_vQuadriCorners_for2.push_back(intersectionPnt1); + + this->m_vQuadriOrigID.push_back(j); + this->m_vQuadriOrigID.push_back(i); + } + // => resulting order according to prtIndex: 1 0 0 1 :-) + + } // end edge-loop + + UG_LOG("============= after B: CHECK order ===============\n"); + for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) + UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); + for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) + UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); + + ////////////////////////////////////////////////////////////////////////////////////////// + // C: reorder as done in 'ResortQuadrilateral_for2(): + // => final order as it ought to be: 0 0 1 1 :-) + + ResortQuadrilateral_for2(m_vQuadriCorners_for2); + // => nach reordering: 0 0 1 1 ;-) + + + UG_LOG("============= after C: CHECK order ===============\n"); + for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) + UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); + for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) + UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); + + UG_LOG("end CollectQuadrilateral_besideTri_for2()...\n"); + +} + + +template +int InterfaceHandlerLocalParticle:: +CollectQuadrilateral_for2(GridObject* elem) +{ + UG_LOG("start CollectQuadrilateral_for2()...\n"); + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vQuadriCorners; + std::vector > buffer_vQuadriCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + + for ( size_t i = 0; i < vVertex.size(); ++i ) + UG_LOG("pos[" << i << "]: " << this->m_aaPos[vVertex[i]] << "\n"); + +// collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *this->m_spMG, elem); + + bool pushOrderSwitch = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + size_t j = i+1; + if ( j == vVertex.size() ) j = 0; + + + Vertex* vrt1 = vVertex[i]; + Vertex* vrt2 = vVertex[j]; + int prtIndex1, prtIndex2; + + MathVector intersectionPnt1, intersectionPnt2; + + if ( !is_FTVertex(prtIndex1, vrt1) ) + UG_THROW("wrong method! vrt1 = " << this->m_aaPos[vrt1] << " lies NOT outside!\n"); + if ( !is_FTVertex(prtIndex2, vrt2) ) + UG_THROW("wrong method! vrt2 = " << this->m_aaPos[vrt2] << " lies NOT outside!\n"); + + UG_LOG("this->m_aaPos[vrt1] = " << this->m_aaPos[vrt1] << "\n"); + UG_LOG("this->m_aaPos[vrt2] = " << this->m_aaPos[vrt2] << "\n"); + + UG_LOG("prtIndex1 = " << prtIndex1 << ", prtIndex2 = " << prtIndex2 << "\n"); + + // no intersection by interface for prtIndex1 == prtIndex2 + if ( prtIndex1 == prtIndex2 ) + { + UG_LOG("continue...\n"); + + continue; + } + /// intersectionPnt1 := intersection with prtIndex1 and vrt1 = inside circle of particle with prtIndex1 + get_intersection_point_for2(intersectionPnt1, vrt2, vrt1, prtIndex1); + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition_for2(intersectionPnt1, prtIndex1)) > 1e-6 ) + UG_THROW("in 'CollectQuadrilateral_for2()': Error in computation of 'intersectionPnt1':\n " + " intersectionPnt1 = " << intersectionPnt1 << "\n distance from interace = " << fabs(get_LSvalue_byPosition_for2(intersectionPnt1, prtIndex1)) << "\n"); + + /// intersectionPnt2 := intersection with prtIndex2 and vrt2 = inside circle of particle with prtIndex2 + get_intersection_point_for2(intersectionPnt2, vrt1, vrt2, prtIndex2); + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition_for2(intersectionPnt2, prtIndex2)) > 1e-6 ) + UG_THROW("in 'CollectQuadrilateral_for2()': Error in computation of 'intersectionPnt2':\n " + " intersectionPnt2 = " << intersectionPnt2 << "\n distance from interace = " << fabs(get_LSvalue_byPosition_for2(intersectionPnt2, prtIndex2)) << "\n"); + + UG_LOG("intersectionPnt1 = " << intersectionPnt1 << "\n"); + UG_LOG("intersectionPnt2 = " << intersectionPnt2 << "\n"); + + if ( !pushOrderSwitch ) + { + pushOrderSwitch = true; + // FIRST: push intersectionpoint of particle 1, SECOND: push intersectionpoint of particle 0 + if ( prtIndex1 == 1 ) + { + vQuadriCorners.push_back(std::make_pair(intersectionPnt1, prtIndex1)); + vQuadriCorners.push_back(std::make_pair(intersectionPnt2, prtIndex2)); + + this->m_vQuadriOrigID.push_back(i); + this->m_vQuadriOrigID.push_back(j); + } + else + { + vQuadriCorners.push_back(std::make_pair(intersectionPnt2, prtIndex2)); + vQuadriCorners.push_back(std::make_pair(intersectionPnt1, prtIndex1)); + + this->m_vQuadriOrigID.push_back(j); + this->m_vQuadriOrigID.push_back(i); + } + } + else + { + // FIRST: push intersectionpoint of particle 0, SECOND: push intersectionpoint of particle 1 + if ( prtIndex1 == 1 ) + { + vQuadriCorners.push_back(std::make_pair(intersectionPnt2, prtIndex2)); + vQuadriCorners.push_back(std::make_pair(intersectionPnt1, prtIndex1)); + + this->m_vQuadriOrigID.push_back(j); + this->m_vQuadriOrigID.push_back(i); + } + else + { + vQuadriCorners.push_back(std::make_pair(intersectionPnt1, prtIndex1)); + vQuadriCorners.push_back(std::make_pair(intersectionPnt2, prtIndex2)); + + this->m_vQuadriOrigID.push_back(i); + this->m_vQuadriOrigID.push_back(j); + } + } + + // => resulting order according to prtIndex: 0 1 1 0 :-) + + } // end edge-loop + + // copy data for call of 'ResortQuadrilateral_for2()': + buffer_vQuadriCorners.clear(); + for ( size_t i = 0; i < vQuadriCorners.size(); ++i ) + { + buffer_vQuadriCorners.push_back(vQuadriCorners[i].first); + UG_LOG("vQuadriCorners[" << i << "]: " << vQuadriCorners[i].first << ", index: " << vQuadriCorners[i].second << "\n"); + } + for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) + UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); + + ResortQuadrilateral_for2(buffer_vQuadriCorners); + + + UG_LOG("\n\n------------> NACH ordering:\n"); + for ( size_t i = 0; i < vQuadriCorners.size(); ++i ) + UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); + for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) + UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); + + UG_LOG("end ResortQuadri...\n"); + +} + + +template +int InterfaceHandlerLocalParticle:: +CollectCorners_FlatTop_2d_for2(GridObject* elem) +{ + UG_LOG("start CollectCorners_FlatTop_2d_for2()...\n"); + + + m_vQuadriCorners_for2.clear(); + this->m_vQuadriOrigID.clear(); + this->m_vCornerCoords.clear(); + this->m_vInterfaceID.clear(); + this->m_vNOInterfaceID.clear(); + this->m_vOriginalCornerID.clear(); + + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + + bool inside = false; + Vertex* vrtInside; + for(size_t i = 0; i < vVertex.size(); ++i) + { + if ( ! is_FTVertex(vVertex[i]) ) + { + inside = true; + vrtInside = vVertex[i]; + break; + } + } + + if ( inside ) + { + UG_LOG("vrtInside: " << this->m_aaPos[vrtInside] << "\n"); + this->m_roid = ROID_TRIANGLE; + CollectTriangle_and_Quadri_for2(elem, vrtInside); + } + else + { + this->m_roid = ROID_QUADRILATERAL; + CollectQuadrilateral_for2(elem); + ///////////////////////////////////////////////////////////////////////////// + // write data seperately, since 'CollectQuadrilateral_for2()' + // is also called during 'CollectTriangle_and_Quadri_for2()': + ///////////////////////////////////////////////////////////////////////////// + // A: copy corners into this->m_vCornerCoords: + for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) + this->m_vCornerCoords.push_back(m_vQuadriCorners_for2[i]); + + // B: set all corners to InterfaceIDs: + for ( size_t i = 0; i < 4; ++i ) + { + this->m_vInterfaceID.push_back(i); + this->m_vOriginalCornerID.push_back(this->m_vQuadriOrigID[i]); + } + } + + if ( inside ) + { + for ( size_t i = 0; i < this->m_vNOInterfaceID.size(); ++i ) + { + UG_LOG("this->m_vNOInterfaceID[" << i << "]: " << this->m_vNOInterfaceID[i] << "\n"); + } + UG_LOG("--------------------> m_vQuadriCorners_for2.size(): " << m_vQuadriCorners_for2.size() << "\n"); + for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) + { + UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); + } + for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) + { + UG_LOG("this->m_vCornerCoords[" << i << "]: " << this->m_vCornerCoords[i] << "\n"); + } + if ( this->m_vCornerCoords.size() == 3 ) + UG_LOG("++++++++++++++++ end CollectCorners_FlatTop_2d_for2()...\n"); + } + + +} + +*/ + +template +void InterfaceHandlerLocalParticle:: +update_inner_boundary_radial_old() +{ +// VORSICHT: update_inner_boundary_radial() wird in fv1FT_geom_impl.h aufgerufen, BEVOR remap_BF() stattfindet! +// => bf.node_id() immer mit interfaceID, nicht OriginalCornerID! + + if (m_prtIndex == -1) + UG_THROW( + "InterfaceHandlerLocalParticle::update_inner_boundary_radial_old(): m_prtIndex not set!\n"); + const MathVector center = m_spCutElementHandler->get_center( + m_prtIndex); + +// reset data + m_vRadialAtCo.clear(); + m_vRadialAtCo.resize(this->numCo(), 0.0); + m_vRadialAtIP.clear(); + m_vRadialAtIP.resize(this->numCo(), 0.0); + +// Loop the boundary faces to assemble impulse equations + for (size_t i = 0; i < this->m_vBF.size(); ++i) { + interfaceBF bf = this->m_vBF[i]; + VecSubtract(m_vRadialAtCo[bf.node_id()], this->corner(bf.node_id()), + center); + + // original version for 'm_vRadialAtIP'-computation; + // + // VecSubtract(m_vRadialAtIP[bf.nodeId], bf.globalIP, center); + // + // BUT: after multiplication with normal of particle boundary (:= n = bf.normal) the + // integral '\int (w x r)*n dS' must be 0.0!! + // => r := m_vRadialAtIP != bf.normal + // => (wxr)*n = 0.0, since r = n + // + // Remark: m_massDefect = 0.0 INDEPENDENT of choice of r! + + if (1) //m_bRadial_forMassEq_equals_Normal ) // = default case! + { + VecScale(m_vRadialAtIP[bf.node_id()], bf.normal(), -1.0); + // UG_LOG("m_vRadialAtIP[" << bf.node_id() << "] = " << m_vRadialAtIP[bf.node_id()] << "\n"); + // UG_LOG("bf.normal() = " << bf.normal() << "\n"); + } else if (1) { + VecSubtract(m_vRadialAtIP[bf.node_id()], bf.global_ip(), center); + // VecNormalize(m_vRadialAtIP[bf.node_id()], m_vRadialAtIP[bf.node_id()]); + // VecScale(m_vRadialAtIP[bf.node_id()], m_vRadialAtIP[bf.node_id()], VecLength(bf.normal())); + // UG_LOG("bf.global_ip() " << bf.global_ip() << "\n"); + // UG_LOG("* m_vRadialAtIP[" << bf.node_id() << "] = " << m_vRadialAtIP[bf.node_id()] << "\n"); + } else { + typedef DimFV1FTGeometry > TFVGeom; + TFVGeom& geo = GeomProvider::get( + LFEID(LFEID::LAGRANGE, dim, 1), 1); + + int ip = (bf.node_id() - 1); + if (ip < 0) + ip = ip + 3; + + const typename TFVGeom::SCVF& scvf = geo.scvf(ip); + const MathVector& SCVFip_Pos = scvf.global_ip(); + VecSubtract(m_vRadialAtIP[ip], SCVFip_Pos, center); + VecNormalize(m_vRadialAtIP[ip], m_vRadialAtIP[ip]); + VecScale(m_vRadialAtIP[ip], m_vRadialAtIP[ip], + VecLength(bf.normal())); + + } + + } + + // UG_LOG("_____________\n"); + ////////////////////////////////////////////////////////////////////////////////////////// + // REMARK: + // bf.node_id() is still the node id of the flat top element, i.e. the value + // can potentially be 2 and 3! + // => rewriting m_vRadialAtIP/AtCo to the original node id necessary + // => for Quadrilaterals: 2 m_vRadialAtIP/AtCo-values, BUT only 1 original corner + // ---> averaging over both values and write this average to single corner + ////////////////////////////////////////////////////////////////////////////////////////// + + // 0. initialize buffer array + std::vector > vRadialAtCo; + std::vector > vRadialAtIP; + vRadialAtCo.clear(); + vRadialAtCo.resize(this->numCo(), 0.0); + vRadialAtIP.clear(); + vRadialAtIP.resize(this->numCo(), 0.0); + std::vector vCounter; + vCounter.clear(); + vCounter.resize(this->numCo(), 0); + + // ToDo for 3d? + +// 1. add and copy + for (size_t i = 0; i < this->interface_id_all().size(); ++i) { + size_t interfaceID = this->interface_id(i); + size_t originalID = this->corner_orig(interfaceID); + + vRadialAtCo[originalID] += m_vRadialAtCo[interfaceID]; + vRadialAtIP[originalID] += m_vRadialAtIP[interfaceID]; + + vCounter[originalID]++; + } +// 2. rescale and copy + /* for(size_t i = 0; i < this->interface_id_all().size(); ++i) + { + size_t interfaceID = this->interface_id(i); + size_t originalID = this->corner_orig(interfaceID); + if ( vCounter[originalID] > 1 ) + { + VecScale(m_vRadialAtCo[originalID], vRadialAtCo[originalID], 1.0/vCounter[originalID]); + VecScale(m_vRadialAtIP[originalID], vRadialAtIP[originalID], 1.0); // /vCounter[originalID]); + //UG_LOG("m_vRadialAtIP[" << originalID << "] = " << m_vRadialAtIP[originalID] << "\n"); + } + }*/ + // 2. rescale and copy + for (size_t i = 0; i < vRadialAtCo.size(); ++i) + if (vCounter[i] > 0) { + VecScale(m_vRadialAtCo[i], vRadialAtCo[i], 1.0 / vCounter[i]); + VecScale(m_vRadialAtIP[i], vRadialAtIP[i], 1.0 / vCounter[i]); + + } + +} + +// VORSICHT: update_inner_boundary_radial() wird in fv1FT_geom_impl.h aufgerufen, BEVOR remap_BF() stattfindet! +// => bf.node_id() immer mit interfaceID, nicht OriginalCornerID! +template +void InterfaceHandlerLocalParticle:: +update_inner_boundary_radial(const MathVector* vCornerCoords) +{ + if (dim == 2) { + if (this->m_vBF.size() != 2 && this->m_vBF.size() != 0) + UG_THROW( + "oha, this->m_vBF.size() != 2:" << this->m_vBF.size() << "\n"); + } + + if (0) + UG_LOG("start update_inner_boundary_radial()...\n"); + const int modusIP = 0; + const bool useResized = true; + + if (m_prtIndex == -1) + UG_THROW( + "InterfaceHandlerLocalParticle::update_inner_boundary_radial(): m_prtIndex not set!\n"); + + const MathVector center = m_spCutElementHandler->get_center(m_prtIndex); + +// reset data + m_vRadialAtCo.clear(); + m_vRadialAtCo.resize(this->numCo(), 0.0); + m_vRadialAtIP.clear(); + m_vRadialAtIP.resize(this->numCo(), 0.0); + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// REMARK: for elements with only ONE outside corner ON the interface, bf.size() = 0! +// => for assembling connections u_fluid -> u_prt, although 'm_vRadialAtCo' is needed! +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// A. set 'm_vRadialAtCo' --> independent of boundary faces! + for (size_t i = 0; i < this->numCo(); ++i) { + if (useResized) { + VecSubtract(m_vRadialAtCo[i], this->corner(i), center); + } else { UG_THROW("in 'update_inner_boundary_radial()': case not implemented anymore!\n");} +/* + { + size_t nodeID = this->corner_orig(i); + VecSubtract(m_vRadialAtCo[nodeID], vCornerCoords[nodeID], center); + // project in radial direction onto interface + VecNormalize(m_vRadialAtCo[nodeID], m_vRadialAtCo[nodeID]); + VecScale(m_vRadialAtCo[nodeID], m_vRadialAtCo[nodeID], radius); + } +*/ + if (0) { + UG_LOG("i = " << i << "\n"); + UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); + UG_LOG( + "---> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); + } + } + + // B. set 'm_vRadialAtIP' --> for boundary faces! + for (size_t i = 0; i < this->m_vBF.size(); ++i) { + interfaceBF bf = this->m_vBF[i]; + + size_t nodeID = bf.node_id(); + if (!useResized) + nodeID = this->corner_orig(nodeID); + + typedef DimFV1FTGeometry > TFVGeom; + TFVGeom& geo = GeomProvider::get(LFEID(LFEID::LAGRANGE, dim, 1), 1); + + int ip = (bf.node_id() - 1); + if (ip < 0) + ip = ip + 3; + + const typename TFVGeom::SCVF& scvf = geo.scvf(ip); + const MathVector& SCVFip_Pos = scvf.global_ip(); + + switch (modusIP) { + case 0: // AtIP == AtCo + m_vRadialAtIP[nodeID] = m_vRadialAtCo[nodeID]; + break; + case 1: // AtIP == bf.global_ip() + VecSubtract(m_vRadialAtIP[nodeID], bf.global_ip(), center); + // VecNormalize(m_vRadialAtIP[nodeID], m_vRadialAtIP[nodeID]); + // VecScale(m_vRadialAtIP[nodeID], m_vRadialAtIP[nodeID], radius); + break; + case 2: // AtIP == bf.normal() + UG_THROW("in 'update_inner_boundary_radial()': case not implemented anymore!\n"); + break; +/* + VecScale(m_vRadialAtIP[nodeID], bf.normal(), -1.0); + // rescale + VecNormalize(m_vRadialAtIP[nodeID], m_vRadialAtIP[nodeID]); + VecScale(m_vRadialAtIP[nodeID], m_vRadialAtIP[nodeID], radius); + break; + */ + case 3: + VecSubtract(m_vRadialAtIP[nodeID], SCVFip_Pos, center); + // VecNormalize(m_vRadialAtIP[ip], m_vRadialAtIP[ip]); + // VecScale(m_vRadialAtIP[ip], m_vRadialAtIP[ip], VecLength(bf.normal())); + break; + default: + throw(UGError( + "Error in IInterfaceMapper::update_inner_boundary_radial()!")); + } + + if (0) { + + UG_LOG("i = " << i << "\n"); + UG_LOG("bf.node_id() = " << bf.node_id() << "\n"); + UG_LOG( + "this->corner(" << nodeID << ") = " << this->corner(nodeID) << "\n"); + UG_LOG( + "vCornerCoords[" << nodeID << "] = " << vCornerCoords[nodeID] << "\n"); + UG_LOG( + "* m_vRadialAtCo[" << nodeID << "] = " << m_vRadialAtCo[nodeID] << "\n"); + UG_LOG( + "* m_vRadialAtIP[" << nodeID << "] = " << m_vRadialAtIP[nodeID] << "\n"); + //VecSubtract(m_vRadialAtIP[nodeID], bf.global_ip(), center); + UG_LOG( + "** m_vRadialAtIP[" << nodeID << "] = " << m_vRadialAtIP[nodeID] << "\n"); + + UG_LOG("end update_inner_boundary_radial()...\n"); + + } + } + +} + +template +void InterfaceHandlerLocalParticle:: +update_inner_boundary_radial_for2_StdFV() +{ + UG_LOG("\n start update_inner_boundary_radial_for2_StdFV()...\n"); + + if (m_prtIndex == -1) + UG_THROW( + "InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2_StdFV(): m_prtIndex not set!\n"); + + const MathVector center1 = m_spCutElementHandler->get_center(0); + const MathVector center2 = m_spCutElementHandler->get_center(1); + + UG_LOG("center1: " << center1 << "\n"); + UG_LOG("center2: " << center2 << "\n"); + +// reset data + m_vRadialAtCo.clear(); + m_vRadialAtCo.resize(this->numCo(), 0.0); + m_vRadialAtIP.clear(); + m_vRadialAtIP.resize(this->numCo(), 0.0); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // REMARK: for elements with only ONE outside corner ON the interface, bf.size() = 0! + // => for assembling connections u_fluid -> u_prt, although 'm_vRadialAtCo' is needed! + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // A. set 'm_vRadialAtCo' --> independent of boundary faces! + // fill m_vRadialAtCO for center1: + + MathVector RadialIPRef1; + MathVector RadialIPRef2; + RadialIPRef1 = 0.0; + RadialIPRef2 = 0.0; + size_t numOutCo1 = 0; + size_t numOutCo2 = 0; + + if (dim == 2 && this->numCo() != 3) + UG_THROW( + "' in update_inner_boundary_radial_for2_StdFV(): wrong number of corners! -> numCo = " << this->numCo() << "\n"); + + for (size_t i = 0; i < this->numCo(); ++i) { + const int prtIndex = getPrtIndex(i); + + UG_LOG("prtIndex = " << prtIndex << "\n"); + + // set 'm_vRadialAtCo' + if (prtIndex == 0) { + VecSubtract(m_vRadialAtCo[i], this->corner(i), center1); + RadialIPRef1 += this->corner(i); + numOutCo1++; + + if (!this->lies_onInterface(i)) + UG_THROW( + "inconsistent in 'update_inner_boundary_radial_for2_StdFV()'!\n"); + } else if (prtIndex == 1) { + VecSubtract(m_vRadialAtCo[i], this->corner(i), center2); + RadialIPRef2 += this->corner(i); + numOutCo2++; + + if (!this->lies_onInterface(i)) + UG_THROW( + "inconsistent in 'update_inner_boundary_radial_for2_StdFV()'!\n"); + } + + if (1) { + UG_LOG("i = " << i << "\n"); + + UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); + UG_LOG( + "---> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); + } + } + + UG_LOG( + "____________________________________________________________________________\n"); + UG_LOG( + "____________________________________________________________________________\n"); + UG_LOG("numOutCo1 = " << numOutCo1 << "\n"); + UG_LOG("numOutCo2 = " << numOutCo2 << "\n"); + + // set 'm_vRadialAtIP' + VecScale(RadialIPRef1, RadialIPRef1, 1.0 / numOutCo1); + VecScale(RadialIPRef2, RadialIPRef2, 1.0 / numOutCo2); + UG_LOG("RadialIPRef1 = " << RadialIPRef1 << "\n"); + UG_LOG("RadialIPRef2 = " << RadialIPRef2 << "\n"); + + for (size_t i = 0; i < this->numCo(); ++i) { + const int prtIndex = getPrtIndex(i); + + UG_LOG("IP: prtIndex = " << prtIndex << "\n"); + + if (prtIndex == 0) { + VecSubtract(m_vRadialAtIP[i], RadialIPRef1, center1); + UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); + UG_LOG( + "---> m_vRadialAtIP[" << i << "] = " << m_vRadialAtIP[i] << "\n"); + } else if (prtIndex == 1) { + VecSubtract(m_vRadialAtIP[i], RadialIPRef2, center2); + UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); + UG_LOG( + "---> m_vRadialAtIP[" << i << "] = " << m_vRadialAtIP[i] << "\n"); + } + + } + + UG_LOG("END update_inner_boundary_radial_for2_StdFV()...\n\n"); + +} + +// VORSICHT: update_inner_boundary_radial() wird in fv1FT_geom_impl.h aufgerufen, BEVOR remap_BF() stattfindet! +// => bf.node_id() immer mit interfaceID, nicht OriginalCornerID! +template +void InterfaceHandlerLocalParticle:: +update_inner_boundary_radial_for2() +{ + UG_LOG("start update_inner_boundary_radial_for2()...\n"); + +// get data: + std::vector > vCornerCoords; + for (size_t i = 0; i < 4; ++i) + vCornerCoords.push_back(this->m_vQuadriCorners_for2[i]); + + for (size_t i = 0; i < 4; ++i) + UG_LOG("vCornerCoords[" << i << "] = " << vCornerCoords[i] << "\n"); + + const int modusIP = 1; + const bool useResized = true; + + if (m_prtIndex == -1) + UG_THROW( + "InterfaceHandlerLocalParticle::update_inner_boundary_radial(): m_prtIndex not set!\n"); + + if (this->m_vBF.size() != 4) + UG_THROW( + "in 'update_inner_boundary_radial_for2()': this->m_vBF.size() should be 4, but is " << this->m_vBF.size() << "\n"); + + const MathVector center1 = m_spCutElementHandler->get_center(0); + const MathVector center2 = m_spCutElementHandler->get_center(1); + + UG_LOG("center1: " << center1 << "\n"); + UG_LOG("center2: " << center2 << "\n"); + +// reset data + m_vRadialAtCo.clear(); + m_vRadialAtCo.resize(4, 0.0); + m_vRadialAtIP.clear(); + m_vRadialAtIP.resize(4, 0.0); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // REMARK: for elements with only ONE outside corner ON the interface, bf.size() = 0! + // => for assembling connections u_fluid -> u_prt, although 'm_vRadialAtCo' is needed! + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // A. set 'm_vRadialAtCo' --> independent of boundary faces! + // fill m_vRadialAtCO for center1: + for (size_t i = 0; i < 2; ++i) { + UG_LOG( + "setting for center1 = " << center1 << " and corner[" << i << "]: " << vCornerCoords[i] << "\n"); + + if (useResized) + VecSubtract(m_vRadialAtCo[i], vCornerCoords[i], center1); + else + UG_THROW( + "in 'update_inner_boundary_radial_for2()': not implemented in the for2-case!\n"); + + UG_LOG("-> vCornerCoords[" << i << "] = " << vCornerCoords[i] << "\n"); + UG_LOG("-> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); + } + // fill m_vRadial for center2: + for (size_t i = 2; i < 4; ++i) { + UG_LOG( + "setting for center2 = " << center2 << " and corner[" << i << "]: " << vCornerCoords[i] << "\n"); + if (useResized) + VecSubtract(m_vRadialAtCo[i], vCornerCoords[i], center2); + else + UG_THROW( + "in 'update_inner_boundary_radial_for2()': not implemented in the for2-case!\n"); + + UG_LOG("-> vCornerCoords[" << i << "] = " << vCornerCoords[i] << "\n"); + UG_LOG("-> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); + } + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // B. set 'm_vRadialAtIP' --> for boundary faces! + // fill m_vRadialAtCO for center1: + for (size_t i = 0; i < 2; ++i) { + interfaceBF bf = this->m_vBF[i]; + + size_t nodeID = bf.node_id(); // ok, since bf.nodeID = 0,1,2,3 + if (!useResized) + UG_THROW( + "in 'update_inner_boundary_radial_for2()': case '!useResized' not implemented!\n"); + + int ip = (bf.node_id() - 1); + if (ip < 0) + ip = ip + 3; + + switch (modusIP) { + case 0: // AtIP == AtCo + m_vRadialAtIP[nodeID] = m_vRadialAtCo[nodeID]; + break; + case 1: // AtIP == bf.global_ip() + VecSubtract(m_vRadialAtIP[nodeID], bf.global_ip(), center1); + break; + default: + throw(UGError( + "Error in InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2()!")); + } + + if (1) { + UG_LOG("i = " << i << "\n"); + UG_LOG("bf.node_id() = " << bf.node_id() << "\n"); + UG_LOG("bf.normal() = " << bf.normal() << "\n"); + UG_LOG("bf.global_ip()" << bf.global_ip() << "\n"); + UG_LOG( + "vCornerCoords[" << nodeID << "] = " << vCornerCoords[nodeID] << "\n"); + UG_LOG( + "* m_vRadialAtCo[" << nodeID << "] = " << m_vRadialAtCo[nodeID] << "\n"); + UG_LOG( + "** m_vRadialAtIP[" << nodeID << "] = " << m_vRadialAtIP[nodeID] << "\n"); + } + } + + // fill m_vRadialAtCO for center2: + for (size_t i = 2; i < 4; ++i) { + interfaceBF bf = this->m_vBF[i]; + + size_t nodeID = bf.node_id(); // ok, since bf.nodeID = 0,1,2,3 + if (!useResized) + UG_THROW( + "in 'update_inner_boundary_radial_for2()': case '!useResized' not implemented!\n"); + + int ip = (bf.node_id() - 1); + if (ip < 0) + ip = ip + 3; + + switch (modusIP) { + case 0: // AtIP == AtCo + m_vRadialAtIP[nodeID] = m_vRadialAtCo[nodeID]; + break; + case 1: // AtIP == bf.global_ip() + VecSubtract(m_vRadialAtIP[nodeID], bf.global_ip(), center2); + break; + default: + throw(UGError( + "Error in InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2()!")); + } + + if (1) { + UG_LOG("i = " << i << "\n"); + UG_LOG("bf.node_id() = " << bf.node_id() << "\n"); + UG_LOG("bf.normal() = " << bf.normal() << "\n"); + UG_LOG("bf.global_ip()" << bf.global_ip() << "\n"); + UG_LOG( + "vCornerCoords[" << nodeID << "] = " << vCornerCoords[nodeID] << "\n"); + UG_LOG( + "* m_vRadialAtCo[" << nodeID << "] = " << m_vRadialAtCo[nodeID] << "\n"); + UG_LOG( + "** m_vRadialAtIP[" << nodeID << "] = " << m_vRadialAtIP[nodeID] << "\n"); + } + } + UG_LOG("end update_inner_boundary_radial()...\n"); + + for (size_t i = 0; i < 4; ++i) { + UG_LOG("i = " << i << "\n"); + UG_LOG("--> vCornerCoords[" << i << "] = " << vCornerCoords[i] << "\n"); + UG_LOG("--> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); + UG_LOG("--> m_vRadialAtIP[" << i << "] = " << m_vRadialAtIP[i] << "\n"); + + } +} + +template +void InterfaceHandlerLocalParticle:: +update_inner_boundary_radial_StdFV(const MathVector* vCornerCoords) +{ + + if (m_prtIndex == -1) + UG_THROW( + "InterfaceHandlerLocalParticle::update_inner_boundary_radial(): m_prtIndex not set!\n"); + + const MathVector center = m_spCutElementHandler->get_center( + m_prtIndex); + + /* + typedef DimFV1FTGeometry > TFVGeom; + TFVGeom& geo = GeomProvider::get(LFEID(LFEID::LAGRANGE, dim, 1), 1); + */ +// reset data + m_vRadialAtCo.clear(); + m_vRadialAtCo.resize(this->numCo(), 0.0); + m_vRadialAtIP.clear(); + m_vRadialAtIP.resize(this->numCo(), 0.0); + +// Loop the boundary faces to assemble impulse equations + MathVector RadialIPRef; + RadialIPRef = 0.0; + size_t numOutCo = 0; + for (size_t i = 0; i < this->numCo(); ++i) { + // set 'm_vRadialAtCo' + VecSubtract(m_vRadialAtCo[i], this->corner(i), center); + + // set 'm_vRadialAtIP' + /* const typename TFVGeom::SCVF& scvf = geo.scvf(i); + const MathVector& SCVFip_Pos = scvf.global_ip(); + VecSubtract(m_vRadialAtIP[i], SCVFip_Pos, center); + */ + //VecSubtract(m_vRadialAtIP[i], this->corner(i), center); + // compute radialAtIP for current element: + if (this->lies_onInterface(i)) { + RadialIPRef += this->corner(i); + numOutCo++; + } + + if (0) { + UG_LOG("i = " << i << "\n"); + + UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); + UG_LOG( + "---> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); + } + } + +// set 'm_vRadialAtIP' + VecScale(RadialIPRef, RadialIPRef, 1.0 / numOutCo); + for (size_t i = 0; i < this->numCo(); ++i) + VecSubtract(m_vRadialAtIP[i], RadialIPRef, center); + + + +} + +} // end namespace ug + + + +#endif /* INTERFACE_HANDLER_FLAT_TOP_TOOLS_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h new file mode 100644 index 000000000..b74d74d92 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h @@ -0,0 +1,397 @@ +/* + * interface_handler_local.h + * + * Created on: 15.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_LOCAL_DIFFUSION_H_ +#define INTERFACE_HANDLER_LOCAL_DIFFUSION_H_ + + +#include "lib_grid/multi_grid.h" + +#include "../interface_handler_base.h" + + +namespace ug{ + +template +class DimFV1CutGeometry; + +template +class InterfaceHandlerLocalDiffusion : public InterfaceHandlerLocalBase +{ +// typedef InterfaceHandlerLocalBase base_class; + + public: + /// world dimension + static const int dim = TWorldDim; + + /// max number of geometric objects in a dimension + // (most objects in 1 dim, i.e. number of edges, but +1 for 1D) + static const int maxMid = DimFV1CutGeometry >::maxNumSCVF + 1; + + /// used traits + typedef fv1_dim_traits traits; + + /// used boundary face type + typedef typename DimFV1CutGeometry >::BF interfaceBF; + + /// Type of position coordinates + typedef MathVector position_type; + + /// Type of Position Attachment + typedef Attachment position_attachment_type; + + /// Type of Accessor to the Position Data Attachment + typedef Grid::VertexAttachmentAccessor position_accessor_type; + + + InterfaceHandlerLocalDiffusion(SmartPtr > interfaceProvider, + SmartPtr > cutElementHandler); + virtual ~InterfaceHandlerLocalDiffusion() {} + + + ////////////////////////////////////////////////////////// + /// getter methods + ////////////////////////////////////////////////////////// + + + /// access to single entry of 'm_vRealCornerOfigID' (in loc to glob for diffusion) + const size_t real_index(size_t i) const { return m_vRealCornerID[i]; } + const size_t real_index_size(size_t i, const size_t size) const + { if ( size == 3 ) return m_vRealCornerID_tri[i]; + if ( size == 4 ) return m_vRealCornerID_quad[i]; + UG_THROW("in 'real_index_size()': wrong size (should be 3 or 4!): " << size << "n"); + } + const size_t real_index_tri(size_t i) const { return m_vRealCornerID_tri[i]; } + const size_t real_index_quad(size_t i) const { return m_vRealCornerID_quad[i]; } + + size_t get_index_for_global_index_Nitsche(const size_t i); + size_t get_global_index_Nitsche(const size_t i) { return m_verticesGlobalIndex[i]; } + const size_t get_num_NitscheDoFs() { return m_MapInserted_Nitsche.size(); } + + void set_Nitsche(bool bNitsche){ m_bNitsche = bNitsche;} + bool get_Nitsche(){ return m_bNitsche;} + + + number get_LSvalue_byPosition(MathVector vrtPos){}; + number get_LSvalue(Vertex* vrt, const int prtIndex){}; + + // ToDo: needed method? + // used for method 'InterfaceHandlerLocal::get_intersection_point()': + bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc) + { + const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; + const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; + + if ( this->m_orientationInterface == 1 ) + return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, 0); + // inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' + // to avoid error for alpha < 0: + else if ( this->m_orientationInterface == -1 ) + return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, 0); + else + UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); + } + + bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc, std::vector& alphaOut) + { + const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; + const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; + + if ( this->m_orientationInterface == 1 ) + return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, 0, alphaOut); + // inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' + // to avoid error for alpha < 0: + else if ( this->m_orientationInterface == -1 ) + return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, 0, alphaOut); + else + UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); + } + + /////////////////////////////////////////////////////////////// + /// base class methods: adjusted! + /////////////////////////////////////////////////////////////// + + int CollectCorners_FlatTop_2d(GridObject* elem); + void Collect_Data_Nitsche(GridObject* elem); + + /// updates all std::vectors-data and especially derives 'm_roid' + void compute_flat_top_data(GridObject* elem); + + /////////////////////////////////////////////////////////////// + /// new methods + /////////////////////////////////////////////////////////////// + + // calls base class method, BUT: also clears m_vBF! --> m_vBF NOT a member of base class! + bool update_elem(GridObject* elem, const MathVector* vCornerCoords); + + /// called by 'InterfaceHandlerLocalParticle::update()' + ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation) + { return m_spCutElementHandler->compute_element_modus(elem, interfaceOrientation); } + + /// called by 'InterfaceHandlerLocalParticle::update()' + ElementModus get_element_modus(GridObject* elem) + { return m_spCutElementHandler->get_element_modus(elem); } + + bool is_FTVertex(Vertex* vrt, size_t vrtIndex) + { return m_spCutElementHandler->is_FTVertex(vrt, vrtIndex);} + + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { return m_spCutElementHandler->is_OutsideVertex(vrt, vrtIndex);} + + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { return m_spCutElementHandler->is_nearInterfaceVertex(vrt, vrtIndex);} + + bool is_nearInterface(Vertex* vrt) + { return m_spCutElementHandler->is_nearInterface(vrt);} + + /////////////////////////////////////////////////////////////// + + bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex) + { return m_spCutElementHandler->check_vertex_modus(vrtModus, vrtIndex);} + bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex, const int interfaceOrientation) + { return m_spCutElementHandler->check_vertex_modus(vrtModus, vrtIndex, interfaceOrientation);} + + + /////////////////////////////////////////////////////////////// + + + // used for diffusion + size_t get_or_insert_vertex(const MathVector& vrtPos); + size_t get_or_insert_vertex(Vertex* vrt); + bool find_vrtPos(const MathVector& vrtPos); + + // used for Nitsche + // ---> used during 'diffusion_interface/diffusion_interface.h:initialize_interface_Nitsche()': + size_t get_or_insert_indexPair_Nitsche(const size_t global_index); + + void Resort_RealCornerID(); + + bool lies_onInterface_tri(const size_t newID); + bool lies_onInterface_quad(const size_t newID); + bool lies_onInterface_size(const size_t newID, size_t size); + + /// access to m_vBF (needed during 'FV1CutGeom::update_inner_boundary_faces()') + const interfaceBF* boundary_faces() const { return &m_vBF[0]; } + std::vector& get_boundary_faces() { return m_vBF; } + + const LocalIndices& get_local_indices() const { return m_ind; } + + void set_jac_bool(bool bJac) { m_jac_tag = bJac; } + bool get_jac_bool() { return m_jac_tag; } + + void set_bScaleDoFs(bool bScaleDoF) { m_scaleDoFs = bScaleDoF; } + bool get_bScaleDoFs() { return m_scaleDoFs; } + + const size_t get_numVerticesPos() const { return m_verticesPos.size(); } + const MathVector get_VerticesPos(size_t index) const { return m_verticesPos[index]; } + const double get_sol(size_t index) const { return m_verticesValue[index]; } + const double get_sol(size_t index, size_t fct) const { return m_verticesValue[index]; } + + void add_to_integral(const number value) { m_integral += value; } + void init_integral(){ m_integral = 0.0;} + number get_integral(){ return m_integral;} + + void print_Nitsche_Data(); + void print_InterfaceIDdata(); + + number vAlpha(size_t i, size_t j) { return m_vAlpha[i][j]; } + MathVector vIntersectionPnts(size_t i) { return m_vIntersectionPnts[i]; } + MathMatrix vShapeValues() { return m_vShapeValues; } + MathVector NormalToFace() { return m_NormalToFace; } + number Gamma() { return m_Gamma; } + number Area() { return m_Area; } + number AreaOrig() { return m_AreaOrig; } + number AreaScale() { return m_AreaScale; } + number IntegralGamma(size_t i) { return m_vIntegralGamma[i]; } + + ////////////////////////////////////////////////////////////////////////////// + /// methods called during 'convection_diffusion_fv1.cpp' -> 'geo.___()' : + ////////////////////////////////////////////////////////////////////////////// + + void resize_local_data(LocalVector locU); + + void set_DoF_tag_tri(const bool bFactor2_for_DoFIndex) + { m_shift_DoFIndex_tri = bFactor2_for_DoFIndex; return; } + void set_DoF_tag_quad(const bool bFactor2_for_DoFIndex) + { m_shift_DoFIndex_quad = bFactor2_for_DoFIndex; return; } + + bool get_vertex_modus_tri(size_t dof, const int orientation) + { return m_spCutElementHandler->get_vertex_modus_orient(dof, 1); } + bool get_vertex_modus_quad(size_t dof, const int orientation) + { return m_spCutElementHandler->get_vertex_modus_orient(dof, -1); } + + + void reset_defect_on_interface(LocalVector& locD, const size_t size); + void reset_jacobian_on_interface(LocalMatrix& locJ, const size_t size); + + void set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, const int orientation); + + // diffusion can only be set as values, with constant diff coefficient at each side of the interface. + // no _impl() methods provided for analytic lua-functions + number get_diffusion(); + number get_diffusion(const bool bElementIsOutside); + + // interface data (source, jump, jump_grad) can be defined as values or lua functions + LocalVector set_jump_values(LocalIndices ind, const size_t size); + LocalVector set_jump_grad_values(LocalIndices ind, const size_t size); + LocalVector set_source(const std::vector sourceIm, LocalIndices ind, const size_t size, const bool bElementIsCut); + // 'set_source' instance used for navier stokes elem disc + LocalVector set_source(LocalIndices ind, const size_t size, const bool bElementIsCut) + {LocalVector dummy; return dummy;} + + + void set_jacobian_tri(const LocalMatrix locJ) { m_locJ_tri = locJ; } + void set_jacobian_quad(const LocalMatrix locJ){ m_locJ_quad = locJ; } + + void set_defect_tri(const LocalVector locD) { m_locD_tri = locD; } + void set_defect_quad(const LocalVector locD){ m_locD_quad = locD; } + + LocalVector& get_local_solution_tri() { return m_locU_tri; } + LocalVector& get_local_solution_quad() { return m_locU_quad; } + + // also called in mapper + LocalMatrix& get_local_jacobian_tri() { return m_locJ_tri; } + LocalMatrix& get_local_jacobian_quad() { return m_locJ_quad; } + + LocalVector& get_local_defect_tri() { return m_locD_tri; } + LocalVector& get_local_defect_quad() { return m_locD_quad; } + + const bool get_bNearInterface() const {return m_bNearInterface;} + void set_bNearInterface(bool bNearInterface) { m_bNearInterface = bNearInterface;} + + const bool get_boolian_for_diffusion(); + + ////////////////////////////////////////////////////////////////////////////// + /// methods called during mapper + ////////////////////////////////////////////////////////////////////////////// + + const size_t get_index_shift_tri() const { return m_shift_DoFIndex_tri; } + const size_t get_index_shift_quad() const { return m_shift_DoFIndex_quad; } + + + ////////////////////////////////////////////////////////////////////////////// + /// methods called ONLY in '_impl.cpp': + ////////////////////////////////////////////////////////////////////////////// + + void set_source_lua(const number interfaceSourceValue) { m_interfaceSource = interfaceSourceValue; } + void set_jump_lua(const number interfaceJumpValue) { m_interfaceJump = interfaceJumpValue; } + void set_jump_grad_lua(const MathVector<2>& interfaceJumpGradValue) + { m_interfaceJumpGrad[0] = interfaceJumpGradValue[0]; m_interfaceJumpGrad[1] = interfaceJumpGradValue[1];} + void set_diffusion_coeff_lua(const MathVector<2>& diffusionCoeffs) + { m_diffusionCoeff[0] = diffusionCoeffs[0]; m_diffusionCoeff[1] = diffusionCoeffs[1];} + + bool check_interface_data(const bool bBndFct); + + double get_jump(const MathVector position); + double get_jump_impl(const MathVector position); + + + double get_jump_grad(const MathVector position); + double get_jump_grad_impl(const MathVector position); + + double get_source(const MathVector position); + double get_source_impl(const MathVector position); + + // writes solution of global vector vec into this->m_verticesValue-array: + void write_solution(const std::vector verticesValues); + + MathVector get_center(int prtIndex){ return m_spCutElementHandler->get_center(prtIndex);} + + + ////////////////////////////////////////////////////////////////////////////// + /// members: + ////////////////////////////////////////////////////////////////////////////// + + std::vector m_vBF; // updated during FV1CutGeom::update_inner_boundary_faces() + + std::map, size_t> m_MapInserted; + + std::vector > m_verticesPos; + std::vector m_verticesValue; + + // the REalCornerID can also be an index > 3 and > 4, since it is then the index + // of the InterfaceVertex; see 'm_verticesPos' and 'm_verticesValue' + std::vector m_vRealCornerID; + std::vector m_vRealCornerID_tri; + std::vector m_vRealCornerID_quad; + + std::vector m_vInterfaceID_tri; + std::vector m_vInterfaceID_quad; + + bool m_scaleDoFs; + number m_integral; + bool m_jac_tag; + + + /// size of local algebra for flat top element: 'm_numFct' x 'm_numCo' + size_t m_numFct; + /// number of corners of flat top element + size_t m_numCo; + + /// new local algebra for resized flat top element + LocalIndices m_ind; + + // local data for assembling: + LocalMatrix m_locJ_tri; + LocalMatrix m_locJ_quad; + LocalVector m_locD_tri; + LocalVector m_locD_quad; + LocalVector m_locU_tri; + LocalVector m_locU_quad; + + bool m_bNearInterface; + + // scale factor for access to DoFIndex on triangle or quadri as cut element + // --> for call during 'add_local_def/jac_to_global_interface()': + bool m_shift_DoFIndex_tri; + bool m_shift_DoFIndex_quad; + + /////////////////////////////////////////////////////////////// + /// data for Nitsche -> 'Collect_Data_Nitsche()': + /////////////////////////////////////////////////////////////// + + bool m_bNitsche; + std::map m_MapInserted_Nitsche; + std::vector > m_vAlpha; + std::vector > m_vIntersectionPnts; + MathMatrix m_vShapeValues; // dim+1 = number of vertices for simplicial mesh! + MathVector m_NormalToFace; + number m_Gamma; + MathVector m_insidePnt; + number m_Area; + number m_AreaOrig; + number m_AreaScale; + std::vector m_vIntegralGamma; + + // filled during 'moving_interface/interface_handler_local_base_tools.h: get_or_insert_indexPair_Nitsche()' + // AND get_or_insert_indexPair_Nitsche() called during 'diffusion_interface/diffusion_interface.h:initialize_interface_Nitsche()' + // and used for local-to-global mapper + std::vector m_verticesGlobalIndex; + + + // boolians for boundary data + bool m_bBndFct; + number m_interfaceSource; + number m_interfaceJump; + MathVector<2> m_interfaceJumpGrad; + MathVector<2> m_diffusionCoeff; + + + /// contains radius, center and density of all given particles + SmartPtr > m_spInterfaceProvider; + SmartPtr > m_spCutElementHandler; + +}; + + +}// end namespace ug + + +#include "interface_handler_diffusion_tools.h" +#include "interface_handler_diffusion_impl.h" + +#endif /* INTERFACE_HANDLER_LOCAL_DIFFUSION_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_impl.h new file mode 100644 index 000000000..4fa9f8eee --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_impl.h @@ -0,0 +1,821 @@ +/* + * interface_handler_local_impl.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_LOCAL_DIFFUSION_IMPL_H_ +#define INTERFACE_HANDLER_LOCAL_DIFFUSION_IMPL_H_ + + +#include "interface_handler_diffusion_user_data.h" + + +namespace ug{ + + +/////////////////////////////////////////////////////////////// +/// methods for class 'IInterfaceHandlerLocal' +/////////////////////////////////////////////////////////////// + + + +/////////////////////////////////////////////////////////////// +/// methods for class 'InterfaceHandlerLocalDiffusion' +/////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////// +// Constructor +/////////////////////////////////////////////////////////////// +template +InterfaceHandlerLocalDiffusion:: +InterfaceHandlerLocalDiffusion(SmartPtr > interfaceProvider, + SmartPtr > cutElementHandler) : + InterfaceHandlerLocalBase(cutElementHandler), + m_spInterfaceProvider(interfaceProvider), + m_spCutElementHandler(cutElementHandler), + m_bNitsche(false), + m_numFct(0), + m_numCo(0), + m_shift_DoFIndex_tri(false), + m_shift_DoFIndex_quad(false), + m_interfaceSource(1100.13), + m_interfaceJump(1100.13), + m_interfaceJumpGrad(1100.13,1100.13), + m_diffusionCoeff(1100.13, 1100.13) +{ + m_verticesPos.clear(); +} + +/////////////////////////////////////////////////////////////// +// new methods for Diffusion +/////////////////////////////////////////////////////////////// + + +template +void InterfaceHandlerLocalDiffusion:: +resize_local_data(LocalVector locU) +{ + LocalIndices ind = locU.get_indices(); + +// resize for cut triangle + ind.resize_dof(0, 3); + m_locU_tri.resize(ind); + m_locD_tri.resize(ind); + m_locJ_tri.resize(ind); + +// if node is near interface: triangle is cut into 2 triangles: + size_t local_dimension = 4; + if ( get_bNearInterface() ) + local_dimension = 3; + +// resize for cut quadrilateral + ind.resize_dof(0, local_dimension); + m_locU_quad.resize(ind); + m_locD_quad.resize(ind); + m_locJ_quad.resize(ind); + + return; +} + +template +void InterfaceHandlerLocalDiffusion:: +write_solution(const std::vector verticesValues) +{ + this->m_verticesValue.clear(); + + for (size_t i = 0; i < verticesValues.size(); ++i) + this->m_verticesValue.push_back(verticesValues[i]); + + +// through error: + if ( this->m_verticesValue.size() != verticesValues.size() ) + { + UG_LOG("m_verticesValue.size(): " << this->m_verticesValue.size() << "\n"); + UG_LOG("verticesValues.size(): " << verticesValues.size() << "\n"); + UG_THROW("in InterfaceHandlerLocalDiffusion::write_solution: wrong size of m_verticesValue!\n"); + } + +} + +template +void InterfaceHandlerLocalDiffusion:: +reset_defect_on_interface(LocalVector& locD, const size_t size) +{ + if ( size > locD.num_all_dof(0) ) + { + UG_LOG("in 'reset_defect_on_interface()': size = " << size << ", locD.size = " << locD.num_all_dof(0) << "\n"); + UG_THROW("in 'reset_defect_on_interface()': size = " << size << ", locD.size = " << locD.num_all_dof(0) << " => claimed size is NOT equal to size of solution vector!\n"); + } +// loop and set solution in 'solU_tri': + for (size_t dof = 0; dof < locD.num_all_dof(0); ++dof) + { + // if dof_real is index of m_vertex: get solution from class: + if ( this->lies_onInterface_size(dof, size) ) + locD.value(0, dof) = 0.0; + } +} + +template +void InterfaceHandlerLocalDiffusion:: +reset_jacobian_on_interface(LocalMatrix& locJ, const size_t size) +{ + + if ( size > locJ.num_all_row_dof(0) ) + { + UG_LOG("in 'reset_jacobian_on_interface()': size = " << size << ", locJ.size = " << locJ.num_all_row_dof(0) << "\n"); + UG_THROW("in 'reset_jacobian_on_interface()': size = " << size << ", locJ.size = " << locJ.num_all_row_dof(0) << " => claimed size is NOT equal to size of solution vector!\n"); + } +// loop and set solution in 'solU_tri': + for (size_t dof1 = 0; dof1 < locJ.num_all_row_dof(0); ++dof1) + { + if ( this->lies_onInterface_size(dof1, size) ) + { + // erase all col-values of chosen row dof1: + for (size_t dof2 = 0; dof2 < locJ.num_all_col_dof(0); ++dof2) + locJ.value(0, dof1, 0, dof2) = 0.0; + } + + } + +} + +template +const bool InterfaceHandlerLocalDiffusion:: +get_boolian_for_diffusion() +{ + if( this->elementModus() == OUTSIDE_DOM) + { + return true; + } + else if( this->elementModus() == INSIDE_DOM) + { + return false; + } + else if( this->elementModus() == CUT_BY_INTERFACE) + { + return false; + } + else + { + UG_THROW("in InterfaceHandlerLocalDiffusion:get_boolian_for_diffusion: no valid boolian found!\n"); + return false; + } + + return false; +} + +/////////////////////////////////////////////////////////////// +/// hard coded boundary conditions +/////////////////////////////////////////////////////////////// + + + + template + inline double get_jump_value_ex5(const MathVector position, const MathVector center, const int orientation) + { + return 0.0; + } + + template + inline double get_jump_grad_value_ex3(const MathVector position, const MathVector center, const int orientation) + { + return 0.0; + + if ( orientation == -1) + return 0.0; + + double absValue = position[0]*position[0] + position[1]* position[1]; + double sum = position[0] + position[1]; + + double returnValue = 8*(2*absValue - sum)*exp(-absValue); + + return returnValue; + } + + template + inline double get_source_kappa(const MathVector position, const MathVector center, const int orientation) + { + + if ( orientation == 1) + { + return 16.0*16.0; + } + else + { + if ( orientation != -1) + UG_THROW("wrong orientation!\n"); + + double dist_x = position[0] - center[0]; + double dist_y = position[1] - center[1]; + double dist = sqrt(dist_x*dist_x+dist_y*dist_y); + + return 200*16*dist*dist; + + } + + } + + + +template +double InterfaceHandlerLocalDiffusion:: +get_jump_impl(const MathVector position) +{ +// provide class member data + const MathVector center = get_center(0); + const int orientation = this->get_orientation(); + +// call inline function: + return get_jump_value_ex5(position, center, orientation); + +} + +template +double InterfaceHandlerLocalDiffusion:: +get_jump_grad_impl(const MathVector position) +{ +// provide class member data + const MathVector center = get_center(0); + const int orientation = this->get_orientation(); + +// call inline function: + return get_jump_grad_value_ex3(position, center, orientation); + +} + +template +double InterfaceHandlerLocalDiffusion:: +get_source_impl(const MathVector position) +{ +// provide class member data + const MathVector center = get_center(0); + const int orientation = this->get_orientation(); + +// call inline function: + return get_source_kappa(position, center, orientation); + +} + + + + +template +double InterfaceHandlerLocalDiffusion:: +get_jump(const MathVector position) +{ + number jump_value = 0.0; + + if (m_bBndFct) + { + // if the boundary conditions are given ... + jump_value = get_jump_impl(position); + } + else + jump_value = m_interfaceJump; + + return jump_value; +} + + +template +double InterfaceHandlerLocalDiffusion:: +get_jump_grad(const MathVector position) +{ + number jump_grad_value = 0.0; + + if (m_bBndFct) + { + // if the boundary conditions are given ... + jump_grad_value = get_jump_grad_impl(position); + } + else + { + if ( this->get_orientation() == 1 ) + jump_grad_value = m_interfaceJumpGrad[0]; + else + jump_grad_value = m_interfaceJumpGrad[1]; + } + + return jump_grad_value; +} + + +template +double InterfaceHandlerLocalDiffusion:: +get_source(const MathVector position) +{ + number source_value = 0.0; + + if (m_bBndFct) + { + // if the boundary conditions are given ... + source_value = get_source_impl(position); + } + else + source_value = m_interfaceSource; + + return source_value; +} + + +/////////////////////////////////////////////////////////////// +/// setter functions called during elem disc to set bndCond +/////////////////////////////////////////////////////////////// + +template +number InterfaceHandlerLocalDiffusion:: +get_diffusion() +{ + const int orientation = this->get_orientation(); + + // orientation == 1 corresponds to outside circle, if interface is a circle + if ( orientation == 1 ) return m_diffusionCoeff[0]; + else return m_diffusionCoeff[1]; + +} + +template +number InterfaceHandlerLocalDiffusion:: +get_diffusion(const bool bElementIsOutside) +{ +// m_diffusionCoeff[1] corresponds to inside circle, bElementIsOutside corresponds to outside circle + if ( bElementIsOutside ) return m_diffusionCoeff[1]; + else return m_diffusionCoeff[0]; + +} + +template +LocalVector InterfaceHandlerLocalDiffusion:: +set_source(const std::vector sourceIm, LocalIndices ind, const size_t size, const bool bElementIsCut) +{ + LocalVector source; + ind.resize_dof(0, size); + source.resize(ind); + +// loop and set solution in 'solU_tri': + for (size_t dof = 0; dof < source.num_all_dof(0); ++dof) + { +/* if ( dof > 2 ) + source.value(0, dof) = sourceIm[2]; // done during 'add_def_elem_local()' + else + source.value(0, dof) = sourceIm[dof]; // done during 'add_def_elem_local()' +*/ + + // if dof_real is index of m_vertex: get solution from class: + if ( !bElementIsCut ) + { + source.value(0, dof) = sourceIm[dof]; // done during 'add_def_elem_local()' + } + else if ( this->lies_onInterface_size(dof, size) ) + { + size_t dof_real = this->real_index_size(dof, size); + source.value(0, dof) = get_source(this->get_VerticesPos(dof_real)); +// source.value(0, dof) = get_source_Fedkiw_ex5(this->get_VerticesPos(dof_real)); + } + else + { + size_t dof_orig = this->corner_orig(dof); + // careful: this->corner() returns corner coords of new corners => use dof-Index, NOT dof_orig-Index?! + // source.value(0, dof) = get_source_kappa(this->corner(dof)); + + source.value(0, dof) = sourceIm[dof_orig]; // done during 'add_def_elem_local()' + } + + } + + return source; +} + + +template +LocalVector InterfaceHandlerLocalDiffusion:: +set_jump_values(LocalIndices ind, const size_t size) +{ + LocalVector jump; + ind.resize_dof(0, size); + jump.resize(ind); + +// loop and set solution in 'solU_tri': + for (size_t dof = 0; dof < jump.num_all_dof(0); ++dof) + { + + // if dof_real is index of m_vertex: get solution from class: + if ( this->lies_onInterface_size(dof, size) ) + { + size_t dof_real = this->real_index_size(dof, size); + jump.value(0, dof) = get_jump(this->get_VerticesPos(dof_real)); + } + else + { + jump.value(0, dof) = 0.0; + } + } + + return jump; +} + + +template +LocalVector InterfaceHandlerLocalDiffusion:: +set_jump_grad_values(LocalIndices ind, const size_t size) +{ + LocalVector jump_grad; + ind.resize_dof(0, size); + jump_grad.resize(ind); + +// loop and set solution in 'solU_tri': + for (size_t dof = 0; dof < jump_grad.num_all_dof(0); ++dof) + { + + // if dof_real is index of m_vertex: get solution from class: + if ( this->lies_onInterface_size(dof, size) ) + { + size_t dof_real = this->real_index_size(dof, size); + jump_grad.value(0, dof) = get_jump_grad(this->get_VerticesPos(dof_real)); +// jump_grad.value(0, dof) = get_jump_grad_value_ex5(this->get_VerticesPos(dof_real)); +// jump_grad.value(0, dof) = get_jump_grad_value_kappa_Frei(this->get_VerticesPos(dof_real)); + } + else + { + jump_grad.value(0, dof) = 0.0; + } + } + + return jump_grad; + +} + + +template +void InterfaceHandlerLocalDiffusion:: +set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, const int orientation) +{ + if ( size > solU.num_all_dof(0) ) + { + UG_LOG("in 'set_local_sol()': size = " << size << ", solU.size = " << solU.num_all_dof(0) << "\n"); + UG_THROW("in 'set_local_sol()': size = " << size << ", solU.size = " << solU.num_all_dof(0) << " => claimed size is NOT equal to size of solution vector!\n"); + } +// loop and set solution in 'solU_tri': + for (size_t dof = 0; dof < solU.num_all_dof(0); ++dof) + { + + size_t dof_real = this->real_index_size(dof, size); + + // if dof_real is index of m_vertex: get solution from class: + if ( this->lies_onInterface_size(dof, size) ) + { + solU.value(0, dof) = this->get_sol(dof_real); + ////////////////////////////////////////////// + // add jump value in case of element, lying on \Omega^-: + ////////////////////////////////////////////// + // solU.value(0, dof) += get_jump_value_ex3(this->get_VerticesPos(dof_real)); + } + else + { + // UG_LOG("tri: *value = " << lvec.value(0,dof_real) << "\n"); + solU.value(0, dof) = lvec.value(0,dof_real); + } + } +} + +template +bool InterfaceHandlerLocalDiffusion:: +check_interface_data(const bool bBndFct) +{ + // check value 1100.13 is set as default during constructor: + if ( m_interfaceSource == 1100.13 || m_interfaceJump == 1100.13 || m_interfaceJumpGrad[0] == 1100.13 || m_interfaceJumpGrad[1] == 1100.13 || m_diffusionCoeff[0] == 1100.13 || m_diffusionCoeff[1] == 1100.13) + UG_THROW("interface data not completely specified! call setter functions to define diffusion coefficients, source, jump and jump of the gradient at the interface.\n"); + + // if the boundary data is given by C++ functions, the values need to be set to zero: + if ( bBndFct ) + { + if ( fabs(m_interfaceSource) > 0.000001 || fabs(m_interfaceJump) > 0.000001 || fabs(m_interfaceJumpGrad[0]) > 0.000001|| fabs(m_interfaceJumpGrad[0]) > 0.000001 ) + UG_THROW("if the boundary data is given by C++ functions, the values need to be set to zero\n"); + } + + m_bBndFct = bBndFct; +} + +/* +template +int InterfaceHandlerLocalDiffusion:: +CollectCorners_FlatTop_2d(GridObject* elem) +{ + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + this->m_vCornerCoords.clear(); + this->m_vInterfaceID.clear(); + this->m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::vector, size_t > > vNearIntCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + + bool isFTVertex = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // remember boolian for check, weather there existe at least one vertex, which is FT! + isFTVertex = this->is_FTVertex(vVertex[i], i); + if ( isFTVertex ) + break; + } + + if ( !isFTVertex ) + UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *this->m_spMG, elem); + + // loop vertices + ////////////////////////////////////////////// + // REMARK: + // order is the same as in 'vCornerCoords', therefore we can be sure, that the + // order of the new 'vCornerIBCoords' will be consistent with the grid standard + ////////////////////////////////////////////// + + bool bNearInterface = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrtRoot = vVertex[i]; + + ////////////////////////////////////////////// + // case 1: + // vertex insideDomain + if ( !this->is_FTVertex(vrtRoot, i) ) + { + if ( this->is_nearInterfaceVertex(vrtRoot, i) ) + UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); + + this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); + this->m_vOriginalCornerID.push_back(i); + + vInsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); + } + ////////////////////////////////////////////// + // case 2: + // vertex = FT + ON interface + // => KEINE Berechnung von 'intersectionPoint' notwendig! -> pushen und alten index pushen + + // REMARK: is_nearInterfaceVerx = false per default, if m_vThresholdOnLevel = 0.0 + else if ( this->is_nearInterfaceVertex(vrtRoot, i) ) + { + bNearInterface = true; + this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); + this->m_vOriginalCornerID.push_back(i); + this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); + vNearIntCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); + + } + ////////////////////////////////////////////// + // case 3: + // vertex 'outsideFluid' + // => NEUE Position berechen+pushen und alten index pushen + else + { + ////////////////////////////////////////////////////////////////////////////////////////// + // loop alle edges, die interface schneiden und damit einen neuen intersectionPnt + // beitragen zum damit assoziierten alten index + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *this->m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("error in collecting vertices associated to an edge!....EXIT!...\n"); + + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + size_t vrtInd1 = get_vertex_index(vrt1, elem); + size_t vrtInd2 = get_vertex_index(vrt2, elem); + + MathVector intersectionPnt; + + /////////////////////////////////////////////////////////////////// + // lies vrtRoot on a cutted edge? + /////////////////////////////////////////////////////////////////// + // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! + if ( this->is_nearInterfaceVertex(vrt2, vrtInd2) || this->is_nearInterfaceVertex(vrt1, vrtInd1) ) + { bNearInterface = true; continue; } + // case2: vert2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt1 && !this->is_FTVertex(vrt2, vrtInd2) ){ + this->get_intersection_point(intersectionPnt, vrt2, vrt1); + } + // case3: vrt1 = outsideParticle && vrt2 = insideParticle: + else if ( vrtRoot == vrt2 && !this->is_FTVertex(vrt1, vrtInd1) ) + this->get_intersection_point(intersectionPnt, vrt1, vrt2); + else + continue; + + // check for correct inersectionPnt + if ( fabs(this->get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + + /////////////////////////////////////////////////////////////////// + // only push_back, if not included yet! + // -> can be ONLY the case, if the intersectionPoint is a node + if ( ! this->isIncluded(this->m_vCornerCoords, intersectionPnt) ) + { + + this->m_vCornerCoords.push_back(intersectionPnt); + this->m_vOriginalCornerID.push_back(i); + this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(intersectionPnt, i)); + } + + + } // end edge-loop + + } // end else-case + + } // end vrt-loop + +//////////////////////////////////////////////////////////////////////////////////////////// +// Postprecessing for quadrilaterals ( <=> vOutsideCorners == 2 ) +// (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface +// => no Quadrilateral, but Triangle!! +//////////////////////////////////////////////////////////////////////////////////////////// + MathVector normalDir(0.0); + if ( (this->m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) + this->ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); + else if ( bNearInterface ) + { + // Quadrilateral -> Triangle + if ( vInsideCorners.size() == 1 ) // case 1 + { + // do nothing, since re-sorting not necessary...??? + } + // skip whole element, since only FT points are included + else if ( vInsideCorners.size() == 0 ) + UG_THROW("in 'CollectCorners_FlatTop_2d()': vInsideCorners.size() " + "= " << vInsideCorners.size() << "not possible!\n"); + } + + + return this->m_vCornerCoords.size(); + +} + + +// called by geo.update()!! +template +bool InterfaceHandlerLocalDiffusion:: +update_elem(GridObject* elem, const MathVector* vCornerCoords, int interfaceOrientation) +{ + bool do_update_local = false; + this->m_vBF.clear(); + +// computing flat top modus + this->m_elemModus = compute_element_modus(elem, interfaceOrientation); + + switch(this->m_elemModus) + { + case INSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + break; // usual assembling + case OUTSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + break; // usual assembling + case CUT_BY_INTERFACE: this->compute_flat_top_data(elem); + //if ( m_roid == ROID_PYRAMID )UG_THROW("PYRAMID\n"); + do_update_local = true; + break; // flat top assembling + default: + throw(UGError("Error in InterfaceHandlerLocalDiffusion::update(): switch(m_elemModus)!")); + } + + return do_update_local; + +} +*/ + +/////////////////////////////////////////////////////////////// +// new methods from base class +/////////////////////////////////////////////////////////////// + +// see mod_elem_flat_top() of flat_top.h +template +void InterfaceHandlerLocalDiffusion:: +compute_flat_top_data(GridObject* elem) +{ +// get new element corners and according element type + if ( this->StdFV_assembling() ) // Version an Stelle von 'm_bUsualAss = true' + { + this->CollectCorners_StdFV(elem); + + if ( dim == 2 ) this->set_roid_2d(); + if ( dim == 3 ) this->set_roid_3d(); + } + else + { + if ( dim == 2 ) + { + if ( get_Nitsche() ) + { Collect_Data_Nitsche(elem); this->set_roid_2d(); } + else + { CollectCorners_FlatTop_2d(elem); this->set_roid_2d(); } + } + + if ( dim == 3 ) { this->CollectCorners_FlatTop_3d(elem); this->set_roid_3d(); } + } + + // some checks: + if ( this->m_vCornerCoords.size() == 0 ) + UG_THROW("m_vCornerCoords.size() = " << this->m_vCornerCoords.size() << "not possible!\n"); + + if ( dim == 2 ) + if ( elem->reference_object_id() != ROID_TRIANGLE ) + UG_THROW("Discretisation only coded for triangular elements!\n"); + + if ( dim == 3 ) + if ( elem->reference_object_id() != ROID_TETRAHEDRON ) + UG_THROW("Discretisation only coded for tetrahedral elements!\n"); + + + this->m_elemModus = this->get_element_modus(elem); // computed via 'compute_element_modus()' during 'update_marker()' + + if ( 0 ){ + if( this->m_elemModus == CUT_BY_INTERFACE) + { + UG_LOG("_________________ compute_flat_top_data()_________________\n"); + + for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) + UG_LOG("m_vCornerCoords = " < m_vCornerCoords[i] << "\n"); + for ( size_t i = 0; i < this->m_vOriginalCornerID.size(); ++i ) + UG_LOG("Original: id = " << this->m_vOriginalCornerID[i] << "\n"); + UG_LOG("\n"); + for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i ) + UG_LOG("Interface: id = " << this->m_vInterfaceID[i] << "\n"); + UG_LOG("\n"); + if ( this->m_roid == ROID_TRIANGLE ) + { + for ( size_t i = 0; i < this->m_vRealCornerID_tri.size(); ++i ) + UG_LOG("m_vRealCornerID_tri: id = " << m_vRealCornerID_tri[i] << "\n"); + UG_LOG("\n"); + for ( size_t i = 0; i < m_vInterfaceID_tri.size(); ++i ) + UG_LOG("Interface tri: id = " << m_vInterfaceID_tri[i] << "\n"); + UG_LOG("\n"); + } + if ( this->m_roid == ROID_QUADRILATERAL ) + { + for ( size_t i = 0; i < m_vRealCornerID_quad.size(); ++i ) + UG_LOG("m_vRealCornerID_quad: id = " << m_vRealCornerID_quad[i] << "\n"); + UG_LOG("\n"); + for ( size_t i = 0; i < m_vInterfaceID_quad.size(); ++i ) + UG_LOG("Interface quad: id = " << m_vInterfaceID_quad[i] << "\n"); + UG_LOG("\n"); + } + } + } + +} + +template +bool InterfaceHandlerLocalDiffusion:: +update_elem(GridObject* elem, const MathVector* vCornerCoords) +{ + bool do_update_local = false; + m_vBF.clear(); + +// computing flat top modus + this->m_elemModus = this->compute_element_modus(elem, this->m_orientationInterface); + + switch(this->m_elemModus) + { + case INSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + break; // usual assembling + case OUTSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + break; // usual assembling + case CUT_BY_INTERFACE: compute_flat_top_data(elem); + //if ( m_roid == ROID_PYRAMID )UG_THROW("PYRAMID\n"); + do_update_local = true; + break; // flat top assembling + default: + throw(UGError("Error in InterfaceHandlerLocalBase::update(): switch(m_elemModus)!")); + } + + return do_update_local; + +} + + +} // end namespace ug + + + +#endif /* INTERFACE_HANDLER_LOCAL_DIFFUSION_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_tools.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_tools.h new file mode 100644 index 000000000..42d9629c6 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_tools.h @@ -0,0 +1,794 @@ +/* + * interface_handler_local_tools.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_LOCAL_DIFFUSION_TOOLS_H_ +#define INTERFACE_HANDLER_LOCAL_DIFFUSION_TOOLS_H_ + +namespace ug{ + +//////////////////////////////////////////////////////////////////////////////// +// FlatTopBase methods - ROID/CollectCorners... +//////////////////////////////////////////////////////////////////////////////// + +// used for local_to_global mapping + +template +bool InterfaceHandlerLocalDiffusion:: +lies_onInterface_tri(const size_t newID) +{ + for ( size_t i = 0; i < m_vInterfaceID_tri.size(); ++i) + if ( m_vInterfaceID_tri[i] == newID ) + return true; + + return false; +} + +template +bool InterfaceHandlerLocalDiffusion:: +lies_onInterface_quad(const size_t newID) +{ + for ( size_t i = 0; i < m_vInterfaceID_quad.size(); ++i) + if ( m_vInterfaceID_quad[i] == newID ) + return true; + + return false; +} + +template +bool InterfaceHandlerLocalDiffusion:: +lies_onInterface_size(const size_t newID, size_t size) +{ + if ( size == 3 ) + return lies_onInterface_tri(newID); + else if ( size == 4 ) + return lies_onInterface_quad(newID); + else UG_THROW("in 'lies_onInterface_sized()': invalid size (shold be 3 or 4!):" << size << "\n"); + +} + +/* +// compare implementation of 'DimFV1Geometry::update_boundary_faces()' +template +void InterfaceHandlerLocalDiffusion:: +update_inner_boundary_faces() +{ + + ///////////////////////////////////////////////////////////////////////////// + // get general data + ///////////////////////////////////////////////////////////////////////////// + const DimReferenceElement& rRefElem + = ReferenceElementProvider::get(this->m_roid); + + DimReferenceMapping& rMapping = ReferenceMappingProvider::get(this->m_roid); + rMapping.update(this->m_vCornerCoords); + + const LocalShapeFunctionSet& TrialSpace = + LocalFiniteElementProvider::get(this->m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); + + ///////////////////////////////////////////////////////////////////////////// + // compute local and global geom object midpoints for each dimension + ///////////////////////////////////////////////////////////////////////////// + + MathVector vvLocMid[dim+1][maxMid]; + MathVector vvGloMid[dim+1][maxMid]; + + // set corners of element as local centers of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + vvLocMid[0][i] = rRefElem.corner(i); + + // compute local midpoints + interfaceComputeMidPoints, maxMid>(rRefElem, vvLocMid[0], vvLocMid); + + // remember global position of nodes + for(size_t i = 0; i < rRefElem.num(0); ++i) + vvGloMid[0][i] = this->m_vCornerCoords[i]; + // compute local midpoints + interfaceComputeMidPoints, maxMid>(rRefElem, vvGloMid[0], vvGloMid); + + ///////////////////////////////////////////////////////////////////////////// + // collect boudary faces + ///////////////////////////////////////////////////////////////////////////// + + // get number of sides of element + size_t numSides = 0; + numSides = rRefElem.num(dim-1); + + // current number of bf + size_t curr_bf = 0; + + m_vBF.clear(); + // loop sides of element + for(size_t side = 0; side < numSides; ++side) + { + // side is no boundary face => continue + if ( !is_boundary_face(side) ) + continue; + + // number of corners of side (special case bottom side pyramid) + const int coOfSide = (this->m_roid != ROID_PYRAMID || side != 0) + ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; + + // resize vector + m_vBF.resize(curr_bf + coOfSide); + + // loop corners + for(int co = 0; co < coOfSide; ++co) + { + // get current bf + interfaceBF& bf = m_vBF[curr_bf]; + + // set node id == scv this bf belongs to + if (this->m_roid != ROID_PYRAMID || side != 0) + bf.nodeId = rRefElem.id(dim-1, side, 0, co); + else + { + // map according to order defined in ComputeBFMidID + bf.nodeId = rRefElem.id(dim-1, side, 0, (co % 3) + (co>3 ? 1 : 0)); + } + + // Compute MidID for BF + interfaceComputeBFMidID(rRefElem, side, bf.vMidID, co); + + // copy corners of bf + interfaceCopyCornerByMidID(bf.vLocPos, bf.vMidID, vvLocMid, interfaceBF::numCo); + interfaceCopyCornerByMidID(bf.vGloPos, bf.vMidID, vvGloMid, interfaceBF::numCo); + + // integration point + AveragePositions(bf.localIP, bf.vLocPos, interfaceBF::numCo); + AveragePositions(bf.globalIP, bf.vGloPos, interfaceBF::numCo); + + // normal on scvf + traits::NormalOnSCVF(bf.Normal, bf.vGloPos, vvGloMid[0]); + + // compute volume + bf.Vol = VecTwoNorm(bf.Normal); + + // compute shapes and grads + bf.numSH = TrialSpace.num_sh(); + TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); + TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); + + // get reference mapping + rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); + bf.detj = rMapping.sqrt_gram_det(bf.localIP); + + // compute global gradients + for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) + MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); + + // increase curr_bf + ++curr_bf; + + } // end loop of corners of side + + } // end loop sides of element + + +} +*/ + + + +// used during 'diffusion_interface/diffusion_interface.h:initialize_interface_Nitsche()': +template +size_t InterfaceHandlerLocalDiffusion:: +get_or_insert_indexPair_Nitsche(const size_t global_index) +{ + + std::pair::iterator,bool> ret; + ret = m_MapInserted_Nitsche.insert ( std::pair(global_index, m_MapInserted_Nitsche.size()) ); + + if (ret.second==false) { + //UG_LOG("element already existed with a value of " << ret.first->second << "\n"); + } + else{ + m_verticesGlobalIndex.push_back(global_index); + UG_LOG("global_index: " << global_index << "\n"); + + UG_LOG("ret.first->first: " << ret.first->first << "\n"); + UG_LOG("ret.first->second: " << ret.first->second << "\n"); + } + + return ret.first->second; + +} + +template +size_t InterfaceHandlerLocalDiffusion:: +get_index_for_global_index_Nitsche(const size_t global_index) +{ + for ( size_t i = 0; i < m_verticesGlobalIndex.size(); ++i) + if ( m_verticesGlobalIndex[i] == global_index ) + return i; + + UG_THROW("in 'global_index_of_interface_DoF_Nitsche': no index in m_verticesGlobalIndex-vector found for global_index = " << global_index << "\n"); +} + +template +size_t InterfaceHandlerLocalDiffusion:: +get_or_insert_vertex(Vertex* vrt) +{ + MathVector vrtPos = this->m_aaPos[vrt]; + + // near interface vertices are remapped onto grid points => NO new DoF! => No addint into list! + if (is_nearInterface(vrt) ) + return -1; + + get_or_insert_vertex(vrtPos); + +} + +template +bool InterfaceHandlerLocalDiffusion:: +find_vrtPos(const MathVector& vrtPos) +{ + typename std::map,size_t>::iterator it; + it = m_MapInserted.find(vrtPos); + + // if ret.second == false, then vrtPos allready exists in n_MapInserted + if (it != m_MapInserted.end()) + return true; + + return false; + +} + +template +size_t InterfaceHandlerLocalDiffusion:: +get_or_insert_vertex(const MathVector& vrtPos) +{ + std::pair,size_t>::iterator,bool> ret; + ret = m_MapInserted.insert ( std::pair,size_t>(vrtPos,m_MapInserted.size()) ); + + if (ret.second==false) { + //UG_LOG("element already existed with a value of " << ret.first->second << "\n"); + } + else{ + m_verticesPos.push_back(vrtPos); + } + + if ( vrtPos[0] == 0.5 ) + { + UG_LOG("m_verticesPos.size(): " << m_verticesPos.size() << "\n"); + // m_verticesValue.size() == numNewDoFs due to setting solution in 'modify_GlobalSol()'! + UG_LOG("m_verticesValue.size(): " << m_verticesValue.size() << "\n"); + + for ( size_t i = 0; i < m_verticesPos.size(); ++i) + UG_LOG("m_verticesPos: " << m_verticesPos[i][0] << " , " << m_verticesPos[i][1] << "\n"); + + if ( m_verticesValue[ret.first->second] != 0.0 ) + { + UG_LOG("vrtPos[0]: " << vrtPos[0] << "\n"); + UG_LOG("vrtPos[1]: " << vrtPos[1] << "\n"); + UG_LOG("ret.first->second: " << ret.first->second << "\n"); + UG_LOG("m_verticesValue: " << m_verticesValue[ret.first->second] << "\n"); + + } + + for ( size_t i = 0; i < m_verticesValue.size(); ++i) + UG_LOG("m_verticesValue: " << m_verticesValue[i] << "\n"); + + } + + return ret.first->second; +} + +template +void InterfaceHandlerLocalDiffusion:: +Resort_RealCornerID() +{ + m_vRealCornerID_quad.clear(); + + for ( size_t i = 0; i < this->m_vOriginalCornerID.size(); ++i ) + { + size_t origID = this->m_vOriginalCornerID[i]; + if ( !this->lies_onInterface(i) ) + m_vRealCornerID_quad.push_back(origID); + else if ( !find_vrtPos(this->m_vCornerCoords[i]) ) + m_vRealCornerID_quad.push_back(origID); + else + m_vRealCornerID_quad.push_back(get_or_insert_vertex(this->m_vCornerCoords[i])); + } +} + +template +void InterfaceHandlerLocalDiffusion:: +Collect_Data_Nitsche(GridObject* elem) +{ + this->m_vInterfaceID.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + +// FIRST: set m_vCornerCoords as usual coords for usage of corners(i) in fv1Cut_geom_impl.h:2336: +// m_vvGloMid[0][i] = m_spInterfaceHandler->corner(i); + this->m_vCornerCoords.clear(); + for(size_t i = 0; i < vVertex.size(); ++i) + this->m_vCornerCoords.push_back(this->m_aaPos[vVertex[i]]); + + int numFTVertex = 0; + for(size_t i = 0; i < vVertex.size(); ++i) + { + if ( this->m_aaPos[vVertex[i]][0] == 1.0 && this->m_aaPos[vVertex[i]][1] == 0.0 ) + UG_LOG("stop here...\n"); + + // remember boolian for check, weather there existe at least one vertex, which is FT! + if ( this->is_FTVertex(vVertex[i], i) ) + numFTVertex++; + } + + m_vAlpha.clear(); + m_vIntersectionPnts.clear(); + + MathVector insidePnt_check; + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *this->m_spMG, elem); + + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *this->m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("error in collecting vertices associated to an edge!....EXIT!...\n"); + + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + size_t vrtInd1 = this->get_vertex_index(vrt1, elem); + size_t vrtInd2 = this->get_vertex_index(vrt2, elem); + + UG_LOG("m_aaPos[vrt1] = " << this->m_aaPos[vrt1][0] << ", m_aaPos[vrt1][1] = " << this->m_aaPos[vrt1][1] << "\n"); + UG_LOG("m_aaPos[vrt2] = " << this->m_aaPos[vrt2][0] << ", m_aaPos[vrt2][1] = " << this->m_aaPos[vrt2][1] << "\n"); + + std::vector alphaOut; + MathVector intersectionPnt; + bool bNearInterface = false; + + + /////////////////////////////////////////////////////////////////// + // lies vrtRoot on a cutted edge? + /////////////////////////////////////////////////////////////////// + // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! + if ( this->is_nearInterfaceVertex(vrt2, vrtInd2) || this->is_nearInterfaceVertex(vrt1, vrtInd1) ) + { bNearInterface = true; continue; } + // case2: vert2 = outsideParticle && vrt1 = insideParticle: + else if ( this->is_FTVertex(vrt1, vrtInd1) && !this->is_FTVertex(vrt2, vrtInd2) ) + { + get_intersection_point(intersectionPnt, vrt2, vrt1, alphaOut); + UG_LOG("* alphaOut[0] = " << alphaOut[0] << ", alphaOut[1] = " << alphaOut[1] << "\n"); + UG_LOG("* intersectionPnt[0] = " << intersectionPnt[0] << ", intersectionPnt[1] = " << intersectionPnt[1] << "\n"); + m_vAlpha.push_back(alphaOut); + m_vIntersectionPnts.push_back(intersectionPnt); + m_vShapeValues[vrtInd2][vrtInd1] = alphaOut[0]; + m_vShapeValues[vrtInd1][vrtInd2] = alphaOut[1]; + if ( numFTVertex > 1 ) + { + m_insidePnt[0] = this->m_aaPos[vrt2][0]; + m_insidePnt[1] = this->m_aaPos[vrt2][1]; + } + else + { + m_insidePnt[0] = this->m_aaPos[vrt1][0]; + m_insidePnt[1] = this->m_aaPos[vrt1][1]; + } + this->m_vInterfaceID.push_back(vrtInd2); + } + // case3: vrt1 = outsideParticle && vrt2 = insideParticle: + else if ( this->is_FTVertex(vrt2, vrtInd2) && !this->is_FTVertex(vrt1, vrtInd1) ) + { + get_intersection_point(intersectionPnt, vrt1, vrt2, alphaOut); + UG_LOG("# alphaOut[0] = " << alphaOut[0] << ", alphaOut[1] = " << alphaOut[1] << "\n"); + UG_LOG("# intersectionPnt[0] = " << intersectionPnt[0] << ", intersectionPnt[1] = " << intersectionPnt[1] << "\n"); + m_vAlpha.push_back(alphaOut); + m_vIntersectionPnts.push_back(intersectionPnt); + m_vShapeValues[vrtInd1][vrtInd2] = alphaOut[0]; + m_vShapeValues[vrtInd2][vrtInd1] = alphaOut[1]; + if ( numFTVertex > 1 ) + { + insidePnt_check[0] = this->m_aaPos[vrt1][0]; + insidePnt_check[1] = this->m_aaPos[vrt1][1]; + } + else + { + insidePnt_check[0] = this->m_aaPos[vrt2][0]; + insidePnt_check[1] = this->m_aaPos[vrt2][1]; + } + this->m_vInterfaceID.push_back(vrtInd1); + } + else + { + alphaOut.clear(); alphaOut.push_back(0.0); alphaOut.push_back(0.0); + m_vAlpha.push_back(alphaOut); + m_vShapeValues[vrtInd1][vrtInd2] = 0.0; + m_vShapeValues[vrtInd2][vrtInd1] = 0.0; + continue; + } + + // check for correct inersectionPnt + if ( fabs(this->get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(this->get_LSvalue_byPosition(intersectionPnt)) << "\n"); + + } // end edge-loop + +/* +// and copy data to m_vInterfaceID_tri: + m_vInterfaceID_tri.clear(); + for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i) + m_vInterfaceID_1.push_back(m_vInterfaceID[i]); +*/ +// check + if ( insidePnt_check[0] != m_insidePnt[0]) + { + UG_LOG("insidePnt_check[0] = " << insidePnt_check[0] << "\n"); + UG_LOG("m_insidePnt[0] = " << m_insidePnt[0] << "\n"); + } + if ( insidePnt_check[1] != m_insidePnt[1]) + { + UG_LOG("insidePnt_check[1] = " << insidePnt_check[1] << "\n"); + UG_LOG("m_insidePnt[1] = " << m_insidePnt[1] << "\n"); + } + +// set values to zero + m_vShapeValues[0][0] = m_vShapeValues[1][1] = m_vShapeValues[2][2] = 0.0; + +// compute area + if ( dim != 2 ) + UG_THROW(" for dim = 3 the implementatino needs to be adapted here!\n"); + + MathVector _x10, _x20; + MathVector x10, x20, n; + + VecSubtract(_x10, m_vIntersectionPnts[0], m_insidePnt); + VecSubtract(_x20, m_vIntersectionPnts[1], m_insidePnt); + for(size_t i = 0; i < dim; ++i) + { + x10[i] = _x10[i]; + x20[i] = _x20[i]; + } + x10[2] = x20[2] = 0.0; + + VecCross(n, x10, x20); + + m_Area = 0.5 * VecTwoNorm(n); + + VecSubtract(_x10, this->m_aaPos[vVertex[1]], this->m_aaPos[vVertex[0]]); + VecSubtract(_x20, this->m_aaPos[vVertex[2]], this->m_aaPos[vVertex[0]]); + for(size_t i = 0; i < dim; ++i) + { + x10[i] = _x10[i]; + x20[i] = _x20[i]; + } + x10[2] = x20[2] = 0.0; + + VecCross(n, x10, x20); + + m_AreaOrig = 0.5 * VecTwoNorm(n); + +// if numFTVertex = 1: m_Area needs to be the area of the remaining quadrilateral! + if ( numFTVertex == 1 ) + m_Area = m_AreaOrig - m_Area; + + m_AreaScale = m_Area/m_AreaOrig; + +// compute normal and Gamma + MathVector normal; + VecSubtract(normal, m_vIntersectionPnts[1], m_vIntersectionPnts[0]); + m_NormalToFace[0] = -normal[1]; + m_NormalToFace[1] = normal[0]; + + m_Gamma = sqrt(VecDot(m_NormalToFace,m_NormalToFace)); + +// compute integrals along Gamma + m_vIntegralGamma.clear(); m_vIntegralGamma.resize(3); + for(size_t i = 0; i < 3; ++i) + { + number valueSum = 0.0; + for(size_t j = 0; j < 3; ++j) + valueSum += m_vShapeValues[i][j]; + m_vIntegralGamma[i] = 0.5 * valueSum; //* m_Gamma; + } + + UG_LOG("m_insidePnt = " << m_insidePnt[0] << " , " << m_insidePnt[1] << "\n"); + UG_LOG("m_NormalToFace = " << m_NormalToFace[0] << " , " << m_NormalToFace[1] << "\n"); + UG_LOG("m_Gamma = " << m_Gamma << "\n"); + UG_LOG("m_Area = " << m_Area << "\n"); + UG_LOG("m_AreaOrig = " << m_AreaOrig << "\n"); + UG_LOG("m_AreaScale = " << m_AreaScale << "\n"); + + for(size_t e = 0; e < vEdges.size(); ++e) + { + UG_LOG("alphaOut[" << e << "] = " << m_vAlpha[e][0] << " , " << m_vAlpha[e][1] << "\n"); + UG_LOG("vIntersectionPnt[" << e << "] = " << m_vIntersectionPnts[e][0] << " , " << m_vIntersectionPnts[e][1] << "\n"); + } + + for(size_t vrtInd1 = 0; vrtInd1 < 3; ++vrtInd1) + { + for(size_t vrtInd2 = 0; vrtInd2 < 3; ++vrtInd2) + UG_LOG("m_vShapeValues[vrtInd1][vrtInd2] = " << m_vShapeValues[vrtInd1][vrtInd2] << "\n"); + UG_LOG("\n"); + } + for(size_t i = 0; i < 3; ++i) + UG_LOG("m_vIntegralGamma = " << m_vIntegralGamma[i] << "\n"); + +} + +template +int InterfaceHandlerLocalDiffusion:: +CollectCorners_FlatTop_2d(GridObject* elem) +{ + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + this->m_vCornerCoords.clear(); + this->m_vInterfaceID.clear(); + this->m_vOriginalCornerID.clear(); + m_vRealCornerID_tri.clear(); + + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::vector, size_t > > vNearIntCorners; + std::vector vRealCornerID_tri; vRealCornerID_tri.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *this->m_spMG, elem); + + bool isFTVertex = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // remember boolian for check, weather there existe at least one vertex, which is FT! + isFTVertex = this->is_FTVertex(vVertex[i], i); + if ( isFTVertex ) + break; + } + + if ( !isFTVertex ) + UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *this->m_spMG, elem); + + // loop vertices + ////////////////////////////////////////////// + // REMARK: + // order is the same as in 'vCornerCoords', therefore we can be sure, that the + // order of the new 'vCornerIBCoords' will be consistent with the grid standard + ////////////////////////////////////////////// + + bool bNearInterface = false; this->set_bNearInterface(false); + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrtRoot = vVertex[i]; + + ////////////////////////////////////////////// + // case 1: + // vertex insideDomain + if ( !this->is_FTVertex(vrtRoot, i) ) + { + if ( this->is_nearInterfaceVertex(vrtRoot, i) ) + UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); + + this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); + this->m_vOriginalCornerID.push_back(i); + vRealCornerID_tri.push_back(i); + + vInsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); + } + ////////////////////////////////////////////// + // case 2: + // vertex = FT + ON interface + // => KEINE Berechnung von 'intersectionPoint' notwendig! -> pushen und alten index pushen + + // REMARK: is_nearInterfaceVerx = false per default, if m_vThresholdOnLevel = 0.0 + else if ( this->is_nearInterfaceVertex(vrtRoot, i) ) + { + bNearInterface = true; this->set_bNearInterface(true); + + this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); + this->m_vOriginalCornerID.push_back(i); + vRealCornerID_tri.push_back(i); + + this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); + vNearIntCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); + + get_or_insert_vertex(this->m_aaPos[vrtRoot]); + + } + ////////////////////////////////////////////// + // case 3: + // vertex 'outsideFluid' + // => NEUE Position berechen+pushen und alten index pushen + else + { + ////////////////////////////////////////////////////////////////////////////////////////// + // loop alle edges, die interface schneiden und damit einen neuen intersectionPnt + // beitragen zum damit assoziierten alten index + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *this->m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("error in collecting vertices associated to an edge!....EXIT!...\n"); + + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + size_t vrtInd1 = this->get_vertex_index(vrt1, elem); + size_t vrtInd2 = this->get_vertex_index(vrt2, elem); + + MathVector intersectionPnt; + + /////////////////////////////////////////////////////////////////// + // lies vrtRoot on a cutted edge? + /////////////////////////////////////////////////////////////////// + // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! + if ( this->is_nearInterfaceVertex(vrt2, vrtInd2) || this->is_nearInterfaceVertex(vrt1, vrtInd1) ) + { bNearInterface = true; this->set_bNearInterface(true); continue; } + // case2: vert2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt1 && !this->is_FTVertex(vrt2, vrtInd2) ){ + get_intersection_point(intersectionPnt, vrt2, vrt1); + } + // case3: vrt1 = outsideParticle && vrt2 = insideParticle: + else if ( vrtRoot == vrt2 && !this->is_FTVertex(vrt1, vrtInd1) ) + get_intersection_point(intersectionPnt, vrt1, vrt2); + else + continue; + + // check for correct inersectionPnt + if ( fabs(this->get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(this->get_LSvalue_byPosition(intersectionPnt)) << "\n"); + + /////////////////////////////////////////////////////////////////// + // only push_back, if not included yet! + // -> can be ONLY the case, if the intersectionPoint is a node + if ( ! this->isIncluded(this->m_vCornerCoords, intersectionPnt) ) + { + + this->m_vCornerCoords.push_back(intersectionPnt); + this->m_vOriginalCornerID.push_back(i); + this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(intersectionPnt, i)); + + size_t index = get_or_insert_vertex(intersectionPnt); + vRealCornerID_tri.push_back(index); + + } + + + } // end edge-loop + + } // end else-case + + } // end vrt-loop + +//////////////////////////////////////////////////////////////////////////////////////////// +// Postprecessing for quadrilaterals ( <=> vOutsideCorners == 2 ) +// (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface +// => no Quadrilateral, but Triangle!! +//////////////////////////////////////////////////////////////////////////////////////////// + const size_t orientation = this->m_orientationInterface; + + MathVector normalDir(0.0); + if ( (this->m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) + { + this->ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); + // and resort m_vRealCornerID_quad: + Resort_RealCornerID(); + // and copy data to m_vInterfaceID_quad: + m_vInterfaceID_quad.clear(); + for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i) + m_vInterfaceID_quad.push_back(this->m_vInterfaceID[i]); + } + else if ( bNearInterface && this->m_orientationInterface == -1 ) + { + // m_vRealCornerID_quad was not written and needs to be called: + // and copy data to m_vInterfaceID_tri: + Resort_RealCornerID(); + // and copy data to m_vInterfaceID_quad: + m_vInterfaceID_quad.clear(); + for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i) + m_vInterfaceID_quad.push_back(this->m_vInterfaceID[i]); + // Quadrilateral -> Triangle + if ( vInsideCorners.size() == 1 ) // case 1 + { + // do nothing, since re-sorting not necessary...??? + } + // skip whole element, since only FT points are included + else if ( vInsideCorners.size() == 0 ) + UG_THROW("in 'CollectCorners_FlatTop_2d()': vInsideCorners.size() " + "= " << vInsideCorners.size() << "not possible!\n"); + } + + if ( this->m_vCornerCoords.size() == 3 ) + { + // and copy data to m_vInterfaceID_tri: + m_vInterfaceID_tri.clear(); + for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i) + m_vInterfaceID_tri.push_back(this->m_vInterfaceID[i]); + // and copy data to m_vRealCornerID_tri: + m_vRealCornerID_tri.clear(); + for ( size_t i = 0; i < vRealCornerID_tri.size(); ++i) + m_vRealCornerID_tri.push_back(vRealCornerID_tri[i]); + } + + + return this->m_vCornerCoords.size(); + +} + +template +void InterfaceHandlerLocalDiffusion:: +print_InterfaceIDdata() +{ + + this->print_InterfaceDdata(); + + if ( InterfaceHandlerLocalBase::m_roid == ROID_TRIANGLE ) + { + for ( size_t i = 0; i < m_vInterfaceID_tri.size(); ++i ) + UG_LOG("Interface tri: id = " << m_vInterfaceID_tri[i] << "\n"); + UG_LOG("\n"); + + for ( size_t i = 0; i < m_vRealCornerID_tri.size(); ++i ) + UG_LOG("m_vRealCornerID_tri: id = " << m_vRealCornerID_tri[i] << "\n"); + UG_LOG("\n"); + } + + if ( InterfaceHandlerLocalBase::m_roid == ROID_QUADRILATERAL ) + { + for ( size_t i = 0; i < m_vInterfaceID_quad.size(); ++i ) + UG_LOG("Interface quad: id = " << m_vInterfaceID_quad[i] << "\n"); + UG_LOG("\n"); + + for ( size_t i = 0; i < m_vRealCornerID_quad.size(); ++i ) + UG_LOG("m_vRealCornerID_quad: id = " << m_vRealCornerID_quad[i] << "\n"); + UG_LOG("\n"); + } + +} + +template +void InterfaceHandlerLocalDiffusion:: +print_Nitsche_Data() +{ + for ( size_t i = 0; i < 3; ++i ) + UG_LOG("m_vAlpha = " << m_vAlpha[i][0] << "\t" << m_vAlpha[i][1] << "\n"); + UG_LOG("\n"); + + UG_LOG("vIntersectionPnt 1:" << m_vIntersectionPnts[0][0] << "\t" << m_vIntersectionPnts[0][1] << "\n"); + UG_LOG("vIntersectionPnt 2:" << m_vIntersectionPnts[1][0] << "\t" << m_vIntersectionPnts[1][1] << "\n"); + for(size_t vrtInd1 = 0; vrtInd1 < 3; ++vrtInd1) + { + for(size_t vrtInd2 = 0; vrtInd2 < 3; ++vrtInd2) + UG_LOG("m_vShapeValues[vrtInd1][vrtInd2] = " << m_vShapeValues[vrtInd1][vrtInd2] << "\n"); + UG_LOG("\n"); + } + UG_LOG("m_NormalToFace = " << m_NormalToFace[0] << " , " << m_NormalToFace[1] << "\n"); + UG_LOG("m_Gamma = " << m_Gamma << "\n"); + UG_LOG("m_Area = " << m_Area << "\n"); + UG_LOG("m_AreaOrig = " << m_AreaOrig << "\n"); + UG_LOG("m_AreaScale = " << m_AreaScale << "\n"); + +} + +} // end namespace ug + + + +#endif /* INTERFACE_HANDLER_LOCAL_DIFFUSION_TOOLS_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_user_data.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_user_data.h new file mode 100644 index 000000000..7553abb81 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_user_data.h @@ -0,0 +1,231 @@ +/* + * interface_handler_local_impl.h + * + * Created on: 19.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_LOCAL_DIFFUSION_DATA_H_ +#define INTERFACE_HANDLER_LOCAL_DIFFUSION_DATA_H_ + + + +namespace ug{ + + +/////////////////////////////////////////////////////////////// +/// methods for class 'InterfaceHandlerLocalDiffusion' +/////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////// +/// hard coded boundary conditions +/////////////////////////////////////////////////////////////// + +template +inline double get_jump_value_ex3(const MathVector position, const MathVector center, const int orientation) +{ + + return 0.0; + + if ( orientation == 1) + return 0.0; + + double absValue = position[0]*position[0] + position[1]* position[1]; + double returnValue = exp(-absValue); + + return returnValue; +} + + + +template +inline double get_jump_value_ex6(const MathVector position, const MathVector center, const int orientation) +{ + + if ( orientation == 1) + return 0.0; + + double returnValue = exp(position[0])*cos(position[1]); + + return returnValue; +} + +template +inline double get_jump_value_const(const MathVector position, const MathVector center, const int orientation) +{ + return 0.0; + + double absValue = position[0]*position[0] + position[1]* position[1]; + double factor = 8*(2*absValue - position[0] - position[1]); + + return factor*exp(-absValue); + + double sum = position[0] + position[1]; + + double returnValue = log(absValue) - sin(sum); + + return returnValue; +} + + +template +inline double get_jump_grad_value_ex6(const MathVector position, const MathVector center, const int orientation) +{ + if ( orientation == -1) + return 0.0; + + double x = position[0]; + double y = position[1]; + + double returnValue = 2.0*exp(x)*(y*sin(y)-x*cos(y)); + + return returnValue; +} + +template +inline double get_jump_grad_value_kappa_Frei(const MathVector position, const MathVector center, const int orientation) +{ + return 0.0; + + if ( orientation == 1) + return -1.0; + else + return -0.1; + +} + +template +inline double get_jump_grad_value_kappa_Frei_inverse(const MathVector position, const MathVector center, const int orientation) +{ + if ( orientation == 1) + return -1.0; + else + return -0.1; + +} + +template +inline double get_jump_grad_value_ex5(const MathVector position, const MathVector center, const int orientation) +{ + if ( orientation == 1) + return 2.0; + else + return 0.0; + +} + + +template +inline double get_source_kappa_konform(const MathVector position, const MathVector center, const int orientation) +{ + double center_x = 0.0; + double center_y = -0.0244; + double radius = 0.2625; + + if ( orientation == 1) + { + return 16.0*16.0; + } + else + { + if ( orientation != -1) + UG_THROW("wrong orientation!\n"); + + double dist_x = position[0] - center_x; + double dist_y = position[1] - center_y; + double dist = sqrt(dist_x*dist_x+dist_y*dist_y); + + return 200*16*dist*dist; + + } + +} + + + +template +inline double get_source_kappa_Frei(const MathVector position, const MathVector center, const int orientation) +{ + double center_x = 0.0; //0.1; + double center_y = 0.0; //0.2; + double kappa_1 = 0.1; + double kappa_2 = 1.0; + + if ( orientation == 1) + { + double dist_x = position[0] - center_x; + double dist_y = position[1] - center_y; + double distSq = sqrt(dist_x*dist_x+dist_y*dist_y); + + return 2.0*16*kappa_1*kappa_2*distSq; + } + else + { + if ( orientation != -1) + UG_THROW("wrong orientation!\n"); + + return 4.0*kappa_1*kappa_2; + + } + +} + + +template +inline double get_source_kappa_Frei_inverse(const MathVector position, const MathVector center, const int orientation) +{ + double center_x = 0.1; + double center_y = 0.2; + + if ( orientation == 1) + { + return 1.0*1.0*4.0; + } + else + { + if ( orientation != -1) + UG_THROW("wrong orientation!\n"); + + double dist_x = position[0] - center_x; + double dist_y = position[1] - center_y; + double dist = sqrt(dist_x*dist_x+dist_y*dist_y); + + return 2.0*0.1*0.1*16*dist*dist; + + } + +} +template +inline double get_source_Fedkiw_ex5(const MathVector position, const MathVector center, const int orientation) +{ + return 0.0; +} + + +template +inline double get_source_Fedkiw_ex3(const MathVector position, const MathVector center, const int orientation) +{ +// outside the circle line: + if ( orientation == 1) + { + UG_LOG("set to zero...\n"); + return 0.0; + } + double dist_x = position[0] - 0.5; + double dist_y = position[1] - 0.5; + double distSq = dist_x*dist_x+dist_y*dist_y; + double dist = sqrt(dist_x*dist_x+dist_y*dist_y); + + double absValue = position[0]*position[0] + position[1]*position[1]; + + return -8*(absValue-1.0)*exp(-absValue); + +} + + +} // end namespace ug + + + +#endif /* INTERFACE_HANDLER_LOCAL_DIFFUSION_DATA_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_base.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_base.h new file mode 100644 index 000000000..fa1695f0a --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_base.h @@ -0,0 +1,66 @@ +/* + * interface_handler_local.h + * + * Created on: 15.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_PROVIDER_H_ +#define INTERFACE_PROVIDER_H_ + +namespace ug{ + + +class IInterfaceProvider +{ + public: + +/// default constructor: + IInterfaceProvider(){}; + +/// destructor + + ~IInterfaceProvider() {} + +}; + + +class IInterfaceProvider +{ + public: + +/// default constructor: + IInterfaceProvider(){}; + +/// destructor + + ~IInterfaceProvider() {} + +}; + + +template +class InterfaceProviderBase : public IInterfaceProvider +{ + + public: +/// world Dimension + static const int dim = TWorldDim; + +/// default constructor: + InterfaceProviderBase() + { + clear(); + UG_LOG("InterfaceProviderBase constructor\n"); + }; + +/// destructor + ~InterfaceProviderBase() {} + +}; + + +}// end namespace ug + + +#endif /* INTERFACE_PROVIDER_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_diffusion.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_diffusion.h new file mode 100644 index 000000000..9a5b24c4c --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_diffusion.h @@ -0,0 +1,124 @@ +/* + * interface_handler_local.h + * + * Created on: 15.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_HANDLER_DIFFUSION_H_ +#define INTERFACE_HANDLER_DIFFUSION_H_ + +#include "interface_provider_particle.h" + + +namespace ug{ + + +template +class DiffusionInterfaceProvider : public ParticleProviderSphere +{ + + public: +/// world Dimension + static const int dim = TWorldDim; + +/// default constructor: + DiffusionInterfaceProvider() + { + this->clear(); + UG_LOG("DiffusionInterfaceProvider constructor\n"); + }; + +/// destructor + ~DiffusionInterfaceProvider() {} + +// setter methods + void add_with_solution(number radius, const MathVector& center, number density, number solution) + { + // A. set given values: + this->m_vCenter.push_back(center); + this->m_vRadius.push_back(radius); + this->m_vDensity.push_back(density); + + // B. prepare data for free particle velocities, to be computed + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + m_vvSolution.resize(numTimePoints); + + // B2: set default values if velocity of particle is free within fluid + for ( size_t i = 0; i < numTimePoints; ++i ) + m_vvSolution[i].push_back(solution); + } + + void add(number radius, const MathVector& center, number density) + { + // A. set given values: + this->m_vCenter.push_back(center); + this->m_vRadius.push_back(radius); + this->m_vDensity.push_back(density); + + // B. prepare data to set particle velocities + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + m_vvSolution.resize(numTimePoints); + + // B2: set particle velocities + for ( size_t i = 0; i < numTimePoints; ++i ) + m_vvSolution[i].push_back(0.0); + + } + + number get_radius(int prtIndex) + { if ( (int)this->num_particles() > 1 ) + UG_THROW("DiffusionInterfaceProvider::num_particles(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); + + return this->m_vRadius[prtIndex]; } + + number get_density(int prtIndex) + { if ( (int)this->num_particles() > 1 ) + UG_THROW("DiffusionInterfaceProvider::num_particles(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); + return this->m_vDensity[prtIndex]; } + + MathVector get_center(int prtIndex) + { if ( (int)this->num_particles() > 1 ) + UG_THROW("DiffusionInterfaceProvider::num_particles(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); + return this->m_vCenter[prtIndex]; } + +// called during ParticleMapper::modify_GlobalSol(): + void set_solution(number solution, size_t prtIndex, int timeSeriesInd) + { m_vvSolution[timeSeriesInd][prtIndex] = solution; } + +/// get solution values + number get_solution(size_t prtIndex, size_t timeSeriesInd) + { return m_vvSolution[timeSeriesInd][prtIndex]; } + + void print() + { + UG_LOG(" +++++++++++++++++++++++++ Particle Info ++++++++++++++++++++++++++++++ \n"); + UG_LOG("+++ num_particles = " << this->num_particles() << "\n"); + for (size_t p = 0; p < this->num_particles(); ++p) + { + UG_LOG("+++ center = " << this->get_center(p) << "\n"); + UG_LOG("+++ radius = " << this->get_radius(p) << "\n"); + UG_LOG("+++ density = " << this->get_density(p) << "\n"); + + UG_LOG("+++ solution set to: " << get_solution(p, 0) << "\n\n"); + } + UG_LOG(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); + } + + + protected: + +// m_vvSolution[i][j]: i := timeSeries-index; j := particle-index + // ToDo switch indexing: [prtIndex][TimeSeriesIndes] !! + std::vector > m_vvSolution; + + +}; + + +}// end namespace ug + + +#endif /* INTERFACE_HANDLER_DIFFUSION_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle.h new file mode 100644 index 000000000..3ef863330 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle.h @@ -0,0 +1,1130 @@ +/* + * moving_particle.h + * + * Created on: 20.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_PROVIDER_PARTICLE_H_ +#define INTERFACE_PROVIDER_PARTICLE_H_ + + +#ifdef UG_PARALLEL + #include "lib_grid/parallelization/load_balancer_util.h" +#endif + + +namespace ug{ + +class IInterfaceProvider +{ + public: + +/// default constructor: + IInterfaceProvider(){}; + +/// destructor + + ~IInterfaceProvider() {} + +}; + +template +class ParticleProvider : public IInterfaceProvider +{ + + public: +/// world Dimension + static const int dim = TWorldDim; + +/// default constructor: + ParticleProvider() + { + clear(); + UG_LOG("ParticleProvider constructor\n"); + }; + +/// destructor + ~ParticleProvider() {} + + void set_density(number density, int prtIndex) + { + if ( (int)num_particles() < prtIndex ) + UG_THROW("ParticleProvider::set_density(): number of given particles = " + << num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); + m_vDensity[prtIndex] = density; + } + void set_center(MathVector center, int prtIndex) + { + if ( (int)num_particles() < prtIndex ) + UG_THROW("ParticleProvider::set_center(): number of given particles = " + << num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); + for ( size_t d = 0; d < dim; ++d ) + m_vCenter[prtIndex][d] = center[d]; + } + + void clear() + { + UG_LOG("clear particles!\n"); + m_vCenter.clear(); m_vDensity.clear(); m_vGivenVelocity.clear(); + m_vvLinearVelocity.clear(); m_vvAngularVelocity.clear(); + } + + +// getter methods + size_t num_particles() const{ return m_vCenter.size(); } + + number get_density(int prtIndex){ return m_vDensity[prtIndex]; } + MathVector get_center(int prtIndex){ return m_vCenter[prtIndex]; } + bool get_DoF_modus_linear(int prtIndex) { return m_vGivenVelocity[prtIndex][0]; } + bool get_DoF_modus_angular(int prtIndex) { return m_vGivenVelocity[prtIndex][1]; } + +// called during PartcleMapper::modify_GlobalSol(): + void set_linear_velocity(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_vvLinearVelocity[timeSeriesInd][prtIndex][cmp] = solution; } + void set_linear_velocity(MathVector solution, size_t prtIndex, int timeSeriesInd) + { m_vvLinearVelocity[timeSeriesInd][prtIndex] = solution; } + void set_angular_velocity(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_vvAngularVelocity[timeSeriesInd][prtIndex][cmp] = solution; } + void set_angular_velocity(MathVector solution, size_t prtIndex, int timeSeriesInd) + { m_vvAngularVelocity[timeSeriesInd][prtIndex] = solution; } + +/// get solution values + MathVector get_linear_velocity(size_t prtIndex, size_t timeSeriesInd) + { return m_vvLinearVelocity[timeSeriesInd][prtIndex]; } + MathVector get_angular_velocity(size_t prtIndex, size_t timeSeriesInd) + { return m_vvAngularVelocity[timeSeriesInd][prtIndex]; } + + virtual number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) + { UG_THROW("in 'ParticleProvider::get_LSvalue_byPosition()': needs to be implemented by derived class!\n");} + + virtual bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex) + { UG_THROW("in 'ParticleProvider::get_intersection_point()': needs to be implemented by derived class!\n");} + + virtual bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { UG_THROW("in 'ParticleProvider::get_intersection_point()': needs to be implemented by derived class!\n");} + + +// careful! --> only dummy implementation, sice some methods in MovingParticle-class use it; in these cases it will be overwritten by +// the ParticleProviderSphere-class (hopefully) ;) + virtual number get_radius(int prtIndex) + { UG_THROW("in 'ParticleProvider::get_radius()': needs to be implemented by derived class!\n");} + + number get_theta(int prtIndex) + { UG_THROW("in 'ParticleProvider::get_theta()': needs to be implemented by derived class!\n");} + number set_theta(number theta, int prtIndex) + { UG_THROW("in 'ParticleProvider::get_theta()': needs to be implemented by derived class!\n");} + + void print() + { UG_THROW("in 'ParticleProvider::print()': needs to be implemented by derived class!\n");} + + /// methods called by local_to_global_mappe: + virtual number Volume(int levIndex, size_t prtIndex) + { UG_THROW("in 'ParticleProvider::Volume()': needs to be implemented by derived class!\n");} + virtual number Mass(const int levIndex, const int prtIndex, const number fluidDensity) + { UG_THROW("in 'ParticleProvider::Mass()': needs to be implemented by derived class!\n");} + virtual number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) + { UG_THROW("in 'ParticleProvider::Mass()': needs to be implemented by derived class!\n");} + virtual number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) + { UG_THROW("in 'ParticleProvider::MomOfInertia()': needs to be implemented by derived class!\n");} + virtual number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) + { UG_THROW("in 'ParticleProvider::MomOfInertia()': needs to be implemented by derived class!\n");} + + virtual void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) + { UG_THROW("in 'ParticleProvider::print_velocity()': needs to be implemented by derived class!\n");} + + virtual void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) + { UG_THROW("in 'ParticleProvider::update()': needs to be implemented by derived class!\n");} + +protected: + std::vector m_vDensity; + std::vector > m_vCenter; + // m_vLinearVelocity[i][j]: i := timeSeries-index; j := particle-index + // ToDo switch indexing: [prtIndex][TimeSeriesIndes] !! + std::vector > > m_vvLinearVelocity; + std::vector > > m_vvAngularVelocity; + // [prtIndex][linear/angular] + std::vector > m_vGivenVelocity; + +}; + + +template +class ParticleProviderSphere : public ParticleProvider +{ + +public: + /// world Dimension + static const int dim = TWorldDim; + + /// default constructor: + ParticleProviderSphere() : ParticleProvider() + { UG_LOG("ParticleProviderSphere constructor\n") }; + + /// destructor + ~ParticleProviderSphere() {} + + // setter methods + void add(number radius, const MathVector& center, number density) + { + // A. set given values: + this->m_vCenter.push_back(center); + m_vRadius.push_back(radius); + this->m_vDensity.push_back(density); + std::vector bDummy(2,false); + this->m_vGivenVelocity.push_back(bDummy); + + // B. prepare data for free particle velocities, to be computed + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + this->m_vvLinearVelocity.resize(numTimePoints); + this->m_vvAngularVelocity.resize(numTimePoints); + + // B2: set dummy values if velocity of particle is free within fluid + const MathVector vDummy(0.0); + + for ( size_t i = 0; i < numTimePoints; ++i ) + { + this->m_vvLinearVelocity[i].push_back(vDummy); + this->m_vvAngularVelocity[i].push_back(vDummy); + } + + } + + void add_moving(number radius, const MathVector& center, number density, + const MathVector& linearVel, const MathVector& angularVel) + { + // A. set given values: + this->m_vCenter.push_back(center); + m_vRadius.push_back(radius); + this->m_vDensity.push_back(density); + std::vector dummy(2,true); + this->m_vGivenVelocity.push_back(dummy); + + // B. prepare data to set particle velocities + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + this->m_vvLinearVelocity.resize(numTimePoints); + this->m_vvAngularVelocity.resize(numTimePoints); + + // B2: set particle velocities + for ( size_t i = 0; i < numTimePoints; ++i ) + { + this->m_vvLinearVelocity[i].push_back(linearVel); + this->m_vvAngularVelocity[i].push_back(angularVel); + } + } + + void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) + { + // update center of particle + MathVector centerNew = this->get_center(prtIndex); + VecScaleAdd(centerNew, 1.0, centerNew, deltaT, transSol); + this->set_center(centerNew, prtIndex); + } + +/////////////////////////////////////////////////////////////////////////////////////// +// new setter methods +/////////////////////////////////////////////////////////////////////////////////////// + + void set_radius(number radius, int prtIndex) + { + if ( (int)this->num_particles() < prtIndex ) + UG_THROW("ParticleProviderSphere::set_radius(): number of given particles = " + << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); + m_vRadius[prtIndex] = radius; + } + +/////////////////////////////////////////////////////////////////////////////////////// +// new getter methods +/////////////////////////////////////////////////////////////////////////////////////// + + number get_radius(int prtIndex){ return m_vRadius[prtIndex]; } + + +/////////////////////////////////////////////////////////////////////////////////////// +// methods from base class (necessary to be implemented!) +/////////////////////////////////////////////////////////////////////////////////////// + + + /// methods called by local_to_global_mappe: + number Volume(int levIndex, size_t prtIndex); + number Mass(const int levIndex, const int prtIndex, const number fluidDensity); + number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity); + number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity); + number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity); + + void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename); + + number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) + { + // if ( prtIndex == 1 ) + // UG_LOG("jihaa!...\n"); + + const number radius = get_radius(prtIndex); + const MathVector& center = this->get_center(prtIndex); + + MathVector localCoords; + VecSubtract(localCoords, vrtPos, center); + + number dist = VecDot(localCoords, localCoords); + dist = sqrt(dist); + + return radius - dist; + } + + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex) + { return get_LineCircle_Intersection(Intersect, vrtPosOut, vrtPosIn, PrtIndex);} + + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { return get_LineCircle_Intersection(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut);} + + + bool get_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex) + { + // if ( dim == 3 ) UG_THROW("in 'get_LineCircle_Intersection()': not implemented for 3d case!\n"); + + /////////////////////////////////////////////////////////////////////////////////////// + // + // 'vrtPosOut':= the starting point of the ray, + // 'vrtPosIn' := the end point of the ray, + // 'center' := the center of sphere you're testing against + // 'radius' := the radius of that sphere + // 'lineDir' := direction vector of ray from start to end + // 'rayDir' := direction vector of ray from center to start + // + // Ansatz: + // (1) Intersect = vrtPosOut + alpha*lineDir + // (2) Intersect - center = radius + // + // => (1) Intersect[0] = vrtPosOut[0] + alpha*lineDir[0] + // Intersect[1] = vrtPosOut[1] + alpha*lineDir[1] + // => (2) (Intersect[0] - center[0])^2 + (Intersect[1] - center[1])^2 = radius^2 + // + // Plug (1) into (2) => ... => quadratic equation for alpha: + // + // alpha^2 * + alpha * 2* + ( -radius^2 ) = 0 + // + // -> a = , b = , c = - radius^2 + // + // + // => from (1): Intersect = vrtPosOut + alpha*(vrtPosIn - vrtPosOut) + /////////////////////////////////////////////////////////////////////////////////////// + + number alpha; + + const number radius = get_radius(PrtIndex); + const MathVector& center = this->get_center(PrtIndex); + + MathVector lineDir; + MathVector rayDir; + + // lineDir = vrtPosIn - vrtPosOut; + VecSubtract(lineDir, vrtPosIn, vrtPosOut); + // rayDir = vrtPosOut - center; + VecSubtract(rayDir, vrtPosOut, center); + + const number a = VecDot(lineDir, lineDir); + const number b = 2.0 * VecDot(lineDir, rayDir); + const number c = VecDot(vrtPosOut, vrtPosOut) + VecDot(center, center) + - 2 * VecDot(vrtPosOut, center) - radius * radius; + + const number discriminant = b * b - 4 * a * c; + + // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: + if (discriminant < -1e-8) + UG_THROW("Value of discriminant = " << discriminant << "\n"); + + + // discriminant = 0! + const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); + const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); + + if (alpha1 <= alpha2) + alpha = alpha1; + else + alpha = alpha2; + + if (alpha < 0 || (alpha - 1.0) > 1e-8) + UG_THROW( + "Error in 'get_LineCircle_Intersection()': alpha not valid; should lie between 0 and 1: " << alpha << "\n"); + + for (size_t d = 0; d < dim; ++d) + Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; + + return true; + } + + bool get_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { + if ( (int)this->num_particles() > 1 ) + UG_THROW("get_LineCircle_Intersection(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); + + //if ( dim == 3 ) UG_THROW("in 'get_LineCircle_Intersection()': not implemented for 3d case!\n"); + + /////////////////////////////////////////////////////////////////////////////////////// + // + // 'vrtPosOut':= the starting point of the ray, + // 'vrtPosIn' := the end point of the ray, + // 'center' := the center of sphere you're testing against + // 'radius' := the radius of that sphere + // 'lineDir' := direction vector of ray from start to end + // 'rayDir' := direction vector of ray from center to start + // + // Ansatz: + // (1) Intersect = vrtPosOut + alpha*lineDir + // (2) Intersect - center = radius + // + // => (1) Intersect[0] = vrtPosOut[0] + alpha*lineDir[0] + // Intersect[1] = vrtPosOut[1] + alpha*lineDir[1] + // => (2) (Intersect[0] - center[0])^2 + (Intersect[1] - center[1])^2 = radius^2 + // + // Plug (1) into (2) => ... => quadratic equation for alpha: + // + // alpha^2 * + alpha * 2* + ( -radius^2 ) = 0 + // + // -> a = , b = , c = - radius^2 + // + // + // => from (1): Intersect = vrtPosOut + alpha*(vrtPosIn - vrtPosOut) + /////////////////////////////////////////////////////////////////////////////////////// + + number alpha; + + const number radius = get_radius(PrtIndex); + const MathVector& center = this->get_center(PrtIndex); + + MathVector lineDir; + MathVector rayDir; + + // lineDir = vrtPosIn - vrtPosOut; + VecSubtract(lineDir, vrtPosIn, vrtPosOut); + // rayDir = vrtPosOut - center; + VecSubtract(rayDir, vrtPosOut, center); + + const number a = VecDot(lineDir, lineDir); + const number b = 2.0 * VecDot(lineDir, rayDir); + const number c = VecDot(vrtPosOut, vrtPosOut) + VecDot(center, center) + - 2 * VecDot(vrtPosOut, center) - radius * radius; + + const number discriminant = b * b - 4 * a * c; + + // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: + if (discriminant < -1e-8) + UG_THROW("Value of discriminant = " << discriminant << "\n"); + + // discriminant = 0! + const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); + const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); + + if (alpha1 <= alpha2) + alpha = alpha1; + else + alpha = alpha2; + + if (alpha < 0 || (alpha - 1.0) > 1e-8) + UG_THROW( + "Error in 'get_LineCircle_Intersection()': alpha not valid; should lie between 0 and 1: " << alpha << "\n"); + + for (size_t d = 0; d < dim; ++d) + Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; + + alphaOut.clear(); + alphaOut.push_back(alpha); + alphaOut.push_back(1.0 - alpha); + + UG_LOG("alphaOut 0 = " << alphaOut[0] << "\n"); + UG_LOG("alphaOut 1 = " << alphaOut[1] << "\n"); + + return true; + } + +/////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// + + + void print() + { + UG_LOG(" +++++++++++++++++++++++++ ParticleProviderSphere Info ++++++++++++++++++++++++++++++ \n"); + UG_LOG("+++ num_particles = " << this->num_particles() << "\n"); + for (size_t p = 0; p < this->num_particles(); ++p) + { + UG_LOG("+++ center = " << this->get_center(p) << "\n"); + UG_LOG("+++ density = " << this->get_density(p) << "\n"); + UG_LOG("+++ radius = " << get_radius(p) << "\n"); + + if ( this->get_DoF_modus_linear(p) ) + {UG_LOG("+++ linear velocity set to: " << this->get_linear_velocity(p, 0) << "\n\n");} + else + {UG_LOG("+++ linear velocity FREE and set to: " << this->get_linear_velocity(p, 0) << "\n\n");} + if ( this->get_DoF_modus_angular(p) ) + {UG_LOG("+++ angular velocity set to: " << this->get_angular_velocity(p, 0) << "\n\n");} + else + {UG_LOG("+++ lineangularar velocity FREE and set to: " << this->get_angular_velocity(p, 0) << "\n\n");} + + } + UG_LOG(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); + } + + protected: + std::vector m_vRadius; + + +}; + +template +class ParticleProviderEllipse : public ParticleProvider +{ + +public: + /// world Dimension + static const int dim = TWorldDim; + + /// default constructor: + ParticleProviderEllipse() : ParticleProvider() + { + this->clear(); + UG_LOG("ParticleProviderEllipse constructor\n"); + + }; + + /// destructor + ~ParticleProviderEllipse() {} + + // setter methods + void add(const MathVector& ellipticAxis, const MathVector& center, const number theta, number density) + { + // A. set given values: + this->m_vCenter.push_back(center); + m_vEllipticAxis.push_back(ellipticAxis); + m_vTheta.push_back(theta); + + this->m_vDensity.push_back(density); + std::vector bDummy(2,false); + this->m_vGivenVelocity.push_back(bDummy); + + // B. prepare data for free ellipse velocities, to be computed + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + this->m_vvLinearVelocity.resize(numTimePoints); + this->m_vvAngularVelocity.resize(numTimePoints); + + // B2: set dummy values if velocity of ellipse is free within fluid + const MathVector vDummy(0.0); + + for ( size_t i = 0; i < numTimePoints; ++i ) + { + this->m_vvLinearVelocity[i].push_back(vDummy); + this->m_vvAngularVelocity[i].push_back(vDummy); + } + + } + + void add_moving(const MathVector& ellipticAxis, const MathVector& center, const number theta, number density, + const MathVector& linearVel, const MathVector& angularVel) + { + // A. set given values: + this->m_vCenter.push_back(center); + m_vEllipticAxis.push_back(ellipticAxis); + m_vTheta.push_back(theta); + + this->m_vDensity.push_back(density); + std::vector dummy(2,true); + this->m_vGivenVelocity.push_back(dummy); + + // B. prepare data to set ellipse velocities + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + this->m_vvLinearVelocity.resize(numTimePoints); + this->m_vvAngularVelocity.resize(numTimePoints); + + // B2: set ellipse velocities + for ( size_t i = 0; i < numTimePoints; ++i ) + { + this->m_vvLinearVelocity[i].push_back(linearVel); + this->m_vvAngularVelocity[i].push_back(angularVel); + } + } + + void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) + { + // update center of particle + MathVector centerNew = this->get_center(prtIndex); + VecScaleAdd(centerNew, 1.0, centerNew, deltaT, transSol); + this->set_center(centerNew, prtIndex); + + UG_LOG("in update: theta vorher: " << get_theta(prtIndex) << "\n"); + + // update theta of particle + UG_LOG("in update: thetaOld: " << get_theta(prtIndex) << "\n"); + UG_LOG("in update: radianOld: " << get_theta(prtIndex)* PI / 180.0 << "\n"); + + number radianNew = get_theta(prtIndex)* PI / 180.0 + deltaT*rotSol[0]; + number thetaNew = radianNew * 180.0 / PI; + set_theta(thetaNew, prtIndex); + + UG_LOG("in update: thetaNew: " << thetaNew << "\n"); + UG_LOG("in update: radianNew: " << radianNew << "\n"); + + UG_LOG("in update: theta nachher: " << get_theta(prtIndex) << "\n"); + + } + +/////////////////////////////////////////////////////////////////////////////////////// +// new setter methods +/////////////////////////////////////////////////////////////////////////////////////// + + void set_elliptic_axis(MathVector ellitpicAxis, int prtIndex) + { + if ( (int)this->num_particles() < prtIndex ) + UG_THROW("EllipseProvider::set_center(): number of given particles = " + << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); + for ( size_t d = 0; d < dim; ++d ) + m_vEllipticAxis[prtIndex][d] = ellitpicAxis[d]; + } + + void set_theta(number theta, int prtIndex) + { + if ( (int)this->num_particles() < prtIndex ) + UG_THROW("EllipseProvider::set_theta(): number of given particles = " + << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); + m_vTheta[prtIndex] = theta; + } + + void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename); + +/////////////////////////////////////////////////////////////////////////////////////// +// new getter methods +/////////////////////////////////////////////////////////////////////////////////////// + + MathVector get_elliptic_axis(int prtIndex){ return m_vEllipticAxis[prtIndex]; } + number get_elliptic_axis_x(int prtIndex){ return m_vEllipticAxis[prtIndex][0]; } + number get_elliptic_axis_y(int prtIndex){ return m_vEllipticAxis[prtIndex][1]; } + number get_theta(int prtIndex){ return m_vTheta[prtIndex]; } + +/////////////////////////////////////////////////////////////////////////////////////// +// methods from base class (necessary to be implemented!) +/////////////////////////////////////////////////////////////////////////////////////// + + /// methods called by local_to_global_mappe: + number Volume(int levIndex, size_t prtIndex); + number Mass(const int levIndex, const int prtIndex, const number fluidDensity); + number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity); + number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity); + number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity); + + + // set vrtPos to origin and rotate by -theta + void rotate_vector(MathVector& vrtPos, const int prtIndex) + { + const number theta = -1.0 * get_theta(prtIndex); + const number radians = theta * PI / 180.0; + const MathVector center = this->get_center(prtIndex); + + // first move vtPos to origin: + MathVector vrtPos_move; + VecSubtract(vrtPos_move, vrtPos, center); + // buffer values in order to overwrite them: + number vrtPos_x = vrtPos_move[0]; + number vrtPos_y = vrtPos_move[1]; + + + // Rotate vrtPos by angle -theta: + vrtPos_move[0] = vrtPos_x * cos(radians) - vrtPos_y * sin(radians); + vrtPos_move[1] = vrtPos_x * sin(radians) + vrtPos_y * cos(radians); + + // now move vtPos back to center: + VecAdd(vrtPos, vrtPos_move, center); + } + + // set vrtPos to center and rotate by theta + void rotate_vector_inverse(MathVector& vrtPos, const int prtIndex) + { + const number theta = 1.0 * get_theta(prtIndex); + const number radians = theta * PI / 180.0; + const MathVector center = this->get_center(prtIndex); + + // first move vtPos to origin: + MathVector vrtPos_move; + VecSubtract(vrtPos_move, vrtPos, center); + // buffer values in order to overwrite them: + number vrtPos_x = vrtPos_move[0]; + number vrtPos_y = vrtPos_move[1]; + + // Rotate vrtPos by angle theta: + vrtPos_move[0] = vrtPos_x * cos(radians) - vrtPos_y * sin(radians); + vrtPos_move[1] = vrtPos_x * sin(radians) + vrtPos_y * cos(radians); + + // now move vtPos to center: + VecAdd(vrtPos, vrtPos_move, center); + + } + + number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) + { + // A) get center of ellipse as reference point + const MathVector vrtPosIn = this->get_center(prtIndex); + MathVector intersectionPnt; + std::vector alphaOut; + alphaOut.resize(2,0.5); + + // B) Rotate vrtPos by angle -theta and set center of ellipse to origin: + rotate_vector(vrtPos, prtIndex); + + // C) Compute LS_value for rotated vrtPos: + number fake_LSvalue = IFF_LineEllipse_Intersection(intersectionPnt, vrtPos, vrtPosIn, prtIndex, alphaOut); + + return fake_LSvalue; + + } + + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex) + { + // first rotate input points: + MathVector vrtPosOut_rotated = vrtPosOut; + MathVector vrtPosIn_rotated = vrtPosIn; + + rotate_vector(vrtPosOut_rotated, PrtIndex); + rotate_vector(vrtPosIn_rotated, PrtIndex); + + // returns intersection point already shifted back to real center!! + get_LineEllipse_Intersection(Intersect, vrtPosOut_rotated, vrtPosIn_rotated, PrtIndex); + + // NOW: rotate the intersection point BACK again!! + // ---> (in 'get_LineEllipse_Intersection()' Intersect mit Ellipse through origin! + rotate_vector_inverse(Intersect, PrtIndex); + + return true; + } + + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { + // first rotate input points: + MathVector vrtPosOut_rotated = vrtPosOut; + MathVector vrtPosIn_rotated = vrtPosIn; + + rotate_vector(vrtPosOut_rotated, PrtIndex); + rotate_vector(vrtPosIn_rotated, PrtIndex); + + // returns intersection point already shifted back to real center!! + get_LineEllipse_Intersection(Intersect, vrtPosOut_rotated, vrtPosIn_rotated, PrtIndex, alphaOut); + + // NOW: rotate the intersection point BACK again!! + // ---> (in 'get_LineEllipse_Intersection()' Intersect mit Ellipse through origin! + rotate_vector_inverse(Intersect, PrtIndex); + + return true; + } + + bool get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex) + { + std::vector alphaOut; alphaOut.clear(); + get_LineEllipse_Intersection(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut); + } + +// Old version of 'get_LineEllipse_Intersection': + bool get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { + /////////////////////////////////////////////////////////////////////////////////////// + // The parameterized equation for a line segment through the points (x1, y1) and (x2, y2) is: + // x(t) = x1 + (x2-x1)t + // y(t) = y1 + (y2-y1)t + // The following is the equation for an ellipse centered at the origin: + // (x/a)^2 + (y/b)^2 - 1 = 0 + // with a,b = elliptic axis + + // If you plug the equations for the line into the equation for the ellipse + // AND after some computations, we get a quadratic equation of the form: + // At^2 + Bt + C = 0 + // with A = ..., B = ..., C = ... ---> see below in the code;) + /////////////////////////////////////////////////////////////////////////////////////// + + number alpha; + + const number axis_x = get_elliptic_axis_x(PrtIndex); + const number axis_y = get_elliptic_axis_y(PrtIndex); + const MathVector& center = this->get_center(PrtIndex); + + // first move line by 'center'-vector, so that we can do the computations based on an ellipse with origin + MathVector vrtPosIn_move; + MathVector vrtPosOut_move; + VecSubtract(vrtPosIn_move, vrtPosIn, center); + VecSubtract(vrtPosOut_move, vrtPosOut, center); + + // lineDir = vrtPosIn_move - vrtPosOut_move; + MathVector lineDir; + VecSubtract(lineDir, vrtPosIn_move, vrtPosOut_move); + + const number a = (lineDir[0]*lineDir[0])/(axis_x*axis_x) + (lineDir[1]*lineDir[1])/(axis_y*axis_y); + const number b = 2*vrtPosOut_move[0]*lineDir[0]/(axis_x*axis_x) + 2*vrtPosOut_move[1]*lineDir[1]/(axis_y*axis_y); + const number c = (vrtPosOut_move[0]*vrtPosOut_move[0])/(axis_x*axis_x) + (vrtPosOut_move[1]*vrtPosOut_move[1])/(axis_y*axis_y) - 1.0; + + const number discriminant = b * b - 4 * a * c; + + // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: + if (discriminant < -1e-8) + UG_THROW("Value of discriminant = " << discriminant << "\n"); + + // discriminant = 0! + const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); + const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); + + if (alpha1 <= alpha2) + alpha = alpha1; + else + alpha = alpha2; + + if (alpha < 0 || (alpha - 1.0) > 1e-8) + UG_THROW( + "Error in 'get_LineCircle_Intersection()': alpha not valid; should lie between 0 and 1: " << alpha << "\n"); + + for (size_t d = 0; d < dim; ++d) + Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; + + alphaOut.clear(); + alphaOut.push_back(alpha); + alphaOut.push_back(1.0 - alpha); + + // UG_LOG("alphaOut 0 = " << alphaOut[0] << "\n"); + // UG_LOG("alphaOut 1 = " << alphaOut[1] << "\n"); + + return true; + + } + + + /* bool get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { + /////////////////////////////////////////////////////////////////////////////////////// + // The parameterized equation for a line segment through the points (x1, y1) and (x2, y2) is: + // x(t) = x1 + (x2-x1)t + // y(t) = y1 + (y2-y1)t + // The following is the equation for an ellipse centered at the origin: + // (x/axis_x)^2 + (y/axis_y)^2 - 1 = 0 + // with axis_x,axis_y = elliptic axis + + // If you plug the equations for the line into the equation for the ellipse + // AND after some computations, we get a quadratic equation of the form: + // at^2 + bt + c = 0 + // with a = ..., b = ..., c = ... ---> see below in the code;) + /////////////////////////////////////////////////////////////////////////////////////// + + const number axis_x = get_elliptic_axis_x(PrtIndex); + const number axis_y = get_elliptic_axis_y(PrtIndex); + const MathVector& center = this->get_center(PrtIndex); + + MathVector lineDir; + VecSubtract(lineDir, vrtPosIn, vrtPosOut); + + /////////////////////////////////////////////////////////////////////////////////////// + // Trick necessary, in order to apply computation of Intersect by unsing the above formular: + // The center needs to lie on the connecting line of vrtPosOut, vrtPosIn and Intersect! + // ==> projection of center onto lineDir necessary + /////////////////////////////////////////////////////////////////////////////////////// + + // project center onto 'lineDir' + MathVector center_project = this->get_center(PrtIndex); + number alpha_project; + + // default: project in x-direction: + size_t projCoord = 0; + size_t keepCoord = 1; + + // BUT: check the following, in order to avoid, that projected center lies 'between' vrtPosOut and vrtPosIn: + if ( vrtPosIn[keepCoord] < center_project[keepCoord] < vrtPosOut[keepCoord] ) + { + projCoord = 1; + keepCoord = 0; + } + else if ( vrtPosOut[keepCoord] < center_project[keepCoord] < vrtPosIn[keepCoord] ) + { + projCoord = 1; + keepCoord = 0; + } + + // derive alpha_project and compute center_project: + alpha_project = (vrtPosIn[keepCoord] - vrtPosOut[keepCoord])/lineDir[keepCoord]; + center_project[projCoord] = vrtPosOut[projCoord] + alpha_project * lineDir[projCoord]; + + // tag: 'equationProj': == center_project[projCoord] = center[projCoord] + deltaCoord: + number deltaCoord = center_project[projCoord] - center[projCoord]; + + // apply deltaCoord-move to vrtPosIn and vrtPosOut: + // see: 'equationProj' + MathVector vrtPosIn_move; + vrtPosIn_move[projCoord] = vrtPosIn[projCoord] + deltaCoord; + vrtPosIn_move[keepCoord] = vrtPosIn[keepCoord]; + + MathVector vrtPosOut_move; + vrtPosOut_move[projCoord] = vrtPosOut[projCoord] + deltaCoord; + vrtPosOut_move[keepCoord] = vrtPosOut[keepCoord]; + + /////////////////////////////////////////////////////////////////////////////////////// + // finally, the usual computations can start, + // using 'vrtPosOut_move', 'vrtPosIn_move' and 'center_project': + /////////////////////////////////////////////////////////////////////////////////////// + + number factor1 = axis_x*axis_y; + number factor2 = sqrt(axis_x*axis_x*vrtPosOut_move[1]*vrtPosOut_move[1] + axis_y*axis_y*vrtPosOut_move[0]*vrtPosOut_move[0]); + number factor = factor1/factor2; + + Intersect[0] = factor * vrtPosOut_move[0]; + Intersect[1] = factor * vrtPosOut_move[1]; + + // compute distances to center for all 3 points: + number dist_vrtPosOut = VecDistance(vrtPosOut_move, center_project); + number dist_Intersect = VecDistance(Intersect, center_project); + + UG_LOG("dist_Intersect = " << dist_Intersect << "\n"); + UG_LOG("dist_vrtPosOut = " << dist_vrtPosOut << "\n"); + + // if both distances of intersection points (Intersect1, Intersect2) are bigger than the distance of vrtPosOut, + // then vrtPos is inside circle: + if ( dist_Intersect > dist_vrtPosOut) + UG_THROW("get_Line_Ellipse_Intersection: should not be the case!\n"); + + for (size_t d = 0; d < dim; ++d) + alphaOut.push_back((Intersect[d] - vrtPosOut_move[d])/lineDir[d]); + + + // re-map Intersect: + for (size_t d = 0; d < dim; ++d) + Intersect[d] += center[d]; + + + // check: + if ( fabs(alphaOut[0] - alphaOut[1]) > 0.0000001) + { + UG_LOG("alphaOut[0] = " << alphaOut[0] << "\n"); + UG_LOG("alphaOut[1] = " << alphaOut[1] << "\n"); + + } + + number dist_vrtPosIn = VecDistance(vrtPosIn_move, center_project); + number dist_vrtPos_move = VecDistance(vrtPosIn_move, vrtPosOut_move); + number dist_vrtPos = VecDistance(vrtPosIn, vrtPosOut); + number lineDir_length = sqrt(VecDot(lineDir, lineDir)); + + UG_LOG("dist_vrtPosIn = " << dist_vrtPosIn << "\n"); + + + number alpha = alphaOut[0]; + + alphaOut.clear(); + alphaOut.push_back(alpha); + alphaOut.push_back(1.0 - alpha); + + UG_LOG("alphaOut 0 = " << alphaOut[0] << "\n"); + UG_LOG("alphaOut 1 = " << alphaOut[1] << "\n"); + + return true; + + } + */ + // returns a number which substitues the computation of an LSvalue, i.e.: + // return value > 0, if vrtPosOut on same side as vrtPosIn (= discriminant < 0) + // return value < 0, if vrtPosOut on other side as vrtPosIn (= discriminant > 0) + number IFF_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { + /////////////////////////////////////////////////////////////////////////////////////// + // The parameterized equation for a line segment through the points (x1, y1) and (x2, y2) is: + // x(t) = x1 + (x2-x1)t + // y(t) = y1 + (y2-y1)t + // The following is the equation for an ellipse centered at the origin: + // (x/axis_x)^2 + (y/axis_y)^2 - 1 = 0 + // with axis_x,axis_y = elliptic axis + + // If you plug the equations for the line into the equation for the ellipse + // AND after some computations, we get a quadratic equation of the form: + // at^2 + bt + c = 0 + // with a = ..., b = ..., c = ... ---> see below in the code;) + /////////////////////////////////////////////////////////////////////////////////////// + + const number axis_x = get_elliptic_axis_x(PrtIndex); + const number axis_y = get_elliptic_axis_y(PrtIndex); + const MathVector& center = this->get_center(PrtIndex); + + // first move line by 'center'-vector, so that we can do the computations based on an ellipse with origin + MathVector vrtPosIn_move; + MathVector vrtPosOut_move; + MathVector center_move; + VecSubtract(vrtPosIn_move, vrtPosIn, center); + VecSubtract(vrtPosOut_move, vrtPosOut, center); + VecSubtract(center_move, center, center); + + number factor1 = axis_x*axis_y; + number factor2 = sqrt(axis_x*axis_x*vrtPosOut_move[1]*vrtPosOut_move[1] + axis_y*axis_y*vrtPosOut_move[0]*vrtPosOut_move[0]); + number factor = factor1/factor2; + + Intersect[0] = factor * vrtPosOut_move[0]; + Intersect[1] = factor * vrtPosOut_move[1]; + + // compute distances to center for all 3 points: + number dist_vrtPosOut = VecDistance(vrtPosOut_move, center_move); + number dist_Intersect = VecDistance(Intersect, center_move); + + // first check, that 'Intersect' does not lie ON the interface + // ---> case relevant for check in 'CollectCorners_FlatTop_2d() + // ---> see 'interface_handler_particle_tools.h:CollectCorners_FlatTop_2d(): + /* + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + */ + + if ( fabs(dist_Intersect - dist_vrtPosOut) < 1e-6) + return 0.0; + + // if both distances of intersection points (Intersect1, Intersect2) are bigger than the distance of vrtPosOut, + // then vrtPos is inside circle: + if ( dist_Intersect > dist_vrtPosOut) + { + return 0.001; + } + + return -0.001; + + } + + number IFF_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + { + if ( (int)this->num_particles() > 1 ) + UG_THROW("get_LineCircle_Intersection(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); + + //if ( dim == 3 ) UG_THROW("in 'get_LineCircle_Intersection()': not implemented for 3d case!\n"); + + /////////////////////////////////////////////////////////////////////////////////////// + // + // 'vrtPosOut':= the starting point of the ray, + // 'vrtPosIn' := the end point of the ray, + // 'center' := the center of sphere you're testing against + // 'radius' := the radius of that sphere + // 'lineDir' := direction vector of ray from start to end + // 'rayDir' := direction vector of ray from center to start + // + // Ansatz: + // (1) Intersect = vrtPosOut + alpha*lineDir + // (2) Intersect - center = radius + // + // => (1) Intersect[0] = vrtPosOut[0] + alpha*lineDir[0] + // Intersect[1] = vrtPosOut[1] + alpha*lineDir[1] + // => (2) (Intersect[0] - center[0])^2 + (Intersect[1] - center[1])^2 = radius^2 + // + // Plug (1) into (2) => ... => quadratic equation for alpha: + // + // alpha^2 * + alpha * 2* + ( -radius^2 ) = 0 + // + // -> a = , b = , c = - radius^2 + // + // + // => from (1): Intersect = vrtPosOut + alpha*(vrtPosIn - vrtPosOut) + /////////////////////////////////////////////////////////////////////////////////////// + + number alpha; + + const number radius = 0.125; + + UG_THROW("in ParticleProviderEllipse::IFF_LineCircle_Intersection: be careful! The radius here is HARD CODED, since an ellipse has no radius.\n"); + const MathVector& center = this->get_center(PrtIndex); + + MathVector lineDir; + MathVector rayDir; + + // lineDir = vrtPosIn - vrtPosOut; + VecSubtract(lineDir, vrtPosIn, vrtPosOut); + // rayDir = vrtPosOut - center; + VecSubtract(rayDir, vrtPosOut, center); + + const number a = VecDot(lineDir, lineDir); + const number b = 2.0 * VecDot(lineDir, rayDir); + const number c = VecDot(vrtPosOut, vrtPosOut) + VecDot(center, center) + - 2 * VecDot(vrtPosOut, center) - radius * radius; + + const number discriminant = b * b - 4 * a * c; + + // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: + if (discriminant < -1e-8) + { + UG_LOG("IFF_Line_Ellipse_Intersection: Value of discriminant = " << discriminant << "\n"); + return 0.001; + } + // discriminant = 0! + const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); + const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); + + if (alpha1 <= alpha2) + alpha = alpha1; + else + alpha = alpha2; + + // if alpha < 0, both vrt are inside: + if (alpha < 0 || (alpha - 1.0) > 1e-8) + { + UG_LOG("IFF_Line_Ellipse_Intersection: alpha < 0: " << alpha << "\n"); + return 0.001; + } + + for (size_t d = 0; d < dim; ++d) + Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; + + alphaOut.clear(); + alphaOut.push_back(alpha); + alphaOut.push_back(1.0 - alpha); + + // UG_LOG("alphaOut 0 = " << alphaOut[0] << "\n"); + // UG_LOG("alphaOut 1 = " << alphaOut[1] << "\n"); + + return -0.001; + } + +/////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// + + + + void print() + { + UG_LOG(" +++++++++++++++++++++++++ ParticleProviderEllipse Info ++++++++++++++++++++++++++++++ \n"); + UG_LOG("+++ num_particles = " << this->num_particles() << "\n"); + for (size_t p = 0; p < this->num_particles(); ++p) + { + UG_LOG("+++ center = " << this->get_center(p) << "\n"); + UG_LOG("+++ density = " << this->get_density(p) << "\n"); + UG_LOG("+++ theta = " << get_theta(p) << "\n"); + UG_LOG("+++ elliptic_axis_x = " << get_elliptic_axis_x(p) << "\n"); + UG_LOG("+++ elliptic_axis_y = " << get_elliptic_axis_y(p) << "\n"); + + if ( this->get_DoF_modus_linear(p) ) + {UG_LOG("+++ linear velocity set to: " << this->get_linear_velocity(p, 0) << "\n\n");} + else + {UG_LOG("+++ linear velocity FREE and set to: " << this->get_linear_velocity(p, 0) << "\n\n");} + if ( this->get_DoF_modus_angular(p) ) + {UG_LOG("+++ angular velocity set to: " << this->get_angular_velocity(p, 0) << "\n\n");} + else + {UG_LOG("+++ lineangularar velocity FREE and set to: " << this->get_angular_velocity(p, 0) << "\n\n");} + + } + UG_LOG(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); + } + +protected: + std::vector > m_vEllipticAxis; + std::vector m_vTheta; + +}; + + +} // end namespace ug + + +#include "interface_provider_particle_sphere_impl.h" +#include "interface_provider_particle_ellipse_impl.h" + + +#endif /* INTERFACE_PROVIDER_PARTICLE_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_ellipse_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_ellipse_impl.h new file mode 100644 index 000000000..0da455669 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_ellipse_impl.h @@ -0,0 +1,128 @@ +/* + * moving_particle.h + * + * Created on: 20.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_PROVIDER_PARTICLE_ELLIPSE_H_ +#define INTERFACE_PROVIDER_PARTICLE_ELLIPSE_H_ + + +namespace ug{ + +template +void ParticleProviderEllipse:: +print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) +{ + MathVector center = this->get_center(prtIndex); + + std::string name(filename); + + char * cstr = new char [name.size()+1]; + strcpy (cstr, name.c_str()); + + if ( !isTimedep ) + { + FILE* print_velocity = fopen(name.c_str(), "a"); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t %e \t ", transSol[d], rotSol[d]); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t ", center[d]); + fprintf(print_velocity," %e \t # transVel[0], rotVel[0], transVel[1], rotVel[1], center_coords, theta, (m_bSharedIP = ", get_theta(prtIndex)); + fprintf(print_velocity, "0 ) \n "); + fclose(print_velocity); + } + else + { + FILE* print_velocity = fopen(name.c_str(), "a"); + fprintf(print_velocity,"%e \t ",time); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t %e \t ", transSol[d], rotSol[d]); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t ", center[d]); + fprintf(print_velocity," %e \t # time, transVel[0], rotVel[0], transVel[1], rotVel[1], center_coords[0], center[1], theta", get_theta(prtIndex)); + fprintf(print_velocity, " \n "); + fclose(print_velocity); + } + +} + +template +number ParticleProviderEllipse:: +Volume(int levIndex, size_t prtIndex) +{ + const number axis_x = get_elliptic_axis_x(prtIndex); + const number axis_y = get_elliptic_axis_y(prtIndex); + + number volume; + + if ( dim == 2 ) + volume = 3.1415*axis_x*axis_y; + if ( dim == 3 ) + UG_THROW("in 'ParticleProviderEllipse::Volume()': 3d-case (i.e. axis_z) not implemented!\n"); + //volume = 4.0/3.0*3.1415*axis_x*axis_y*axis_z; + + UG_LOG("Volume: " << volume << "\n"); + + return volume; +} + +template +number ParticleProviderEllipse:: +Mass(const int levIndex, const int prtIndex, const number fluidDensity) +{ + const number prtDensity = this->get_density(prtIndex); + const number effective_density = prtDensity - fluidDensity; + number mass = Volume(levIndex, prtIndex) * effective_density; + return mass; +} + +template +number ParticleProviderEllipse:: +Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) +{ + const number prtDensity = this->get_density(prtIndex); + const number effective_density = prtDensity - fluidDensity; + number mass = volume * effective_density; + + return mass; +} + +template +number ParticleProviderEllipse:: +MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) +{ + const number axis_x = get_elliptic_axis_x(prtIndex); + const number axis_y = get_elliptic_axis_y(prtIndex); + + number momOfInertia; + + if ( dim == 2 ) momOfInertia = 0.25*axis_x*axis_y*Mass(levIndex, prtIndex, fluidDensity); + if ( dim == 3 ) + UG_THROW("in 'ParticleProviderEllipse::MomOfInertia()': 3d-case not implemented!\n"); + + return momOfInertia; +} + +template +number ParticleProviderEllipse:: +MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) +{ + const number axis_x = get_elliptic_axis_x(prtIndex); + const number axis_y = get_elliptic_axis_y(prtIndex); + + number momOfInertia; + + // I_x = 0.25 * pi * a * b^3 = 0.25 * b^2 * Area + // I_y = 0.25 * pi * b * a^3 = 0.25 * a^2 * Area + // => I_origin = I_x + I_y = 0.25 * (a^2+b^2) * Area + // => identical to MomOfInertia of Circle for a = b = r + if ( dim == 2 ) momOfInertia = 0.25*(axis_x*axis_x + axis_y*axis_y)*Mass(levIndex, prtIndex, volume, fluidDensity); + if ( dim == 3 ) + UG_THROW("in 'ParticleProviderEllipse::MomOfInertia()': 3d-case not implemented!\n"); + + return momOfInertia; +} + + +} // end namespace ug + + +#endif /* INTERFACE_PROVIDER_PARTICLE_ELLIPSE_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_sphere_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_sphere_impl.h new file mode 100644 index 000000000..b348866f3 --- /dev/null +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_sphere_impl.h @@ -0,0 +1,127 @@ +/* + * moving_particle.h + * + * Created on: 20.01.2015 + * Author: suze + */ + +#ifndef INTERFACE_PROVIDER_PARTICLE_SPHERE_H_ +#define INTERFACE_PROVIDER_PARTICLE_SPHERE_H_ + + +namespace ug{ + +template +void ParticleProviderSphere:: +print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) +{ + MathVector center = this->get_center(prtIndex); + const number radius = get_radius(prtIndex); + + number f1 = 0.0; + number gravity = -9.81; + if ( !isTimedep ) + f1 = transSol[0]*4.0/(radius*radius*gravity); + + std::string name(filename); + + char * cstr = new char [name.size()+1]; + strcpy (cstr, name.c_str()); + + if ( !isTimedep ) + { + FILE* print_velocity = fopen(name.c_str(), "a"); + fprintf(print_velocity,"%e \t %e \t ",radius, f1); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t %e \t ", transSol[d], rotSol[d]); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t ", center[d]); + fprintf(print_velocity," # radius, f1, transVel[0], rotVel[0], transVel[1], rotVel[1], center_coords, (m_bSharedIP = "); + fprintf(print_velocity, "0 ) \n "); + fclose(print_velocity); + } + else + { + FILE* print_velocity = fopen(name.c_str(), "a"); + fprintf(print_velocity,"%e \t ",time); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t %e \t ", transSol[d], rotSol[d]); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t ", center[d]); + fprintf(print_velocity," # time, transVel[0], rotVel[0], transVel[1], rotVel[1], center_coords[0], center[1]"); + fprintf(print_velocity, " \n "); + fclose(print_velocity); + } + +} + +template +number ParticleProviderSphere:: +Volume(int levIndex, size_t prtIndex) +{ + const number radius = get_radius(prtIndex); + number volume; + + /* if ( m_bVolNumeric ){ + volume = compute_volume(Index, prtIndex); + } + else + {*/ + if ( dim == 2 ) + volume = 3.1415*radius*radius; + if ( dim == 3 ) + volume = 4.0/3.0*3.1415*radius*radius*radius; + // } + UG_LOG("Volume: " << volume << "\n"); + + return volume; +} + +template +number ParticleProviderSphere:: +Mass(const int levIndex, const int prtIndex, const number fluidDensity) +{ + const number prtDensity = this->get_density(prtIndex); + const number effective_density = prtDensity - fluidDensity; + number mass = Volume(levIndex, prtIndex) * effective_density; + return mass; +} + +template +number ParticleProviderSphere:: +Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) +{ + const number prtDensity = this->get_density(prtIndex); + const number effective_density = prtDensity - fluidDensity; + number mass = volume * effective_density; + + return mass; +} + +template +number ParticleProviderSphere:: +MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) +{ + const number radius = get_radius(prtIndex); + number momOfInertia; + + if ( dim == 2 ) momOfInertia = 0.5*radius*radius*Mass(levIndex, prtIndex, fluidDensity); + if ( dim == 3 ) momOfInertia = 0.4*radius*radius*Mass(levIndex, prtIndex, fluidDensity); + + return momOfInertia; +} + +template +number ParticleProviderSphere:: +MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) +{ + const number radius = get_radius(prtIndex); + number momOfInertia; + + if ( dim == 2 ) momOfInertia = 0.5*radius*radius*Mass(levIndex, prtIndex, volume, fluidDensity); + if ( dim == 3 ) momOfInertia = 0.4*radius*radius*Mass(levIndex, prtIndex, volume, fluidDensity); + + return momOfInertia; +} + + +} // end namespace ug + + +#endif /* INTERFACE_PROVIDER_PARTICLE_SPHERE_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/local_to_global/local_to_global_mapper.h b/ugbase/lib_disc/spatial_disc/local_to_global/local_to_global_mapper.h index 656e5ea6e..cd1850e66 100644 --- a/ugbase/lib_disc/spatial_disc/local_to_global/local_to_global_mapper.h +++ b/ugbase/lib_disc/spatial_disc/local_to_global/local_to_global_mapper.h @@ -38,6 +38,8 @@ // intern headers #include "lib_disc/dof_manager/dof_distribution.h" +#include "lib_disc/time_disc/solution_time_series.h" + namespace ug{ @@ -70,8 +72,26 @@ class ILocalToGlobalMapper virtual void add_local_mat_to_global(matrix_type& mat, const LocalMatrix& lmat, ConstSmartPtr dd) = 0; - /// modifies local solution vector for adapted defect computation - virtual void modify_LocalSol(LocalVector& vecMod, const LocalVector& lvec, ConstSmartPtr dd) = 0; + /// sets certain entries to Dirichlet DoFs (in elem_disc_assembla_util) + virtual void adjust_mat_global(matrix_type& mat, const LocalMatrix& lmat, + ConstSmartPtr dd) = 0; + + /// modifies local solution vector for adapted defect computation ( in elem_disc_assemble_util) + virtual void modify_LocalData(LocalMatrix& locJ, LocalVector& locU, + ConstSmartPtr dd) = 0; + virtual void modify_LocalData(LocalVectorTimeSeries& uT, LocalMatrix& locJ, LocalVector& locU, + ConstSmartPtr dd) = 0; + + virtual void modify_LocalData(LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, + ConstSmartPtr dd) = 0; + virtual void modify_LocalData(LocalVectorTimeSeries& uT, LocalVector& locD, LocalVector& tmpLocD, LocalVector& locU, + ConstSmartPtr dd, size_t t) = 0; + + /// modifies global solution vector for adapted defect computation (in domain_disc_impl) + virtual void modify_GlobalSol(vector_type& vecMod, const vector_type& vec, ConstSmartPtr dd) = 0; + + virtual void modify_GlobalSol(SmartPtr > vSolMod, + ConstSmartPtr > vSol, ConstSmartPtr dd) = 0; /// virtual destructor virtual ~ILocalToGlobalMapper() {}; From 766f05b2412aa3f0f4e59f142c3f528168162015 Mon Sep 17 00:00:00 2001 From: Susanne Date: Mon, 23 Sep 2019 16:25:34 +0200 Subject: [PATCH 3/4] merge conflict fixed --- .gitignore | 3 +- .travis.yml | 25 +- CMakeLists.txt | 17 +- README.md | 198 +- appveyor.yml | 4 +- ..._use_cmake_shipped_version_FindBLAS.cmake} | 0 ...se_cmake_shipped_version_FindLAPACK.cmake} | 0 cmake/toolchain/juwels.cmake | 62 + cmake/ug/export_linker_flags.cmake | 49 + ...=> export_single_file_compile_flags.cmake} | 22 +- cmake/ug/lapack_blas.cmake | 24 +- cmake/ug_includes.cmake | 12 +- .../tips_guides/install_eclipse.doxygen | 4 +- .../ug4/additional_pages/introduction.doxygen | 16 +- docs/ug4/additional_pages/main_page.doxygen | 5 + .../additional_pages/setup/buildug.doxygen | 2 +- .../setup/install/install.doxygen | 2 +- .../setup/install/ug4_on_linux.doxygen | 2 +- .../setup/install/ug4_on_mac.doxygen | 2 +- .../setup/install/ug4_on_windows.doxygen | 2 +- docs/ug4/additional_pages/usage/usage.doxygen | 2 +- docs/ug4/img/readme/Pan-Scheme.png | Bin 0 -> 18687 bytes .../PanSolution3d-coil_and_pan_v3-lev4.png | Bin 0 -> 651305 bytes docs/ug4/img/readme/elder_adapt.png | Bin 0 -> 397292 bytes docs/ug4/img/readme/navier_stokes.png | Bin 0 -> 319785 bytes docs/ug4/img/readme/poisson.png | Bin 0 -> 217648 bytes docs/ug4/img/readme/promesh.png | Bin 0 -> 498178 bytes docs/ug4/img/readme/springboard.png | Bin 0 -> 134828 bytes docs/ug4/img/readme/vrl_skin2d.png | Bin 0 -> 1015520 bytes scripts/shell/clusterdetect | 24 +- scripts/shell/clusters | 6 + .../{make.inc_jureca => make.inc_juelich} | 23 +- scripts/shell/schedulers/cekon | 37 +- scripts/shell/schedulers/cesari | 6 +- scripts/shell/schedulers/juwels | 204 ++ scripts/shell/schedulers/sdcluster | 209 +++ scripts/shell/ugconfig | 39 +- scripts/shell/uginstall | 6 +- scripts/shell/ugsubmit | 40 +- scripts/util/checkpoint_util.lua | 22 +- ...tes_static.lua => conv_rates_immersed.lua} | 58 +- scripts/util/gnuplot.lua | 12 +- scripts/util/load_balancing_util.lua | 19 +- scripts/util/load_balancing_util_2.lua | 4 - scripts/util/solver_util.lua | 116 +- scripts/util/time_step_util.lua | 44 +- scripts/util/user_data_util.lua | 4 + ug4.bib | 32 + ugbase/bindings/lua/info_commands.cpp | 2 +- ugbase/bindings/vrl/messaging.h | 12 - ugbase/bridge/CMakeLists.txt | 2 +- .../bridge_mat_vec_operations.h | 7 + .../bridge/algebra_bridges/common_bridge.cpp | 37 +- .../bridge/algebra_bridges/solver_bridge.cpp | 11 + ugbase/bridge/bridge.cpp | 3 +- .../disc_bridges/adaptive_tools_bridge.cpp | 1 + ugbase/bridge/disc_bridges/algebra_bridge.cpp | 1 + .../disc_bridges/constraints_bridge.cpp | 3 + .../disc_bridges/grid_function_bridge.cpp | 40 + .../bridge/disc_bridges/integrate_bridge.cpp | 7 +- .../bridge/disc_bridges/multigrid_bridge.cpp | 78 +- ugbase/bridge/disc_bridges/output_bridge.cpp | 5 +- .../bridge/disc_bridges/user_data_bridge.cpp | 19 + .../bridge/domain_bridges/domain_bridge.cpp | 19 +- .../domain_bridges/load_balancing_bridge.cpp | 1 + .../domain_bridges/refinement_bridge.cpp | 159 +- .../domain_bridges/transform_bridge.cpp | 3 +- .../bridge/misc_bridges/vec_math_bridge.cpp | 16 +- ugbase/common/debug_id.cpp | 3 + ugbase/common/error.cpp | 6 +- ugbase/common/error.h | 16 + ugbase/common/log.h | 22 +- .../math_matrix_functions_common_impl.hpp | 24 +- ...th_matrix_vector_functions_common_impl.hpp | 1 + .../math/math_vector_matrix/math_vector.h | 22 +- .../math_vector_functions.h | 11 +- .../math_vector_functions_common_impl.hpp | 17 +- ugbase/common/math/misc/tritri.cpp | 2 +- ugbase/common/progress.cpp | 1 + ugbase/common/progress.h | 6 +- ugbase/common/util/file_util.cpp | 14 +- ugbase/common/util/file_util.h | 36 +- .../os_dependent_impl/file_util_posix.cpp | 5 - .../util/os_dependent_impl/file_util_win.cpp | 5 - ugbase/common/util/path_provider.h | 30 + ugbase/common/util/section_container.hpp | 27 +- ugbase/lib_algebra/CMakeLists.txt | 2 +- ugbase/lib_algebra/cpu_algebra/sparsematrix.h | 4 + .../cpu_algebra/sparsematrix_impl.h | 19 + ugbase/lib_algebra/cpu_algebra/vector.h | 3 + ugbase/lib_algebra/cpu_algebra/vector_impl.h | 9 + ugbase/lib_algebra/operator/debug_writer.h | 183 +- .../operator/eigensolver/power_method.h | 18 + .../operator/fixed_convergence_check.h | 2 +- .../interface/constrained_linear_iterator.h | 5 + .../operator/linear_solver/bicgstab.h | 40 +- .../lib_algebra/operator/linear_solver/cg.h | 29 +- .../external_solvers/external_solvers.h | 46 +- .../operator/linear_solver/linear_solver.h | 39 +- .../operator/preconditioner/gauss_seidel.h | 17 +- .../lib_algebra/operator/preconditioner/ilu.h | 117 +- .../operator/preconditioner/ilut.h | 20 +- .../operator/preconditioner/jacobi.h | 7 +- .../operator/preconditioner/schur/schur.cpp | 1 + .../parallelization/parallel_vector.h | 5 +- .../parallelization/parallel_vector_impl.h | 27 + ugbase/lib_algebra/small_algebra/double.h | 7 + .../small_algebra/small_matrix/block_dense.h | 12 + .../lib_disc/dof_manager/dof_distribution.cpp | 17 +- .../lib_disc/dof_manager/dof_distribution.h | 21 + .../dof_manager/ordering/downwindorder.cpp | 3 +- ugbase/lib_disc/domain_util.cpp | 13 + ugbase/lib_disc/domain_util.h | 4 + .../error_elem_marking_strategy.h | 15 +- .../function_spaces/error_indicator.h | 2 +- .../function_spaces/error_indicator_util.h | 7 +- .../function_spaces/grid_function_user_data.h | 20 +- .../function_spaces/grid_function_util.h | 119 +- ugbase/lib_disc/function_spaces/integrate.h | 390 +++- .../function_spaces/interpolate_inner.h | 18 + .../lib_disc/function_spaces/local_transfer.h | 4 +- .../lib_disc/function_spaces/metric_spaces.h | 283 ++- ugbase/lib_disc/io/vtkoutput.cpp | 40 +- ugbase/lib_disc/io/vtkoutput.h | 88 +- ugbase/lib_disc/io/vtkoutput_impl.h | 504 ++++- .../local_finite_element_id.cpp | 2 +- .../multi_grid_solver/mg_solver.h | 18 +- .../multi_grid_solver/mg_solver_impl.hpp | 113 +- .../nested_iteration/nested_iteration_impl.h | 2 + .../sequential_subspace_correction.h | 763 ++++++++ .../assembled_non_linear_operator.h | 1 + .../newton_solver/newton.h | 17 +- .../newton_solver/newton_impl.h | 156 +- ugbase/lib_disc/spatial_disc/ass_tuner.h | 11 +- .../constraints/constraint_interface.h | 5 +- .../p1_continuity_constraints_impl.h | 8 +- .../lagrange_dirichlet_boundary.h | 35 +- .../lagrange_dirichlet_boundary_impl.h | 27 +- .../spatial_disc/disc_util/fv1Cut_geom.cpp | 66 +- .../spatial_disc/disc_util/fv1FT_geom.cpp | 60 +- .../spatial_disc/disc_util/fv1_geom.cpp | 29 +- .../spatial_disc/disc_util/fv1_geom.h | 24 +- .../spatial_disc/disc_util/fv1ib_geom.h | 1105 ----------- .../spatial_disc/disc_util/fv1ib_geom_impl.h | 1324 ------------- .../spatial_disc/disc_util/hfv1_geom.cpp | 49 +- .../spatial_disc/disc_util/hfv1_geom.h | 15 +- ugbase/lib_disc/spatial_disc/domain_disc.h | 12 +- .../lib_disc/spatial_disc/domain_disc_impl.h | 18 +- .../spatial_disc/domain_disc_interface.h | 9 +- .../elem_disc/elem_disc_assemble_util.h | 4 +- .../elem_disc/inner_boundary/inner_boundary.h | 6 +- .../inner_boundary/inner_boundary_fv1.cpp | 21 +- .../fv/neumann_boundary_fv.cpp | 6 +- ugbase/lib_disc/spatial_disc/elem_disc/sss.h | 388 ---- .../spatial_disc/immersed_util/Info File 1 | 172 ++ .../spatial_disc/immersed_util/Info File 2 | 0 .../cut_element_handler/Info File 1 | 97 + .../cut_element_handler/Info File 2 | 9 + .../cut_element_handler_FT.h | 0 .../cut_element_handler_FT_impl.h | 973 ---------- .../cut_element_handler_base_impl.h | 55 + .../cut_element_handler_flat_top_impl.h | 956 ++++++++++ .../cut_element_handler_immersed.h | 0 .../cut_element_handler_immersed_impl.h | 288 --- .../cut_element_handler_two_sided_impl.h | 190 ++ .../immersed_util/gmg_transfer/Info File | 0 .../interface_handler/Info File 1 | 49 + .../interface_handler/Info File 2 | 0 .../interface_handler_flat_top_cut/Info File | 0 .../interface_handler_two_sided_cut/Info File | 4 + .../linker/bingham_viscosity_linker.h | 378 ++++ .../time_disc/composite_time_disc_impl.h | 12 +- ugbase/lib_grid/CMakeLists.txt | 3 + .../lib_grid/algorithms/deg_layer_mngr_impl.h | 1 + .../algorithms/element_aspect_ratios.h | 101 +- .../geom_obj_util/anisotropy_util.h | 163 ++ .../geom_obj_util/anisotropy_util_impl.h | 604 ++++++ .../algorithms/geom_obj_util/face_util.cpp | 6 +- .../algorithms/geom_obj_util/face_util.h | 11 +- .../algorithms/geom_obj_util/misc_util.h | 6 + .../geom_obj_util/misc_util_impl.hpp | 19 + .../algorithms/geom_obj_util/volume_util.cpp | 61 +- .../algorithms/geom_obj_util/volume_util.h | 7 + .../grid_generation/tetrahedralization.cpp | 16 - .../grid_generation/tetrahedralization.h | 21 +- .../triangle_fill_sweep_line.cpp | 2 +- .../algorithms/orientation_util_impl.hpp | 2 +- .../remeshing/resolve_intersections.h | 19 +- .../remeshing/resolve_intersections_impl.hpp | 41 +- ugbase/lib_grid/algorithms/selection_util.cpp | 36 +- ugbase/lib_grid/algorithms/selection_util.h | 14 +- .../subdivision/subdivision_volumes.cpp | 600 +++++- .../subdivision/subdivision_volumes.h | 32 +- .../lib_grid/algorithms/volume_calculation.h | 2 + .../algorithms/volume_calculation_impl.hpp | 19 + ugbase/lib_grid/common_attachments.h | 1 + ugbase/lib_grid/file_io/file_io.cpp | 137 +- ugbase/lib_grid/file_io/file_io.h | 56 +- ugbase/lib_grid/file_io/file_io_impl.h | 69 + ugbase/lib_grid/file_io/file_io_swc.cpp | 30 +- ugbase/lib_grid/file_io/file_io_swc.h | 15 +- ugbase/lib_grid/file_io/file_io_ugx.cpp | 2 +- ugbase/lib_grid/file_io/file_io_ugx_impl.hpp | 1 + ugbase/lib_grid/global_attachments.h | 22 +- ugbase/lib_grid/grid/grid.h | 4 +- ugbase/lib_grid/grid/neighborhood_util.cpp | 4 +- ugbase/lib_grid/grid/neighborhood_util.h | 34 +- .../lib_grid/grid/neighborhood_util_impl.hpp | 77 + .../lib_grid/grid_objects/grid_dim_traits.h | 2 +- .../lib_grid/grid_objects/grid_objects_2d.cpp | 25 +- .../lib_grid/grid_objects/grid_objects_3d.h | 2 +- .../parallelization/load_balancer.cpp | 81 +- .../lib_grid/parallelization/load_balancer.h | 1 + .../parallelization/parallelization_util.cpp | 11 +- .../parallelization/parallelization_util.h | 2 +- .../util/compol_copy_attachment.h | 2 + .../parallelization/util/compol_subset.h | 2 +- .../global_fractured_media_refiner.cpp | 14 +- .../refinement/hanging_node_refiner_base.cpp | 12 +- .../hanging_node_refiner_multi_grid.cpp | 53 +- .../hanging_node_refiner_multi_grid.h | 2 + .../elliptic_cylinder_projector.cpp | 335 ++++ .../projectors/elliptic_cylinder_projector.h | 167 ++ .../projectors/neurite_projector.cpp | 1659 +++++++++++++++++ .../refinement/projectors/neurite_projector.h | 455 +++++ .../projectors/projection_handler.cpp | 1 - .../refinement/projectors/projectors.h | 16 +- .../refinement/projectors/soma_projector.h | 268 +++ .../ref_mark_adjusters/mg_hnode_adjuster.cpp | 9 +- .../shadow_copy_adjuster.cpp | 114 ++ .../ref_mark_adjusters/shadow_copy_adjuster.h | 68 + .../hanging_node_refiner_2d_irn.cpp | 2 +- .../lib_grid/tools/copy_attachment_handler.h | 23 +- .../tools/periodic_boundary_manager_impl.hpp | 8 +- ugbase/lib_grid/tools/subset_group.h | 2 +- ugbase/lib_grid/tools/surface_view_impl.hpp | 34 +- ugbase/pcl/parallel_archive.h | 10 +- ugbase/pcl/pcl_process_communicator.cpp | 2 +- ugbase/ug_shell/CMakeLists.txt | 7 + ugbase/ug_shell/completion.cpp | 5 +- 240 files changed, 12056 insertions(+), 5245 deletions(-) rename cmake/modules/{FindBLAS.cmake => deprecated__use_cmake_shipped_version_FindBLAS.cmake} (100%) rename cmake/modules/{FindLAPACK.cmake => deprecated__use_cmake_shipped_version_FindLAPACK.cmake} (100%) create mode 100644 cmake/toolchain/juwels.cmake create mode 100644 cmake/ug/export_linker_flags.cmake rename cmake/ug/{export_single_file_definitions.cmake => export_single_file_compile_flags.cmake} (79%) create mode 100644 docs/ug4/img/readme/Pan-Scheme.png create mode 100644 docs/ug4/img/readme/PanSolution3d-coil_and_pan_v3-lev4.png create mode 100644 docs/ug4/img/readme/elder_adapt.png create mode 100644 docs/ug4/img/readme/navier_stokes.png create mode 100644 docs/ug4/img/readme/poisson.png create mode 100644 docs/ug4/img/readme/promesh.png create mode 100644 docs/ug4/img/readme/springboard.png create mode 100644 docs/ug4/img/readme/vrl_skin2d.png rename scripts/shell/install_scripts/SuperLU/{make.inc_jureca => make.inc_juelich} (60%) create mode 100644 scripts/shell/schedulers/juwels create mode 100644 scripts/shell/schedulers/sdcluster rename scripts/util/{conv_rates_static.lua => conv_rates_immersed.lua} (92%) create mode 100644 ug4.bib create mode 100644 ugbase/lib_disc/operator/linear_operator/subspace_correction/sequential_subspace_correction.h delete mode 100644 ugbase/lib_disc/spatial_disc/disc_util/fv1ib_geom.h delete mode 100644 ugbase/lib_disc/spatial_disc/disc_util/fv1ib_geom_impl.h delete mode 100644 ugbase/lib_disc/spatial_disc/elem_disc/sss.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/Info File 1 create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/Info File 2 create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 1 create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 2 create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT.h delete mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_base_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_flat_top_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed.h delete mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_two_sided_impl.h create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/Info File create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 1 create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 2 create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/Info File create mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/Info File create mode 100644 ugbase/lib_disc/spatial_disc/user_data/linker/bingham_viscosity_linker.h create mode 100644 ugbase/lib_grid/algorithms/geom_obj_util/anisotropy_util.h create mode 100644 ugbase/lib_grid/algorithms/geom_obj_util/anisotropy_util_impl.h create mode 100644 ugbase/lib_grid/file_io/file_io_impl.h create mode 100644 ugbase/lib_grid/grid/neighborhood_util_impl.hpp create mode 100644 ugbase/lib_grid/refinement/projectors/elliptic_cylinder_projector.cpp create mode 100644 ugbase/lib_grid/refinement/projectors/elliptic_cylinder_projector.h create mode 100644 ugbase/lib_grid/refinement/projectors/neurite_projector.cpp create mode 100644 ugbase/lib_grid/refinement/projectors/neurite_projector.h create mode 100644 ugbase/lib_grid/refinement/projectors/soma_projector.h create mode 100644 ugbase/lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.cpp create mode 100644 ugbase/lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.h diff --git a/.gitignore b/.gitignore index d11eda74a..1a4ad3d6f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .project .tags .tags_sorted_by_file -.settings \ No newline at end of file +.settings +/Debug/ diff --git a/.travis.yml b/.travis.yml index ff8b4a9e7..4752b063c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,9 @@ addons: - make - cmake-data - cmake + homebrew: + packages: + - ccache # we compile a c++ project @@ -22,7 +25,6 @@ os: env: global: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then PATH=/usr/lib/ccache:${PATH}; fi - TIMEOUT_BUILD='30m' - BUILD_SUCCESS=true @@ -31,17 +33,28 @@ env: - DIM=2 CPU=1 TARGET=vrl STATIC_BUILD=OFF BUILD_VARIANT="build2" - DIM=ALL CPU=1;2 TARGET=ugshell STATIC_BUILD=ON BUILD_VARIANT="build3" - DIM=ALL CPU=1;2 TARGET=vrl STATIC_BUILD=OFF BUILD_VARIANT="build4" - - + + +before_cache: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew cleanup; fi + cache: ccache: true directories: - - travis_root - #- $HOME/Library/Caches/Homebrew + #- travis_root + - $HOME/.ccache + # - $HOME/Library/Caches/Homebrew # TODO: how can we do conditional caching of directories (depending on OS) #- /home/travis/build/miho/OCC-CSG/oce-OCE-0.18.3 #- /Users/travis/build/miho/ugcore/ +# prepare ccache for (optional) install step +before_install: + # installing ccache and freetype packages via homebrew +# - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ccache; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PATH="/usr/local/opt/ccache/libexec:$PATH"; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export CXXFLAGS="-stdlib=libc++"; fi + # prepare compilation before_script: - mkdir -p travis_root && cd travis_root @@ -83,5 +96,5 @@ script: # ccache fixes global build time of ~ 50 minutes # we still need to use travis_wait to prevent "build error because of no output" # https://docs.travis-ci.com/user/common-build-problems/#Build-times-out-because-no-output-was-received - - travis_wait 45 make -j3 + - travis_wait 45 make -j2 - if [[ "$TARGET" == "ugshell" ]]; then ../bin/ugshell -call "print(\"it works\")"; fi diff --git a/CMakeLists.txt b/CMakeLists.txt index 609ca5ac4..3db96a5bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -122,14 +122,17 @@ if(BUILD_ONE_LIB) get_property(ug4LinkPaths GLOBAL PROPERTY ugLinkPaths) get_property(ug4libIncludes GLOBAL PROPERTY ugIncludes) get_property(ug4libDefinitions GLOBAL PROPERTY ugDefinitions) - get_property(ug4libSingleFileDefinitionsFiles GLOBAL PROPERTY ugSingleFileDefinitionFiles) - get_property(ug4libSingleFileDefinitionsDefs GLOBAL PROPERTY ugSingleFileDefinitionDefs) + get_property(ug4libLinkerFlags GLOBAL PROPERTY ugLinkerFlags) + get_property(ug4libSingleFileCompileFlagsFiles GLOBAL PROPERTY ugSingleFileCompileFlagsFiles) + get_property(ug4libSingleFileCompileFlagsDefs GLOBAL PROPERTY ugSingleFileCompileFlagsDefs) if(buildEmbeddedPlugins) add_definitions(${ug4libDefinitions}) include_directories(${ug4libIncludes}) link_directories(${ug4LinkPaths}) link_libraries(${ug4libDependencies}) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ug4libLinkerFlags}") + set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${ug4libLinkerFlags}") endif(buildEmbeddedPlugins) if(buildDynamicLib) @@ -169,14 +172,14 @@ if(BUILD_ONE_LIB) add_dependencies(${targetLibraryName} updateCompileInfo) # apply single file definitions - list(LENGTH ug4libSingleFileDefinitionsFiles len) + list(LENGTH ug4libSingleFileCompileFlagsFiles len) if (${len} GREATER 0) math(EXPR len "${len} - 1") foreach (idx RANGE ${len}) - list(GET ug4libSingleFileDefinitionsFiles ${idx} file) - list(GET ug4libSingleFileDefinitionsDefs ${idx} defs) - set_property(SOURCE ${file} APPEND PROPERTY COMPILE_DEFINITIONS "${defs}") - #message("${file}: ${defs}") + list(GET ug4libSingleFileCompileFlagsFiles ${idx} file) + list(GET ug4libSingleFileCompileFlagsDefs ${idx} flags) + set_property(SOURCE ${file} APPEND PROPERTY COMPILE_FLAGS "${flags}") + #message("${file}: ${flags}") endforeach() endif() endif(buildEmbeddedPlugins) diff --git a/README.md b/README.md index 07a22aefc..4b3d0da65 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,198 @@ [![Code Climate](https://codeclimate.com/github/UG4/ugcore/badges/gpa.svg)](https://codeclimate.com/github/UG4/ugcore) [![Issue Count](https://codeclimate.com/github/UG4/ugcore/badges/issue_count.svg)](https://codeclimate.com/github/UG4/ugcore) -core functionality of **UG4**. Includes sources, build-scripts, -and utility-scripts +This repository contains the core functionality of **UG4**. Includes sources, build-scripts, and utility-scripts -Copyright 2009-2015 Goethe Center for Scientific Computing, University Frankfurt +Copyright 2009-2018 Goethe Center for Scientific Computing, Goethe-University Frankfurt am Main -Please install/clone this repository through UG4's package manager -[ughub](https://github.com/UG4/ughub). +Please install/clone this repository through *UG4's* package manager +[*ughub*](https://github.com/UG4/ughub). + +# + +# Introduction to UG4 + +*UG4* is an extensive, flexible, cross-platform open source simulation framework for the numerical solution of systems of partial differential equations. Using *Finite Element* and *Finite Volume* methods on hybrid, adaptive, unstructured multigrid hierarchies, *UG4* allows for the simulation of complex real world models (physical, biological etc.) on massively parallel computer architectures. + +*UG4* is implemented in the *C++* programming language and provides grid management, discretization and (linear as well as non-linear) solver utilities. It is extensible and customizable via its plugin mechanism. The highly scalable *MPI* based parallelization of *UG4* has been shown to scale to hundred thousands of cores. + +Simulation workflows are defined either using the *Lua* scripting language or the graphical VRL interface [https://vrl-studio.mihosoft.eu/](https://vrl-studio.mihosoft.eu/). Besides that, UG4 can be used as a library for third-party code. + +Several examples are provided in the *Examples* application that can be used for simulations of the corresponding phenomena but also serve as demonstration modules for implementing user-defined plugins and scripts. By developing custom plugins, users can extend the functionality of the framework for their particular purposes. The framework provides coupling facilities for the models implemented in different plugins. + +The source code is commented using the Doxygen markup language. + +*UG4* is licensed under the *LGPL v3* license with amendments. Please have a look at the accompanying *LICENSE* file. + +## Preparation of Data and Visualization of Results + +The `.ugx` grids provided in the *Examples* applications can be created, visualized, and edited with *ProMesh*, a versatile graphical meshing solution for the generation, visualization, and preparation of computational domains for scientific computing on structured and unstructured grids. It allows users to process complicated geometries with curved boundaries and low-dimensional manifolds. *ProMesh* is based on *UG4's* grid manager and is available at http://www.promesh3d.com + +![promesh](docs/ug4/img/readme/promesh.png "ProMesh") + +The computational domain, the underlying grid, the boundary and initial conditions, as well as the problem coefficients can be specified as part of the simulation workflow in *Lua* scripts or the *VRL-Studio* GUI. However, for performance reasons, if the evaluation of the spatial and time dependence of the certain parameters is numerically expensive, one can implement those in C+\+, too, e.g. in a custom plugin. + +Intermediate and final results of a simulation can be written to *VTK's* `.vtu` file format. These can be visualized using a number of free and open-source toolkits, e.g. *ParaView* [http://www.paraview.org](http://www.paraview.org) and *VisIt* [https://wci.llnl.gov/simulation/computer-codes/visit/](https://wci.llnl.gov/simulation/computer-codes/visit/). + +## Setup and Compilation: + +For the following guide, we assume the compilation is performed on a Linux/Unix machine using a standard Bash terminal. Please note that Microsoft Windows features such an environment through the free 'Ubuntu' app in the Microsoft Windows Store. If a native Windows executable is required, Visual Studio compilers can also be used. + +**Requirements:** + +- C++ Compiler (tested with GCC on Linux, Clang on macOS and MSVC 2017 on Windows) +- CMake >= 2.8 +- ughub (https://github.com/UG4/ughub) +- git +- python + +For a detailed list on required software and corresponding installation instructions, please visit https://github.com/UG4/ughub + +Please start by creating a *UG4* root directory, e.g. `$HOME/ug4`. In your `ug4` directory please run the following commands to obtain all required sources: + + ughub init + ughub install Examples + +This will clone *ugcore*, the *Examples* app and all required plugins. + +Starting from *UG4's* root directory, please execute the following to build *UG4*: + + mkdir build + cd build + cmake -DENABLE_ALL_PLUGINS=ON -DDIM="2;3" -DCPU="1;2" -DCMAKE_BUILD_TYPE=Release .. + make -j + cd .. + + +## Running Examples: +Starting from *UG4's* root directory, please execute the following: + + source ugcore/scripts/shell/ugbash + mkdir runs + cd runs + ugshell -ex Examples/poisson.lua + ugshell -ex Examples/poisson.lua -dim 3 + ugshell -ex Examples/solmech.lua + ugshell -ex Examples/elder_adapt.lua + ugshell -ex Examples/navier_stokes.lua + ugshell -ex Examples/electromagnetism_pan.lua -numRefs 3 + +## Examples: + +Please make sure that you installed *UG4's* *Examples* application as described above. + +### Poisson Problem +A script computing the solution of the *Poisson* problem is given in `apps/Examples/poisson.lua`. The right hand side of the differential equation can be specified through a callback method in the *Lua* script. +A projector is used during grid refinement to approximate a circle with additional refinements. + +![poisson](docs/ug4/img/readme/poisson.png "poisson") + +### Linear Elasticity +A 3d simulation of deformation using *linear elasticity* is provided in `apps/Examples/solmech.lua`. + +![springboard](docs/ug4/img/readme/springboard.png "springboard") + +### Density Driven Flow +An adaptive simulation of the *Elder* problem is provided in `apps/Examples/elder_adapt.lua`. A gradient based error indicator is used to refine areas of interest. + +![elder adaptive](docs/ug4/img/readme/elder_adapt.png "elder adaptive") + +### Navier Stokes +Simulations of fluid flow in a channel with a cylindrical cutout are performed in `apps/Examples/navier_stokes.lua`. + +![navier_stokes](docs/ug4/img/readme/navier_stokes.png "navier_stokes") + +### Electromagnetism (induction heating) +Simulation of the eddy currents and the corresponding heat sources induced by alternating electromagnetic field in a conductive plate is represented in `apps/Examlpes/electromagnetism_pan.lua`. The stationary E-based formulation of the eddy current model for the complex-valued fields is used. The discretization of the Maxwell equations is done by the Nedelec elements on a tetrahedral grid. This example demonstrates in particular the projection of the refined elements to the curved boundaries in 3d. + +![heat](docs/ug4/img/readme/PanSolution3d-coil_and_pan_v3-lev4.png "pan_solution") + +## UG4 for VRL-Studio: + +VRL-Studio is an innovative and powerful IDE for rapid prototyping, learning, teaching and experimentation. It introduces *Visual Reflection* for automatic user interface generation. It combines textual and visual programming in an intuitive user interface. *UG4* provides a built-in VRL binding that allows to setup and execute visual simulation workflows from VRL-Studio. The supplementary VRL-Studio folder contains a precompiled version of VRL-Studio which includes *UG4* and a sample project to briefly demonstrate UG4s capabilities as VRL-Studio plugin. + +Download Links for supplementary software folder: + +- **Linux x64:** [http://vrl-studio.mihosoft.eu/releases/vrl-studio-ug4-release-2018/vrl-ug4-linux.zip](http://vrl-studio.mihosoft.eu/releases/vrl-studio-ug4-release-2018/vrl-ug4-linux.zip) +- **Windows x64:** [http://vrl-studio.mihosoft.eu/releases/vrl-studio-ug4-release-2018/vrl-ug4-windows.zip](http://vrl-studio.mihosoft.eu/releases/vrl-studio-ug4-release-2018/vrl-ug4-windows.zip) +- **macOS x64:** [http://vrl-studio.mihosoft.eu/releases/vrl-studio-ug4-release-2018/vrl-ug4-macos.zip](http://vrl-studio.mihosoft.eu/releases/vrl-studio-ug4-release-2018/vrl-ug4-macos.zip) + +### Opening the Sample Project: + +The supplementary software folder contains a version of VRL-Studio that includes a precompiled version of *UG4* and additional plugins for visualization. + +**Running VRL-Studio on Linux:** + +To run VRL-Studio from the supplementary software folder, execute the following commands: + +``` +cd path/to/VRL-Studio-For-UG4 +./run.sh +``` + +**Running VRL-Studio on macOS:** + +For macOS, VRL-Studio is provided as application bundle. Simply double-click the application bundle to run VRL-Studio. + +**Running VRL-Studio on Windows:** + +For Windows, VRL-Studio is provided as application bundle. Just run the VRL-Studio.exe file inside the VRL-Studio folder. + +If VRL-Studio runs for the first time, it will install several plugins (e.g. the *UG4* plugin) before showing the main user interface. + +To open the sample project, click on `File->Load Project` and navigate to the sample project (`skin-2d.vrlp`). + +Now do the following: + +1. Select the desired output file (for this example `vtk-output/skin-2d.vtu`). +2. Select the desired geometry (for this example `skin-2d.ugx`). +3. Press `Start` to run the simulation. +4. Check the log window for simulation progress (click on `View->Show Log in Window` or drag up the divider at the bottom of the VRL-Studio main window to reveal the log). +5. The `vtk-output/` folder contains the simulation output that can be post-processed with a VTK viewer such as ParaView. + +![vrl-skin2d](docs/ug4/img/readme/vrl_skin2d.png "UG4 as VRL-Studio Plugin") + +### Compiling UG4 for VRL-Studio: + +The following steps explain how to manually compile *UG4* for VRL-Studio. + +In addition to the aforementioned requirements, compilation for VRL-Studio requires Java (JDK >= 1.8). Additionally, VRL-Studio needs to run at least once to make sure the required folder structure is created. + +To build *UG4* as shared library for VRL-Studio, different CMake options have to be used. The following commands build *UG4* for VRL-Studio: + +``` +cd path/to/ug4 +mkdir build_vrl && cd build_vrl +cmake .. -DTARGET=vrl -DLAPACK=OFF -DBLAS=OFF -DDIM=ALL -DCPU="1;2" -DCOMPILE_INFO=OFF -DEMBEDDED_PLUGINS=ON -DSTATIC_BUILD=OFF +make -j +``` + +After successful compilation, the shared library libug4.so (libug4.dylib on macOS and ug4.dll on Windows) needs to be copied to the VRL plugin folder. For VRL-Studio installed from the supplementary software folder, the following command can be used to copy the shared library to the correct plugin folder: + +``` +cp path/to/libug4.so $HOME/.vrl/0.4.3/default-ug4/plugins/VRL-UG/natives/linux/x64/ +``` + +After restarting VRL-Studio, the new library is used. + +## Further Documentation: + +Installation instructions are given at https://github.com/UG4/ughub + +Further documentation on *UG4* is available at http://ug4.github.io/docs/ + +Please have a look at http://ug4.github.io/docs/page_external_libraries.html for more information on used libraries and their licenses. + +## Related Articles: +``` + Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. + A massively parallel geometric multigrid solver on hierarchically distributed grids. + Computing and visualization in science 16, 4 (2013), 151-164, + DOI: 10.1007/s00791-014-0231-x + + Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. + UG4 -- a novel flexible software system for simulating pde based models on high performance computers. + Computing and visualization in science 16, 4 (2013), 165-179, + DOI: 10.1007/s00791-014-0232-9 +``` +(Cf. the bib-file in the ugcore directory.) diff --git a/appveyor.yml b/appveyor.yml index 1937f7afd..6878e6141 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -58,7 +58,7 @@ environment: cache: #- %APPVEYOR_BUILD_FOLDER% - - appveyor_root/ug4/ + #- appveyor_root/ug4/ install: - if not exist appveyor_root mkdir appveyor_root && echo "appveyor root does not exist" @@ -99,6 +99,8 @@ build_script: - cd %APPVEYOR_BUILD_FOLDER%\appveyor_root\ug4 - dir - if not exist %BUILD_VARIANT% mkdir %BUILD_VARIANT% +# - rm -rf %BUILD_VARIANT%/ +# - mkdir %BUILD_VARIANT% - cd %BUILD_VARIANT% && cmake ..\ -DCMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE=X64 -G "%generator%" -DTARGET="%TARGET%" -DLAPACK=OFF -DBLAS=OFF -DDIM="%DIM%" -DCPU="%CPU%" -DCOMPILE_INFO=OFF -DEMBEDDED_PLUGINS=ON -DSTATIC_BUILD="%STATIC_BUILD%" - MSBuild .\ug4.sln /property:Configuration=Release /property:Platform=x64 - cd ..\bin diff --git a/cmake/modules/FindBLAS.cmake b/cmake/modules/deprecated__use_cmake_shipped_version_FindBLAS.cmake similarity index 100% rename from cmake/modules/FindBLAS.cmake rename to cmake/modules/deprecated__use_cmake_shipped_version_FindBLAS.cmake diff --git a/cmake/modules/FindLAPACK.cmake b/cmake/modules/deprecated__use_cmake_shipped_version_FindLAPACK.cmake similarity index 100% rename from cmake/modules/FindLAPACK.cmake rename to cmake/modules/deprecated__use_cmake_shipped_version_FindLAPACK.cmake diff --git a/cmake/toolchain/juwels.cmake b/cmake/toolchain/juwels.cmake new file mode 100644 index 000000000..88627b34c --- /dev/null +++ b/cmake/toolchain/juwels.cmake @@ -0,0 +1,62 @@ +################################################################################ +# created by Markus Breit +# markus.breit@gcsc.uni-frankfurt.de +# adapted from corresponding JuQueen file created by Ingo Heppner +# +# Toolchain file for JUWELS (type Dual Intel Xeon Skylake 8168) FZ Juelich. +# +# This toolchain file is included in a CMake run by (check with 'cmake --trace') +# 'Modules/CMakeDetermineSystem.cmake', and (later again) by the - generated - +# file '/CMakeFiles/CMakeSystem.cmake'. +# (Subdirectory 'Modules/' is part of your CMake installation, on JURECA's login +# nodes: '/usr/local/software/jureca/Stage3/software/Core/CMake/3.2.3/share/cmake-3.2/Modules'). +# +# Appropriate platform files for the "CMake system name" and compilers chosen +# here are called later (by 'Modules/CMakeSystemSpecificInformation.cmake'): +# +# I.e., for "BlueGeneQ-static" as "CMake system name" the platform file +# 'Modules/Platform/BlueGeneQ-static.cmake' is included first, which includes +# 'Modules/Platform/BlueGeneQ-base.cmake'. Afterwards CMake calls +# 'Modules/Platform/BlueGeneQ-static-GNU-C.cmake' and +# 'Modules/Platform/BlueGeneQ-static-GNU-CXX.cmake' +# if GNU compilers are chosen (by 'Modules/CMakeCInformation.cmake' and +# 'Modules/CMakeCXXInformation.cmake' respectively). +# +################################################################################ + +# Important: Setting the "cmake system name" will lead to automatic inclusion of +# the corresponding platform files: +set(CMAKE_SYSTEM_NAME Linux) +#list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/ugcore/cmake/modules") + +# This option tells cmake/ug_includes.cmake to add the -dynamic option to the compiler flags. +SET(enableDynamicOption OFF) + +# This option tells cmake/ug_includes.cmake to add the -fno-strict-aliasing option to the compiler flags. +SET(enableNoStrictAliasingOption ON) + +# Some variables for paths +set(GCC_ROOT "/gpfs/software/juwels/stages/2018b/software/icc/2019.0.117-GCC-7.3.0/compilers_and_libraries_2019.0.117/linux/") +set(MPI_ROOT "/gpfs/software/juwels/stages/2018b/software/psmpi/5.2.1-1-iccifort-2019.0.117-GCC-7.3.0/") +set(FTR_ROOT "/gpfs/software/juwels/stages/2018b/software/ifort/2019.0.117-GCC-7.3.0/compilers_and_libraries_2019.0.117/linux/") + +# The serial GNU compilers +set(CMAKE_C_COMPILER ${GCC_ROOT}/bin/intel64/icc) +set(CMAKE_CXX_COMPILER ${GCC_ROOT}/bin/intel64/icpc) +set(CMAKE_Fortran_COMPILER ${FTR_ROOT}/bin/intel64/ifort) + +# The MPI wrappers for the GNU compilers +set(MPI_C_COMPILER ${MPI_ROOT}/bin/mpicc) +set(MPI_CXX_COMPILER ${MPI_ROOT}/bin/mpicxx) +set(MPI_Fortran_COMPILER ${MPI_ROOT}/bin/mpif90) + +#message(STATUS "TMP INFO: Value of '\${CMAKE_C_COMPILER}' is: ${CMAKE_C_COMPILER}") # TMP +#message(STATUS "TMP INFO: Value of '\${CMAKE_CXX_COMPILER}' is: ${CMAKE_CXX_COMPILER}") # TMP +#message(STATUS "TMP INFO: Value of '\${CMAKE_Fortran_COMPILER}' is: ${CMAKE_Fortran_COMPILER}") # TMP + +message(STATUS "TMP INFO: Value of '\${MPI_C_COMPILER}' is: ${MPI_C_COMPILER}") # TMP +message(STATUS "TMP INFO: Value of '\${MPI_CXX_COMPILER}' is: ${MPI_CXX_COMPILER}") # TMP +message(STATUS "TMP INFO: Value of '\${MPI_Fortran_COMPILER}' is: ${MPI_Fortran_COMPILER}") # TMP + +# For debugging purposes +#include(CMakePrintSystemInformation) diff --git a/cmake/ug/export_linker_flags.cmake b/cmake/ug/export_linker_flags.cmake new file mode 100644 index 000000000..43adcdff1 --- /dev/null +++ b/cmake/ug/export_linker_flags.cmake @@ -0,0 +1,49 @@ +# Copyright (c) 2013: G-CSC, Goethe University Frankfurt +# Author: Stephan Grein +# +# This file is part of UG4. +# +# UG4 is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License version 3 (as published by the +# Free Software Foundation) with the following additional attribution +# requirements (according to LGPL/GPL v3 §7): +# +# (1) The following notice must be displayed in the Appropriate Legal Notices +# of covered and combined works: "Based on UG4 (www.ug4.org/license)". +# +# (2) The following notice must be displayed at a prominent place in the +# terminal output of covered works: "Based on UG4 (www.ug4.org/license)". +# +# (3) The following bibliography is recommended for citation and must be +# preserved in all covered files: +# "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively +# parallel geometric multigrid solver on hierarchically distributed grids. +# Computing and visualization in science 16, 4 (2013), 151-164" +# "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel +# flexible software system for simulating pde based models on high performance +# computers. Computing and visualization in science 16, 4 (2013), 165-179" +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +################################################################################ +# Declare a method that allows all sub-cmake-files to add their own linker flags +# to the main project (P_UG4) defines +####################### +# Export flags to global variable. +# PURPOSE: use this function to add local project linker flags to global +# ug4LibLinkerFlags property which is used to build libug4 project +# @param flags list of linker flags to be exported +function(ExportLinkerFlags flags) + # iterate over all arguments and insert given prefix + foreach(flag ${ARGV}) + # retrieve the global property ugLinkerFlags and store its values + # in a temp variable + # NOTE: properties must be assigned to variables before being used + get_property(temp GLOBAL PROPERTY ugLinkerFlags) + # append tmp to the global ugDependencies property using the correct prefix + set_property(GLOBAL PROPERTY ugLinkerFlags "${temp} ${flag}") + endforeach(flag) +endfunction(ExportLinkerFlags) diff --git a/cmake/ug/export_single_file_definitions.cmake b/cmake/ug/export_single_file_compile_flags.cmake similarity index 79% rename from cmake/ug/export_single_file_definitions.cmake rename to cmake/ug/export_single_file_compile_flags.cmake index 7964c6746..5d63978f3 100644 --- a/cmake/ug/export_single_file_definitions.cmake +++ b/cmake/ug/export_single_file_compile_flags.cmake @@ -35,26 +35,26 @@ # USAGE # variant 1: -# exportSingleFileDefinitions(file "def1;def2;def3;...") +# exportSingleFileCompileFlags(file "def1;def2;def3;...") # # variant 2: # set(defList def1 def2 def3 ...) -# exportSingleFileDefinitions(file "${defList}") +# exportSingleFileCompileFlags(file "${defList}") +# +# example: exportSingleFileCompileFlags(cpp11_feature.cpp "-std=c++11;-DSOME_PREPROCESSOR_FLAG") # # file must be a valid file, prepended by its path, typically ${CMAKE_CURRENT_SOURCE_DIR}; -# definitions for preprocessor need to be exactly like used in preprocessor macros, i.e., -# SOME_MACRO, and not -DSOME_MACRO. - +# # @param file the file definitions are to be exported for # @param definitions a list of definitions to be exported -function(exportSingleFileDefinitions file definitions) - list(LENGTH definitions len) +function(exportSingleFileCompileFlags file flags) + list(LENGTH flags len) if (${len} GREATER 0) math(EXPR len "${len} - 1") foreach (idx RANGE ${len}) - list(GET definitions ${idx} def) - set_property(GLOBAL APPEND PROPERTY ugSingleFileDefinitionFiles ${file}) - set_property(GLOBAL APPEND PROPERTY ugSingleFileDefinitionDefs "${def}") + list(GET flags ${idx} flag) + set_property(GLOBAL APPEND PROPERTY ugSingleFileCompileFlagsFiles ${file}) + set_property(GLOBAL APPEND PROPERTY ugSingleFileCompileFlagsDefs "${flag}") endforeach() endif() -endfunction(exportSingleFileDefinitions) +endfunction(exportSingleFileCompileFlags) diff --git a/cmake/ug/lapack_blas.cmake b/cmake/ug/lapack_blas.cmake index d6a546380..9ba4310aa 100644 --- a/cmake/ug/lapack_blas.cmake +++ b/cmake/ug/lapack_blas.cmake @@ -40,6 +40,10 @@ # Please mail martin.rupp@gcsc.uni-frankfurt.de if you have problems setting up # OR if you solved your problem. +if(STATIC_BUILD) + set(BLA_STATIC ON) +endif() + # If LAPACK is enabled, try to find the library if(LAPACK) # try find using cmake-native find_package (requires fortran) @@ -60,16 +64,16 @@ if(LAPACK) include_directories (${USER_LAPACK_INCLUDE_DIR}) set(linkLibraries ${linkLibraries} ${USER_LAPACK_LIBRARIES}) add_definitions(-DLAPACK_AVAILABLE) - # b) Lapack has been found + # b) Using build-in LAPACK (i.e. nothing needed, added by e.g. compiler) + elseif(BUILTIN_LAPACK) + message(STATUS "Info: Using Builtin LAPACK") + add_definitions(-DLAPACK_AVAILABLE) + # c) Lapack has been found elseif(LAPACK_FOUND) message(STATUS "Info: Using LAPACK (Include: ${LAPACK_INCLUDE_DIR}, Lib: ${LAPACK_LIBRARIES})") include_directories (${LAPACK_INCLUDE_DIR}) set(linkLibraries ${linkLibraries} ${LAPACK_LIBRARIES}) add_definitions(-DLAPACK_AVAILABLE) - # c) Using build-in LAPACK (i.e. nothing needed, added by e.g. compiler) - elseif(BUILTIN_LAPACK) - message(STATUS "Info: Using Builtin LAPACK") - add_definitions(-DLAPACK_AVAILABLE) # d) Not found else() message(STATUS "WARNING: No LAPACK package found. Not using LAPACK.") @@ -108,16 +112,16 @@ if(BLAS) include_directories (${USER_BLAS_INCLUDE_DIR}) set(linkLibraries ${linkLibraries} ${USER_BLAS_LIBRARIES}) add_definitions(-DBLAS_AVAILABLE) - # b) Blas has been found + # b) Using build-in BLAS (i.e. nothing needed, added by e.g. compiler) + elseif(BUILTIN_BLAS) + message(STATUS "Info: Using Builtin BLAS") + add_definitions(-DBLAS_AVAILABLE) + # c) Blas has been found elseif(BLAS_FOUND) message(STATUS "Info: Using BLAS (Include: ${BLAS_INCLUDE_DIR}, Lib: ${BLAS_LIBRARIES})") include_directories (${BLAS_INCLUDE_DIR}) set(linkLibraries ${linkLibraries} ${BLAS_LIBRARIES}) add_definitions(-DBLAS_AVAILABLE) - # c) Using build-in BLAS (i.e. nothing needed, added by e.g. compiler) - elseif(BUILTIN_BLAS) - message(STATUS "Info: Using Builtin BLAS") - add_definitions(-DBLAS_AVAILABLE) # d) Not found else() message(STATUS "WARNING: No BLAS package found. Not using BLAS.") diff --git a/cmake/ug_includes.cmake b/cmake/ug_includes.cmake index b70e3d626..a759b3733 100644 --- a/cmake/ug_includes.cmake +++ b/cmake/ug_includes.cmake @@ -381,6 +381,7 @@ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") add_cxx_flag(-Wno-unused-local-typedef) add_cxx_flag(-Wno-unknown-warning-option) add_cxx_flag(-Wno-undefined-var-template) + add_cxx_flag(-Wno-unneeded-internal-declaration) #set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -Wno-overloaded-virtual -Wno-autological-compare" CACHE STRING "overriden flags!" FORCE) endif() @@ -464,7 +465,9 @@ include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) ######################################## # dynamic linking if(UNIX) - set(linkLibraries ${linkLibraries} dl) + if(NOT STATIC_BUILD) + set(linkLibraries ${linkLibraries} dl) + endif(NOT STATIC_BUILD) # for cekon pthread bug # set(linkLibraries ${linkLibraries} pthread) elseif(WIN32) @@ -579,10 +582,15 @@ include(${UG_ROOT_CMAKE_PATH}/ug/export_includes.cmake) # to the main project P_UG4 include(${UG_ROOT_CMAKE_PATH}/ug/export_definitions.cmake) +################################################################################ +# Declare a method that allows all sub-cmake-files to add their linker flags to +# to the main project P_UG4 +include(${UG_ROOT_CMAKE_PATH}/ug/export_linker_flags.cmake) + ################################################################################ # Declare a method that allows all sub-cmake-files to add definitions for # specific files to the main project P_UG4 -include(${UG_ROOT_CMAKE_PATH}/ug/export_single_file_definitions.cmake) +include(${UG_ROOT_CMAKE_PATH}/ug/export_single_file_compile_flags.cmake) ###################################################################################################################### # the following options are pseudo cmake-options (normal options only support ON and OFF). diff --git a/docs/ug4/additional_pages/development/tips_guides/install_eclipse.doxygen b/docs/ug4/additional_pages/development/tips_guides/install_eclipse.doxygen index 2a59a276b..2ebac58ee 100644 --- a/docs/ug4/additional_pages/development/tips_guides/install_eclipse.doxygen +++ b/docs/ug4/additional_pages/development/tips_guides/install_eclipse.doxygen @@ -60,10 +60,10 @@ The page is an install guide for the usage of Eclipse for ug.
\section secUG4AndEclipse Generating Eclipse Project-Files In order work with UG4 in Eclipse, please download and install UG4 as usual through -UG4's package-manager (see https://github.com/UG4/ughub/wiki). +UG4's package-manager (see https://github.com/UG4/ughub). You'll find detailed instructions on how to generate and import UG4 project-files -for Eclipse here: https://github.com/UG4/ughub/wiki#importing-ug4-into-your-ide +for Eclipse here: https://github.com/UG4/ughub#importing-ug4-into-your-ide
diff --git a/docs/ug4/additional_pages/introduction.doxygen b/docs/ug4/additional_pages/introduction.doxygen index d06dfb85d..eb1c09663 100644 --- a/docs/ug4/additional_pages/introduction.doxygen +++ b/docs/ug4/additional_pages/introduction.doxygen @@ -44,7 +44,12 @@ Scientific Computing at the University of Frankfurt, Germany (http://www.g-csc.de). -Features are: +https://github.com/UG4/ugcore gives a quick overview on how to obtain and to install +\ug4. Several example applications are described and tools for pre- and +postprocessing are linked. + + +Features of \ug4 are: - Fast and efficient numerical solvers for serial and parallel environments. - A flexible discretization module, allowing to freely couple equations, input @@ -96,9 +101,8 @@ Features are: - \ug4 is a cross-platform tool and supports \em Linux, \em MacOSX and Microsoft Windows. - - -Take a look at the current release for more information: -\ref pageUG4Releases - */ + +// Removed the 'releases page' from the Overview for a lack of meaningful releases: +//Take a look at the current release for more information: +//\ref pageUG4Releases diff --git a/docs/ug4/additional_pages/main_page.doxygen b/docs/ug4/additional_pages/main_page.doxygen index df05b4791..012ea1517 100644 --- a/docs/ug4/additional_pages/main_page.doxygen +++ b/docs/ug4/additional_pages/main_page.doxygen @@ -44,6 +44,11 @@ Scientific Computing at the University of Frankfurt, Germany (http://www.g-csc.de). +https://github.com/UG4/ugcore gives a quick overview on how to obtain and to install +\ug4. Several example applications are described and tools for pre- and +postprocessing are linked. + +
\section secWhatIsIt What is ug4? diff --git a/docs/ug4/additional_pages/setup/buildug.doxygen b/docs/ug4/additional_pages/setup/buildug.doxygen index 055caf1cb..f4fabcb17 100644 --- a/docs/ug4/additional_pages/setup/buildug.doxygen +++ b/docs/ug4/additional_pages/setup/buildug.doxygen @@ -40,7 +40,7 @@ for your system. Beginners might also want to have a look at \ref pageShellAndLi
\section secBuildUG4Checkout Checkout ug4 -Please follow the description at https://github.com/UG4/ughub/wiki to obtain a copy of UG4. +Please follow the description at https://github.com/UG4/ughub to obtain a copy of UG4.
\section secBuildUG4BashTools Bash Tools diff --git a/docs/ug4/additional_pages/setup/install/install.doxygen b/docs/ug4/additional_pages/setup/install/install.doxygen index 3e6c27ee8..0aa985b9c 100644 --- a/docs/ug4/additional_pages/setup/install/install.doxygen +++ b/docs/ug4/additional_pages/setup/install/install.doxygen @@ -35,7 +35,7 @@ \note Because of the great variety of systems, this installation guides may be outdated quickly. So if this guide is not working for you \em please open an issue on github.com/UG4/docs - Additionally to the pages below, please have a look at https://github.com/UG4/ughub/wiki. + Additionally to the pages below, please have a look at https://github.com/UG4/ughub. Installation and usage of UG4's package manager is detailed there. - \subpage pageAdditionalSoftware "OS-independent (old)" diff --git a/docs/ug4/additional_pages/setup/install/ug4_on_linux.doxygen b/docs/ug4/additional_pages/setup/install/ug4_on_linux.doxygen index 8f95b9081..3a48233b5 100644 --- a/docs/ug4/additional_pages/setup/install/ug4_on_linux.doxygen +++ b/docs/ug4/additional_pages/setup/install/ug4_on_linux.doxygen @@ -39,7 +39,7 @@ from your cluster management tool (e.g. module load).
\section secInstallUg Installation of UG4 -Please follow the description at https://github.com/UG4/ughub/wiki to obtain a +Please follow the description at https://github.com/UG4/ughub to obtain a copy of \ug4. Below you'll find hints on how to obtain additional software which is required to build \ug4. diff --git a/docs/ug4/additional_pages/setup/install/ug4_on_mac.doxygen b/docs/ug4/additional_pages/setup/install/ug4_on_mac.doxygen index d6f2fbb17..9bff40177 100644 --- a/docs/ug4/additional_pages/setup/install/ug4_on_mac.doxygen +++ b/docs/ug4/additional_pages/setup/install/ug4_on_mac.doxygen @@ -50,7 +50,7 @@ The \em terminal is located in Programs -> utilities (Dienstprogramme) -> Te
\section secInstallUg Installation of UG4 -Please follow the description at https://github.com/UG4/ughub/wiki to obtain a +Please follow the description at https://github.com/UG4/ughub to obtain a copy of \ug4. Below you'll find hints on how to obtain additional software which is required to build \ug4. diff --git a/docs/ug4/additional_pages/setup/install/ug4_on_windows.doxygen b/docs/ug4/additional_pages/setup/install/ug4_on_windows.doxygen index 5b05085f1..694faaaec 100644 --- a/docs/ug4/additional_pages/setup/install/ug4_on_windows.doxygen +++ b/docs/ug4/additional_pages/setup/install/ug4_on_windows.doxygen @@ -36,7 +36,7 @@
\section secInstallUg Installation of UG4 -Please follow the description at https://github.com/UG4/ughub/wiki to obtain a +Please follow the description at https://github.com/UG4/ughub to obtain a copy of \ug4. Below you'll find hints on how to obtain additional software which is required to build \ug4. diff --git a/docs/ug4/additional_pages/usage/usage.doxygen b/docs/ug4/additional_pages/usage/usage.doxygen index e0eaa5a9d..0477898d4 100644 --- a/docs/ug4/additional_pages/usage/usage.doxygen +++ b/docs/ug4/additional_pages/usage/usage.doxygen @@ -47,7 +47,7 @@ As well some tutorials targeting special features of \ug4 are available. - \ref pageugsubmit - \ref pageParallelRendering - \ug4 and \em VRL -- ug4-Scripting Reference Documentation +- ug4-Scripting Reference Documentation - \subpage pageLuaScript - \subpage pageBashTools - \subpage pageLUA2C diff --git a/docs/ug4/img/readme/Pan-Scheme.png b/docs/ug4/img/readme/Pan-Scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..292313ef4122d4fdde3682d43f4b718a5b7cc734 GIT binary patch literal 18687 zcmX6@cRbYpA3sX!>^LE^*V!{8+ade7L-xwd9%V}rhwQ!2I%h>B%FN#6gp4w>mA(0W ze1Cu3<8klxdcR(;_v`%{&-W)vS6h_?Oa}&mKqODql=VQMTMt1X{EoZ$K#%0vvmp@Z zfsCV)lI~L_B_>@@H#^4{&p{xg@cL&2h>4MgyuU~MU%X$we5v;G>0|JKo`%Mow{N-f z@$azYt3|2Zqh?`YVn#7BGtuOu(HI&owPt~}zsKjTQh&dC&1ZSpt$OXuHc}oB=LED8 zfqGaZSy*l>kjXn3c^5U8;kA}$Ny{D4w&Bw=;rlQtmMFv4e$E)bzW#KP4jT29=J?3B z*}8fzK=h{Cf{FmtOWiHo0#DYZu^<3h$wx)T+yOP>e`oB1skYJhkaZ6x{KL1p@P0^m z(XH`w%AT+gF8$>FQG}o!AxM=iiS-tU>E1W*DpPupa`MCG`c&WB%T-_uGh8} zAPJP^qxI3ze=f7PY&`Np5-9)uwLQDwOVT7gd3ZfPpxsUjFJw{dy>~sZbdsmxpf+gX zCD@TdLtPtS^0>l1XjMbJ_N|HQXIGWCTWiFBUQ1kdWYb?+t_$YPiHCf6A5s)``L`zC zMY*nBJmQ$}R8{$>)Kx(#+a0={`CP(o&P#O6b)uJSEe5lze}Tt`B4HZbTE#WpW4Su0qt8g1*{O??&&jR4vZypPhhO55)X47Fcc>QkVpB!A%x0|4C>8e>d zSpM~?^;Pb^z=qs?Oxpw3Yjo1}flD=ie{|;62=O)4&Auow=OXOl%;J&@p3I_7@H})} zWj$XMB!_}@-Luv0=kiIGRew-SaO~Jt9@zY`U(R_pm2qZ~(S#~Df1Uoso=i66Z=2t{ ztTT(9wUL>3)NZ_2&5GpP4;Y(WvI0rI8reR& z{`lg&Vqq=o^1VQq(YxycI44NgB_c}ydKBL>%Q@g4Xnun+Q%&Xt_Jhvnccq=m-B%?p zUnoQG+?FRa;UfG+peRo-YY)o@*M&Y3yhGh~M*{!xhX=CT@>6$M73kIQ9hr!h!vfvG zRBwcJ@9~G-8O3)E^&KTRYrFOD?vpzrmehl9$Sm(&fSk#1TQT47yzL<$7=M?IfLn1R zp4683nZi;0!(|czc`IGw4{ z`wc>sj>RQ@M=ivbO_(6#4X?5R)58Rp-r!{#PwK`0?fda{%- zsW7ODnX;McVScx+7lwU;BlGPa6^#P1u|E!m-XJN`oN#_+3waBrV>Dyo>X@7$4Ka@j zabbkex6f8#g6Bf2g7!jM>Dq&L|3K_$qq{sUi$Ba5J>;c*7(3LF+dgUY*HX1+e+oiR z@}8_TQl!0csl$E!v*IkfDWNOXF?B;kX;1Vov0d?37J>M(WESCW-^i9$cb#wF38PWS z`lWW4rHBG`H}<)>)ou_PL$Cn^=p zzW4LUTNBjS;E9j=a;UVVRIu!G>@u8{qrzkTJ zre>)2GTb%YHQ|wtfV!KSPKi!|KtbzMxu>mzZJqgTmfy(x-QWJc{|)p_T7|cet5B#= zz=p$yeaWobP*aVAnL~*Ktba!zqA&3MiAcn=nCWcENXfLu*M5e*_QIFXEz z43h*)xVk@CQua{yobl-P$X(i6Ft31^DeIcW#V7bg@9n{;Giq=E0(KASL}GMcp|T9 zUVFY~el4aTq`=wk-OkZ&uXvl;hdHDmNpVh5qa(0mvg2uoPsewbR}?-8@(JHrE?MMY zUCL(4WKr|vL7d(EcKoSa2AoHTY_=+%7M-t(fu{JZ1^g7e9tMjEY>Ij?Vcl9~Pa`mM zF%*^}#UsWNn>ra!np72^o6Ow5HqhBW(Kpyv+i%=gGB6*1$;QdM%5TW@L!g1XnuU?Y zf?ck#4P#jlUo~3t4++;xKpUYYs+9GF;p#{y!wbdT7L0*tp#|t!{q%{?C<$ za;G0WE($KSzKur}q^<88hW&D$ncLN^1-A!Hf16rL?)h4ZvQJ&@d{iT|8*t~ybBAO);Aix3^p;Q8!|m5WD?Q;Ab4604tic8PbbcHi7fyf=N%jZ*7=`ElWq z{?SX$du+w*L+qQJX{GYqvfOiJie(vP`-GZgrkbop1f?>XX*zPbS2Ew&3;B{b_vQbT zzbPTytabRv@{xngkpU_lBc&olD0`KOHqmA6gP5+l)d#da)KWdN7^PVou z1z%oCAJ_e@Cvza3{aPJ--F*v3_=6C6r&@Ba3VWpIwmc ziP729i|@D*|2)Dp)3iUW%E8lT{>u-08Z!U(FMLUJNz1#wds%ZNVjpg^vWPu%x)w;Y zaQm@1S+fayc>keGR%(_`gJQ!cmfnQr99_^o!?&$+APeVTuNFv#86M%u=U?XNUvR5Q zoXEFTim(v{$saHk>at*t*F0k$7=WbTl(!L5P~F=U{njb0C%Ww_bbeN2uJ)0ODg~e@Q?6-rus^$%QS?gNLq~ z@xH&-Q21t>Jg{);_IF!sINligD)vw{xCQuK*PahDmp+eqSYS+Za5 z2v;jYNbmGx=6P6f>_V4P{R4r+AI((@PPT4|tuJP_rtkZ)pKmler&TvBeEvD}a^Ll5 zr3uM)SHpKHu9pW=(^3mB=eD%JIM2NK+qjU0D_v-q3^_Fa7y7I1;4+NR;7wi2{0mKPvTH<{4r*9Wd6LTC*PFkZ2u)6O!RPSeLuHLwl~QAB&QMJx)*j}9r)>$ z>tBubG@|ONW?9j{hbrflqta&t2LYXg9V|ao>vbOGk@3|BonC3323&ad=xm|poYt!! zZ`M8(%5pI=kv@A6#?Lw%PuxqLOqdz!+V;5vu0{Di#=b|6$#$HEe5~_J(VMzI-gVyk z2M}WB7$;4m68ph7yg?N?FB+yzB&*!b|6o_EewQs)E|)J?lXE?&AjjUXq9}v7kULYi zLdQ6!*>OBU7Ip|<^_`3huW);mPD)7%C-PDG`!bU9g&%9Ut?{P%O|0)5?G)D<^W5MF zg>0+%u}4dD9R4L>yNf>u)NR&%du7OKpUWLe@pG4;t-r%ZyJ<|0>7L&FvSWZtc|Z`qh-wo-kJAC)s=ZAc>g4KZEc=G3mu1 z(VeM;uh@%EVX8d~*+z0*x?H}-UwU_9LOk@IDmdb%KY4w7UOjwW!DIkNlo^tabt1z9GRS6 zB^VvvQi%OYuCPpD!0>^hrGfMC`AU@G(*B~``>(f%rWtQPU<~dzuRVue<=FYHtghmY zof#juY_C~>59CuvsXA`$QqabjDijw^k3nc4gSRBmb8RWVeExlWt0amN6^LvsGAn}3 zeDpp#5Itxn?xAT;r%HzpF7e_jc3(_x1#S({A4?82E;hQn>hxotcWmLg@WWRK<4{yo z%yOs4L5;bn`CNIJ`D^$kS&)1=Og4NxOy{sFjTZTK6S#o~vh3jz87X!PE8_Hg!rA;0EW9IzEEFY!alB5DDp~4~?2%a=rFF9=yC>_L$pmdlcPV5n%DnL!M*0 zOEohrU-R7jaNwAXz5W0kPPmls0p& zSTNu3=Zlw@d{5c?2=!U?WXRG>%Swoz3)(4WSdg~#Wy;mLpXeX`$YyM8egEQ-(z4aw zEVsFL&h~i9l9CKZswf6gJtv3zD=1;zPJn(bIO{*?sooSw8dt!6ud-L_qdT#f8 zON;&G0^!=ufQ&oclamiNH2b~IMInQp7c0u^h*|H&??eLsybh~%S{Y8s_a*;+nRmMU zbQKa}GQ&@U1Yv!w-ho;ll0ra;Pv87Xq%MLHw=6aA+u*mD=qd3IzCz?(?XQC6m?U;P z@%$y0sPNRKX@dpT-g)&oTiySHhNW zj~n&qd6;^HS1r2)8PQv>YQLDf9OU}%PGgYm95(0f2NF7_d^?=;#1^P)bwN%9xwylu zqjA($r}Cm#B1KtlYKnO5kx0&iIj-h=mo9gZ5q2uix>YzNOLzw92IqKFdG#ysDtKO; zZY6Ft)5~U)zbL+Ax<4!VWbX;(*RsIHK${D0d_8=f+hjzJcbgx`@>p}CAlu~8khBLD z$(R)4`1?uz0&`51?B&ew;vXgp=>0n6d^TQj+2eKo~FfSKCqz?4bnqC zE#9H0hUR7sj?F$Ai$@vSiZAs>JVW~1CV#aQj8PN_?Ja%nJL7z8UnN`q%ENMa7xH)W zfg5UJn)gKz=6danwtnIScPQ=Dc*^OQa{8mqzq{n>{dFjaZWLtKMz$O(TXCuDeisqO z|L?w{l3u(_@@@O;q`Sn5c*EOX6fTi4HpX#^jOZ-|SF|YH1M?6AsiT&H%tbR>WeY(* zOxD+^)_jzBZYu6dS{*L;#)AD7xs+q4!=6Jh#jPlPHX=R3N~jBEj;I+!GjR~n8xAG1 zLWU)JeJYXnjoC1wN#7^gR`WJ-E9Ae^7oYS$AFS^Sisno(jDDF^{q8z4^kaVfuLlKR zI>K4n(Gk{9tXn(t)MgW(a6&j;SXsHFQ-U}jGc91;^@N^9VYkrMSZo1DIX||&y05aU zFK3jly%mS<&$eY1ER`e59>v zBD+ra!lQVe=JvhRFD9cZwh>+wma|PDlj-vvq?NP|@P0DF7jh(VSmayaK%p;GYkRo$ zqjqG)g2zxGpTE{LvEs4QL31ExWe@k@F^y~HT>sa(pHIJUPkB}S?E-DyT6*{TTOVtN zOC-%W`AXxXyhqi0fkD|*uP<(RfxojX@Xp#;I`P+)D0B%#Uo)|I zQwT-g>69+w8YlCkXpGcTWG~n$cs6#mmPKP6!}y0Zl_=|OPqx%&=#zV`jMq`}%uk9v ziZj^!$t@BUpKjKjdf)dBIzZgH6Y(?Vw))>3*KK2ckr)QdF@0z z!Ug;b_}0wPDM1RQZ%qRL`I<}Krkp3nDZ!XJLBeCR^59Ux8fm)N^_VGg(7TzzHU8-!C>`#t(^ znqnh;{A5pgX(HEgLUUbYY!&(Og_nl_p~c6MpDlf_OfGkZJKh|BW8C4JzcRYw-u$?k zcrt!0Fl6zqB`PrBAn3aG-`+Okuv}_zN#!p?uz{qZMzGLT|Fbuf_b31SsQgjw^6v%x ztkKlO0`L6Ar{~Q+Rwmc*D|M9g2%)kl2y_|fyqU!Xnpy(ApnBm_iG1PWg6Qb$)(1%` z1z%g#>`#u~(w%9IJ@a>By;^!a9&)R|DR>}Yk%bn()9<;fJ@W#Ah$wG{A_KPv*3<~bY=!z)bP39U1hZzZZ-M3#N}Bvezq|&_xE}mndX}1 z$ZP~R)!SSmcoKEFHo5)nvPhA5BdY7rp-`9xc_Ng62g12LTh}-xl2TczIWyR3)R&nf zc0OXf8MLslF!Ih_%|B5_z^?YkOSxA2%Snd3^VwDW(7wPG9t*$op9@!J3x{S&SJ3L_ zqnU=5!^-o&t#aqp1LjwJ2TSi4PIDGc*Hq;)&xP_i9tfDnL_U1%x*SYCHPx5IY5(!r zPHAXK;2)8^n>lBnX5;X1+$^>8MEi zTt5}#cK7Pmt0r_95{jx)N|$sT`?#yh6|HfhbFW`P^rTd0*W9c`Uomzm;z@JWZPpy)eZ{w z|Fh)k5J3x}#c=)dmEDQJX228P$Ky}_){LjifD7?K2wrFz!zo~0CkQG*en;48_L&eV zgn-R5DaSekULyk`u(eIfL8rrOgqR7ax-yv91q-eDpkS`NIu=$~*J}ioF1I7h-{Si0 z2L#f9;mT(pN7=R<2ecZ(54B-K6oL>4ioM~PEW&KC7J@r7Td7igzi^@;nfXgSh`Um z^%TMRkH@i;C?`)SI5gg%QXi3|3kT76as(t%;T#ZDpsd=yd19DYBnsb>YWTKuDdrP% z5hy*f4x5ZNPD9}{u{$Ckzd1%;ol$>VmP*avwZ1}Q*;FtP1O$1^@C zFymGclDUZo%1j`iRD?7)qq>>PI1Y`ri&lr>jY?*1af=}lP%!A|xw}~X#!YA2SrJYd z%Zr7+Q4BSHGee&4Mn)%Ac4~lH=vQA~->*;IS&MIIhvG|8 zn(7au_23{~B1fOk#4z?EP`>%NlSLHjW~I%G+P`8}@G>sY+FPxorzj`CTlUJcK0nN& zDWn5<615k2d^M8b8^DJ5d{ZQ4}p}->BOi9XY-#9Er2)72zi77s+ z%M280-o_Xw0i$BbOau0oAJz6VL?G%7^>QlMb4@XVZ31~tgLyU@*d!87n}X?A3&0zV zu_iRszWfXez|)N$A9uo{jZOC&k3)n?ochkTA$vrj+>k^AJA~%&8d2!&y%HP(R{xhh zuNy(H9e^ijni}`zsZ8O0WQ_ID(S37Jj>eJ4W9>_a>G^+ph9H@&GfhDyIIVs{coRMo zher7m5hxsH&hst;pD15xsU$^TPOt@kZH6mrYZ}#`juI~83C(qB?vu5G&jt5!PQc9Y zyq&*`v}czFcOwv;8xZ-tNzHQU(txnjz~JQtn@Cvk&J64EM^Jpn@bK`W=D)p_fd&g3 zR}qE?Pl>yuDM30@dk<1R${C}pKy;rjI6}^uO|H;jIIM62A}{iOc9#o{$@ioFi3hEB z)0k_?Ggk+A9fK_KgzmW<%opmRz)i(fAoY)3=bt&h$}p1}MaV^FQMDBlgZwJ@8D1?| zb33c7Y>}l_nB%d192==QH{X-oj&aJ-kbUh#V}Yk>Rq?m{`4FZf9Xx4y2)6v}5hBl5 zg;7Mbb4)sUaU2duTyh^`JgsXnqF(^HglW$i5BN|_zO7Rl5h)t zQ_3F_nHB03A&BPkKR14VA_tZJ$ErH!h%aBhm{`nlW0{(LTJXyF^W7=yCzzk=@5F$) zQaA8XDVyUhj&3J0?P-B$4s@6aGw0sR7~pk$9=}27Z&4H zrj&|7qtU`8_$4JxQgy?v2R>JJtwQ&?He&wz;;4|3(0mZK9Q@E{e4-V-K=utXuSdj< za_VKz1L5Fi-=F5Ge~YSQ?sqI>)!=}^hgSCo(gfo6iet(`#W7XQPFqFr$V#Q;?|RPI z^$9lx1YQoNxv6Qp2!23s^8C}pZ$L{naJ&!6Elu8fzLnhu8O-%9(CGejuw{_5K^nrT zP2u`JkwE2)iBmy8aP|a(P)Xb;>mK9!x(O+_59Re3Q0Q;ZE(1Qk`WDp9GEj*K`~_}G zPqnI8wHEEk4grbUe3`=56i*uN#z14rK>32_-3DX=lP^n7pa0oERkoO3Bcl5w=g#y+ ztd)Wt3I*ls$Pi=DvFJU0UXWmd&*XSv?9Ij?*oLhk~sJ67!(;+`T7U;;db3x&>P!K0ucre<%L*c_lOdH4*Cu8U}iql*dzSSs&H zLJcSv)LR;hhkQ|+`lyl`0+LrBx-k<_(T~AUC;cIyr)^T4VW`gZW;1!Zr_s<$HeCds zyf7cbsY_kzBbN~j2sEx{jCjU>Dq4acdfS*z*QFpDa1QvO$p)CDHyi(ZnQ zxum)wEtq4D0)x`kY;IwLI8?E_u=6tZPK*=(>)Em6b3x)JIWSrrWiSvvM&*p=WA$R|Lm4+&`Vo}T){`^a>7IKcLu0bK;U z>E1n%Ad3k0t_>7qr1MQR_?C@4ycw__kcmDZkulvP-L4Py2fBy=z`8*{Z=@WXd8A8H zikSzlD@aQ8322WB*_XqE1zE!S1ZKkp3-LkzkKOrXJR!*6X@PY53cgn&Z#`*rE5F4! zg|uYd0&U(9e(g`A8!M~=M-T${0R)6sQ0V2MU_MG{a$E_{Fbt43dWV(@!{F!Z765IGkC0BuVZA5nl=|L-HeY?9fry+(*|i~lR?-Ob+f=sY}JBo(gd#sY;{TR!tZ zLBFVhBjCc4(CFjIYjhiHkiqJ?0Xv)32F%ILeYv4N8-`qO6$hv~w0#y>vqStOM}q1~ z$DgV)dr~9K(gN{8e6${XGJ}{;cA5n88pN18dI%6mi5t5OXk|2lln_za8p(rIP=Y9dcO1O0Zd`LEbm=6(K{Wd)b1E{#<(F6|W$m|TAZnTQn9y~dz*qTixqAYzk- zSAl`Sn;}P?>y%kntOKFv)hE@FCz~1}&4<;bxb^)*XOyG%A9Uu(YMQ|L>-*Rm;mH0= zi6x_ZpD9aqo=}m6*Wrs>sfdxXo2SaV)4z^Jfc9lGb= zqFkXHOdDX}IPh7T=#^cpo*9m#?xf?#XuxCp(orZHWfCiQg2T+UL_8P)gHU8aE&OD_wuzwf6v7t_=D9EKn~u9-H%phN(F! z6{84O@cDG|%L;7oPC%lIpcF2#HZ{f)ZlIp}Av52j!=!r4NCC1QTK)~8=*(0h$Tvss zBhsoWv!>K@4@}CB!l!c?=Xf(erd&+eI7*E?77wCe#&}tou6#0JZYYlUJW-!s8BxP6 zP_OT`krwt*PQ18SVm#_QXH{4I=j3zA&`2&@6|uY#FS(B8?8_Qi$*xT8x0Ldei=}7j zSK(7JU@*FPD$EL!oF7Sx~_8AoX`*IOT-vt-K~Bi|D)*?66e7L7m-iRAZp#6U%OHb}nfQ4M?mtJtd$B*p6| zk9hQTF|dyDhY8>f$7WAHsa8t`2-KBhi`K_H+; z8iV?R)oEp40tj;T#xdae(HgXq6F>kz)~k)c4TNs^a$6VyGu=EE>#QIzG~p>->EKX4 z8r^N4X=8sbD3GXX5x`aybEm`j%&ebpcu^4qWEGVD{zZ! zjFE5&HZ3l{fYzYQGU)k#TUG(LntnJGOaC0$q|JT3^gar(a3Hn-5xwnogf(23Xdd9dlXc)oc_0M*1|rdDGH+7kBC5aaUkea#O@X<61J4~%JWx^=!0|Dx{}?Z9 zLwokEGAkobP18w7OBYe7Z$M0j++oC^B(SaW-B2wfL za8^lzO71(KZ{IRVp#hu=5I&>P6)&nuP?8ybFiNPTDxmAP3^bi#=1c{IV0@kUtJGvNG)54TP<2l7y%BAlppov2H zq#Ok_@UyDm!s@Jplsx;3?|mp~SP2F>d2US!eO#;DHlLF5wYz}MJwyt05*3C7IdPUc zAmKo+cooyX`O;An8$lDKSKsjq1@XkHn4dtOt8{e(om0&p&Z|WJW}Y<%3}A%oH@@H6 zZCljFkWv>+8gQsE2)$!>qRp>}7KXlrU2((q9vA$17xg_I|14{{=GtJ0MU(0R4e z!E=uT8IWOI@AOKpGG5>Bw8dBe)^((eBVR9cQZTN!I*2!p*PlSw-8f2Ow*N1o5bAme z`te&U43~jHr!G?w7hq`A5hS8xmEea$pP`fSD1Y%>vun3hefEFNbxtT0MI`pMdL)*> z5gA$51Ls+$^5F(j6e@@f1@cx3C6Z_y+T01LXDh{MzXp6N>?S&=J}ays2S%xZQ75NH zMJEOAb|WYk6v~3V0~Ntizo?Dla)a^pm7!1mJo_^4c0!yMIQa*N=XNM1&C91^h3+0} zzTHi)y{G`&gPh;DQR!kME|1{y1Js%ED*?P-3h@N1lw#6R7&_n+PvdxlfRtx&4Nt6m zi%C`W;ElMNfJ`1z+NSEkg=g+ErO4mR_3jq4X;&q|Yp>DP#(+_%7dlyG82pWSS#_-w zBr7X7w4_;#LK!y+?0oSpn_PhFO2E370bL?hanz4uRrh7vGM^d-tIY*lH36pERR#Du z;D(4P=b=^Y^)h6r0GtO{G@R9ZG#hFt(2jt;X^<2g#yNB;ZxT!RYYN29N$ zYV5Q5SKu;eM>RB<8(K?&)K4lZ}z~pP%4}W#;tp0S|{CWdR zGJu-dJXohpqd!vMz})}_uBSo$B{5~=BA>A{EzGduz~i54Hx&^aJ_d!SMAu;>5{2p-mXWwr}m5Cs!S7{~W)-O8qSNmFF9;#oPj^k#@#A~_dD;oGD2{JO^a2ETJ zcTnKY_jtx$77#t)hjn&cUX|P?2|7E_*|{9Z+8t)LsEm0#vuU7h)?^!nDnT5Gd_srO zA*ql=0@;%LRgp#|Nb5BI%fm$-YDXW{iytl_10kv&IdvT0%Q8=%)mWiWinRI+#Z4IF z&nX5J2`yErju47comM#(EJ+!GBy7p)8IYpG`T(nh#$v-Cuq+N{yyP2qa$D2fK3G3) zeFjH1AbQI-P9i47VFbu>DJ->l?A98hNCp!6a}VZ#Txr~Yc~ouYrenu zq(4VCjzT#hjx7vj(O8)heO)OSOiLLzqm0y8MsyKlJ{kPD$!HwXFivl>!=xq*5&o@S z-H0r5WPOsp&wf~aJzXpAhap0DDa7$K66@c`jd>ab1Q4C6Q6;x41=up;kQftzagBlo zf=N>L#zak?so;nt^TG;&nQ>^e0on=Vhy+3?QV%gI;)r}tIDbJ2!{N*QC4sNkR-n<= z-H4?GgT^QB2MhQU@^JWLxR|(ON*fzwh1H?|chet%8n-S(IsJ${bKzs2b(2a?yTCsY6boX<1Y17F>LL*N8R!F=n2 zNpu)1kdC1c%|Mm_R_DM&83wp&k=0sgIBkQW!~%@-S#g zPpC+>LIvhCCSM7SiUdqGAHY-C^IjCa7Q)2>PXe=_J+3ZVqp>Z0Wf#PlZd}{(Dy9iz zsegE-`o*Da#R7%R?c<*L-UeilP_9{Z4ZbL>Y$H#>?K_AqVDmIoH-fN!A`!C@n;n+O z4QYMrH2CG9!AW zOXzBfQ-|}ek3Cv{VdjCF3d>sBZ!Iqtj($&c2m1wMna_JIq%)?cu{!cs^B~3K*lCB* zh`BUh7zG~BsJmh1av9-4jNup`yty4}A|>kIZ#Z}I1UnUBERCZ~oSq_(8yBb20PgJT zd$GwAi3b5POhH^a)KG&jN3NA}H;I-pR4Yd=q-Sr$2QuXBcoXG$W6l|Uk5Y}LLasip zj)aIG>$?}(FI7s`7nSEzyA51|lz@0IPTh#8jE^_2iNTVEoUHE2-XolTT$)M^_t{(S zL&SaKdw)^#ecaez6xc5nNE%5_C!g7ARK^=TmwHl~>J3S*IQxIKZ83aFC2IWzgGCn` zsFf>b%U#cwT=xzSzsIO|hdN1Z=LjGz5b^L>zIsLD;szM35~$noxuLJ3#d;7VbrWDm zv3elTD;jDIg*xfQ^4&zmpA3(X+x0g?Rbxs{;Zv!{Tm7-LOyDhqsT&$d~1Ca z_{ift9ovvSqhVYr;BnJGfo{IZB;4blBMxWvcxJT94GFLI{r)4uYkU*1g(>)a;$g;O zKadZ3phX6sZLRLA2J1V!@yX0^LDPGIx2YgdFY^q;Glr67l(Cf&0e8JFg8$T33hl%o zQ-p-wuY(dBj)|@U~(GF;~@d^x>1qi{&tfzSQ2$34hr8@3FiaPKj2Ty*fn)BGZ;R}O$CT=sf7lU z0&_IF5#E?)s}xqb?s0ASX*E7m>`@cy_KdkkTq+72n(PhP!fC@Bmy-_YFJ4z!Yq?Yx zt7^aqL!X3$lvpZ)axSz=?Fsvb!)3?Q*$*rZ%RK9 zSF9gI%&8J{F@-mJ#|&m>%meKmXlIPkKp-pg>JJ>MF#t9=O7jhh9W{pIjk1{`3xjXK zx%M^si*|37b?CzeO$C5C+I=k4yB?@qz@h5vP!t+t8Ay7?L~DkusJek>@J2yqFkcet zloX{<*(j*6(+5ocZD2w)>pNudhIU~CuvP7UTS>kPE&5>z$CF>fR`{FT@c!N7A0az% zvH-UZc~#aK9nG}vLSRBTH@r^+1Toh?*vKxjt$mS2QWb5Vhj@jVTe3g(|>^m1k{1} zpzg74;If+nrd}ip@XPAFu30$^^sALj1C>4}sAyvUzj0kA!Vpm94Fh-m&2JdHSsqqI zf1%(%zov>0K)^KE{hK=oKn^(qaM;fqXW75}i!5J;?*RZr)A2n>(U8Ss!UGufg)7tm z3x$D&bTInzGoU1H{7N2!uhzNy@TzH^0xrXblFpp)4S;x=Y?d{t;bn;(-=#0`@W@jJ3VrGWM^Ff54FQhZQ;vXssGU())_J{Q zvlzp&xHbJTm=FZgU&CMkkOM?)73E|x2LV8P)G8pOlngaedC*S8j9`?_?I0`j!Dx_= zF@h*q2LviyyV&V{3<6P@-h2zt1iTr+p}=wYtT$siy1<|h;?C=Yz_$Db0K0HR13+-` z7a7+O5N5v`JW_@?hf~UjV*Lsiyln*K+~xs5+dHn zNxaRT=?Ij4`Fa(=zVDh=fa1H%-1;w>4uvx5a*oepzu`7O++`T%7JY8B>S@ITKYq$#>vkAPB3FjQ$EgPfN zVz*OCiKLWQvCTr+N&L!+%vRTd7qen%5-@0AMJFjwC=o1W;)VEkr2J~#g!fi~y=@%y z&GZYqO4M&&1pEO+OpGrjjTZTc0~ymX&4?6CR+ra)UW%#psKGBJM<#1(6f>8q|C$is ze82n+3Q#@0qcBgm0OY(=&1ONbgOq=zy@SAs7kTIL{;8+*Ue=yfHnz7PXppx@A{ zmn2dchQxfdAE7g-VSsn7y+!zHpY@kwP#oB)_ZVwlW2khrJ`gL5DUtI2q$gl24=ju8 zNktnAb{4;1#q_+-7lDwBDcP`AL6Urfimz0tr(eRBqBXg=O}e5#Xvc* zK(@J&9S_aUb_zvff8J=f;wi#MLnCEy5h1b#ueTJ>dRC5q#9pdiQfzFkg1egpowU-# zJp=@k#L>WTqz`yLkiv0f|Fs{%aLND4>cIxb-I7G|M(YDkkK{gbR1#?91a2%YW z^uy^`D^IM^{;8?9m?m6o;2zUEN~BhzewXL?k0&sk1iTBtNNtu88NAv)itu_JgaXua^-cuJd2ZFin82n6X%2O$YC9q5su4L0l=p#{kRR@D6D61 z8QLg&(f0^5l~)htdY27FrCI|Yv(xt$p#)2yp+Gx(k?9B{5fcr$3r|V;uMK>VQy2wR zMgk})J$0!>qQ2ZD3zkVp5=ojDI4CuUF-nVuNZD(qBxXZ<0%g&v1e@9Zgg=!b16+n42lBSNeAsDA&I;jutvO^ zlt|lS9sS)HQlSH^&=5jZhg@#jA!54kS-QoPeF9VuEE|ZsoQmUycC%sqS+So0T?2h- zXlvV#)0&1pFocV;c1qhKmHr3SE;hT58TC-0Fi_7gPLHI8=nIu?yc5DnEhFwNQ+dJAB7@TM(#_+K_yety0~j~ z5zD~28nc(~0dHxZC|)YaG$6f8(EGAwgt_)vuNpid1LI`m1_x#&>Ms{#dUX(D6?vFM zecEZI(%UFV0g*-E+Iq0zi(>{AlelQsV&UBfoOAkRc zbkEXeM&dk4zpb@y(eVVsaoVM8Y0D^1m=tVTiKWHyA^OUAmw|I=#_(IbmplJ> zQYeS|@^|=>EBQAN?dNYzMWE2?+QqBg+*o~Yc+j@9$I*+64uQ_XxIe*EU;tOqg#jcE zc(vh$=x8U|xWCs|CqoN^m-JM9_n7YWmL2@rZ_Gxkgu9lgb~0WlT+A(WJ!qwI3kld! zEkN)aILP{iQxrVEgcOku(w#n)UTvZ)#s8PV7;<4wRU9QD-4+!+& z$~`s^z?P3bPHzF<>2Ys|XB?(@U2vA(|E^b8&`FDX+(JR&aq((rHD8?Hz*0goB|RHW z3q08nGh;VWf;zcM?*lkOQ75`7Scb)Pz3<4hLbo~wP`_TS1S~*(wlM7XO%E>-(i6(g z2TMX_!Jnb6m9;_7-es#l)gHqFk5UPYOZSmt>V8L@rFx0_q7|RfVPivp3q$6J0)!H4 zBw+h@AUKOoiwoohZvJ}3V#y*edNm?Yt29_s8G*Fl0L1D$!N~dxVlcketEG#jSA174 zyJ^*3&T^D;`>`k8@zs)jWeX2l$U`oAJof)oUay?4E-_wvOjx`DM?wKOO;|8cE>2i5?|$3IBG+#*~{u3uf8==A91 zMSC$u#RYQ79>_lt?6-;io0J#x_cZrp#p1nA5VYlT`(&!eQ;s|%3X6)N0n~ki#TaFy zAG6N>J2lxgIqtdqQWL<3kvXMc`n# zjG$A|KX82eK>|`5%oe;Xvzz;}Q#vA~zB-7HWidA(BBc1|MW;?@6y@&R0>j_nRb&B0^fzG@u$BVwaPJNv&ds)is109=d{0S`t(&`Iv%=e74 z!?vS0Gn>TLwM z~>wjcR zuL&0$LZoG{b`yeW>1tjfKN#SMB~wC^WR0d;Fu?-Bf17vbQQ?n`t{<1QQ%#Azd+c-eaJ1~o3P4eMEB50!ec)0$Xq zOQoDP5U-nfR}o>t+og=cFn7+c^MgzKjZLCc5fpnlouKA7SbFl?vw|tP*%QjT6#J1? z{;~+>lix~ryyP)Jl?p%;#^eQsfjImGv~z-ydMi@j9mtF|xNc*_|N7*9tiE3G%H2`ctsq z$Er0ddM2$YUUPVC%WU}Q*9I)^lCIHq@16}^o&0gmIO6dpC$u_uOLa~FMbzp3Hizi) zmF%BN^zI@G=!ZRDUkRasf;bo7%%}vYOh(w6jWY~jCmO1&o?#g(6dl!ooU(9c*XVpw(WR&(>}z8e13;pT~K0+&kloX+FG z$bJPEqn5^V;cYG8B6MQuKbB(Yo3rF-qFhHN>*P%n=cER;=g>~2f3i2044o{V(^1^thYtKUGx_u($H4YfMTvsMC9? z6)J-QWs!#V>J_`oGh|-`_2EeJxj&N9#DXG_sf^zM6+V}lW>A;ePylkiSxojVI)+mt zcXOE(I1qWEGj1zeD_3ltIkdk%DadiWlFJmc7XbmOfK1Cawxoy)zbq|ED%&9lJb_bt zZ&FC8Nk|$FtWvz}GuHau#~zgF6#&b77q(&V0mpqNKhbAHQ4j^yu}I2R<%)2wAesg@ zljP8v;hjnYSXQ~fGqfN_M*uJ!xOjRh3TyBew5h#@HwMEJ7~5#ApZ#>8vuYXilC+jO!o8p&qLP|^{mpnNBrS&EXT zK*N#Zv}RSkv35Nzwm0?jkWW&5o@+Fuivd-NXYg5Ugv5dA1kHXFz~O<+j)wX?|L0pw v6c_C5?-<_!P~)O&+u8G<5gveb=5xPHUy{r7<3z$kj77V{*{r4=Ns9jgJ7^;E literal 0 HcmV?d00001 diff --git a/docs/ug4/img/readme/PanSolution3d-coil_and_pan_v3-lev4.png b/docs/ug4/img/readme/PanSolution3d-coil_and_pan_v3-lev4.png new file mode 100644 index 0000000000000000000000000000000000000000..4121f757220fd911066bb8c6b577247dec381910 GIT binary patch literal 651305 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

HuMHC8(o%nza0C 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≧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

8PWQIyzAr{>0;>cg-=AI{Lv!0estN^sneZ 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

agyhf!?7yiH&4dEmBsobVq*Y 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

Pr<1-41eLnb9hKUh&mOQk--;W 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

fQhN8z>vR7N)K!4$KSo^%{Fa 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

iOn%9xslne5c5`fZ8H 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 z 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 rFPUARb+EUTFjQ}4hP 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%0DOR~;)SLP`d>Ap%A_x@v-9XE$3fX& z#-p1Vfz&hw**9Fr(4IZYW>7P*$GKquc65_6cvEnUo4`zJkowvqv++Ae*EQ)gBE)I%%z=Kd1yyLnqF{%*(i1XMFE2bFd7PacM;2zb8$$080X2Jc# z@1LF%tU(--;qO{f#jI$DZIdlQn`S%Mi_gn+rf6=tP6|Glgo|+>t5((8F#v5(E_OK+ z@_A8*oc+5JALV=Wd=j>bJV2L^eKDXajhN4AjFE+6v<5s(B8tPbYAI!_PC&loxl%08UEUhdx z3VU&Z44iZRFDNGNU>Lw0+yZl(E7@@N!`K&Dte#D63Q=|PD_uCLJ@$T~_(8NiKXSK4 zsn4!tDI{9J>Ej@2?>0??HqXar%idXPu_@7QMCQc0l3{{hq-?C{34WCV3lGKTepRKiQI(k-3JZx>Ntna4(P-)~B>YmapFt|K ze-)aj`fBptT}E#sCmmu>cW5N>`6+S?=CaJu3zX6Ob5ehW_#zUW0=b>zbo#8@)xjzVlsc#!HHLA=Ept9`^I^Q&xy|yZHmdN z)oGP`68xPJ{A!+v6rYh6~>S*=3LYuZgC1w>Sj{g8w5{p`$aWu-x^9<9l-q=ihH!4?2H z%kWYKoJz$`0}kkh{Ld(_bpy{vIMAr?HkVsJQ25$OZ=;sIfYIgspo8~#dx{^&X0qjT zgLgfJgmF2BlUNUj4@P20Q7lfE(}VkAD&5&k;*vu!U?pH@reEP(D>#$}2r+`1j_=b+9PEj z&Yk_sUyH{K*>qC01`>!9!P-hr4H39JyO{Twq0c#IOGvz)f3`%plkHVb`9u~`>KPp> z%pdq~ml}AMmI9skQRy~YmY#e_aYue7(!bhKsEfCtfxo#^R)1?&u#|1p1aCR$`b_K{ zS!zmaKx;c1;OcYdAr4{_5JgXDL%KM-vC_^WAqAm9`mh1+=P#-w`ko& zjz!$O`li4cn=fv@^hzHT_oIc%*nY9McE)`{gJ%}k{iiYB>?;G#QaNUja@nNd0pwOC zGKj`VF;AHh+c?WXmg~TNq%azYw`8ivFhPdjPTdFBv3R018O#(EqK=j-+wzjAJ)>uYboCSccecRP! zp9Rekxs>~lx+?7B@S(P;TEUKIQkvvxnakhPUC}`ubN?=)S)4HOce{TnakZ;Q=;8mO zaM|%wTnI0U_as}^ z$lAmga4&boDW(qFFe7`P0Fc$cuJ$AVfdH5hu8=)BB3ygUwA^&)k6vfOAplY=OIXyC zJmmUEmu>VQizf`cOjsWgy-grF8r;a^&tOboOh}UZ?Z5|TwE>t3US+xB|MPhP@*k-u z73=ds@qiLT+9vh9uVTHGdX7v5R!bhRCf$2vlI|Wfbss5hgHo0P7!uy!et6bCz8Vq+ zR_o;*?f>*yBH!Na8`^%~(G(vK;ZR_#p<2ISlJ0tS6_B}EJbsmFSfJtL@4e!m8OT*S z0Ude2JB<##x;2(4*x7Ln$ov4a)tlVB@;vcOE>Y#*qtHWUwNe~#XDlvEQy#Q-UcMkY z7Dw0W3{L=+Ns~TyiJfwzAA8R1PhOC|<*-@FaFU^_f2kVO*@CwaV4u^Z(NOR&Y|z6m z=YS-NdEPrZVsa=?;A_XAz&9J1e!CNK$>PJ%VAs;I6s;9Zv?U0w5wLqLF2*F1UQjRv z*Givo-JhN!a2RMY@Jk7RFzkFiYp78^kujYm9lUX!_ls*(=Kc?*4#ffHbuw$$(!Bx9 zcmHls-@!XTA(PpGI*;+DWs(o}n$dXYnKaYn!}~PmLwBa}O#ldAES+@$@5v@~DsXVm zmgL_Fh`boS!bQ2D1*7cGR+~c1zB(66kn?RF2^4S=t-}|SQ}BN=@)x;?@c#}7PnQj9 z&R&z53(WlZ7Og0E`2A{j_%!DmI9ubU?CkAutIOmpxzi6*wA?7}%r~#Z_S~qxZIQTd zgXft&`o1q#jmB&{^`OxQ?7YnI6$9?MQ&`YBoqt;9U)3(s%D5<-4IATpT27Hzk4{@c$~ z`KXWSs|Ec{zmvswR-Uw-7|Wd2*<4^K;L2(<>il;DIz5}m0uTIm1X2ZZVf(t~>3;ez zZNTCO%PL?iAmmKNI*-j(M(Of#*@=)N*xYQQTDWdq@pWw(08Z7X0?Kc5dm)b%_Z9}&j1r>W% zPgvhcmfrcFsEf>p<7xOPs>u~Jn?&}0?QrxE%4qi2ZFVo-dcVA=$w||1smGe6dyf}{ zQ!x2(c`^x}BM|MF()*Q3JjxSV;>4`p_8`#_BTlRQsZ%v6dL~$X%(FPQfNaqmKir4N z6|>w043D)2PAf7hS;0mB4s;zC(rwK0@%l{y|&dk6O%MV9)czT)oRB6Ni&@ z*EUx*p~UQpR_C%Q7U_M+AV13eoc*1L6EtDG}Ves7DTtMQv3L3iprd>7|pw!_b1+;Y+d(cBT%1b%mckEt7FXnu1|&mpd4@|dB5MNgz*1~j19B|U;!oe4|lV>N3$ihK-y#s2THLbI7Xr< zS@FwKHfVH-V3GV*&}Vb2a-casR7rntrKp>0We*R`YZ-Xa-wU(*}U z`ghHL3OdS01!-KG!Ul}B*0A63_)Db}$3USof^SdDeeIHVRYbE+8tJ{myv&fCI-QXDCp1qPm_`>6E9j8m9yrYW!6 zN#pXT4?_DSqZtN-G=d6%kkZc6ISyD?)&?tax3kA4a&ByXk_p)B}ds>CISApFWW6z)cnr|ThiO5DT8Blf>3tc@v4*8(NAM&Ye zOOJzJ1Sfn5<4e?c6Sfdv?n>A1KkDBI!yF`#z|17nBhTtmk(AFqp3NO|Ta9)5_=QUj zW9222#bcZl0cT1M^<#2Ly-N&sD)2oQLsrUec#u05<01xr)j$wlPT>j=YAKmdqPag5 zm)q9de@z_b!6Pmc={Bb?^&(ev-sj8yo=ifCzJqyaO7{N`Z6Q8KHcn zNg_=NLh%R`LJqjIu`cEl%MqjOPO)YWvKO)bmQb`}XTao*oY^1#>sMym)yJ#3c8BUH z`U8T)5ug#F&Ct$-hP{U{wAgJ!Fxh9&TvLxvkJ5TGOhQxUjrMZ^WgjPVY|H&r1XGn*L=wvV_B7zc30XEUbN9l+(>GR~oM!?p03e>2F*#q#VoSJ26zM9z)(hzo=_ z_<^p?M?jtH-9R?=+QrW}?j60W6Pgp0x~;<>N(HJ7fQsxciR{1fMR;nLN>dtBnxew( zu4Gn=&kFsjrfTmsJK&-X`!yPWr3NaEORG^mKF%ApmI2*?fesLw??;`WwVi&@tiW51 zb&=;}(iSbLzwGzO?78W}JBk@fK&Nk>t4ru-?$gFReH845#EseYNFY1Q$=7J;D84No zGfmVRx7?@*g-I=lUYFi_j(NI_!N>20NS*AuOCX&PXvBBDLu#MVzBr+BOfJH&@EOj( zzyu^v2C8xQaXMu1_EGS!mF}*l=oG;xDA`+8e^txgR7k5mT1(@4UO@SfeVEa`7_~UN zhQ!#j-Wrm%JD9!Jx>r4a=JENgr_u7RlEf%3{hSL=o2K+{why*V3#;)^3uRE>O}uo$ zZNez@4&j&h?p8OR8z6BnHJqt5B+9m+w~Ik*%oFPfu7OlLjXKG&EkX9*>hcF{GNaH1L+tbo5xU;EFZ! zm1tCLHQ(SNoFZs^HXVR`1@WGEWaY_}mQFl9sUYPz0T`PBdz-gyd?z$nBJNO0PjH4{ zhWA4MSJyY@#G9xcjh@=6XaYUrfBrX&xL)n;6g$Lx!m?QE8|Db=#mi3GP6pb4isw>8 z$zBOsR1pFF!{y>w1;dB{t6O~Bl!fzw#;@F+_7o7M7Ydl4cz)wUX!OZ->0SlrDi-z+ zaAC$_=LjHWHag<5ITHN|G`WiKbr)#Ja4|WWQ+`7fK7L(S4es2^vATYI`eSIILK5zA_|e%(`e$#%$g``zwUe_H|;E3HKXy}nsG zu|5~wj2%a3G10nO8pER!AvTr5Z2GD?L8Oyto&NNuU&L4PaK+OP#~>B!HbODp9Qr9@qqDF%`iQ zZ{&!9XPPTD=XUul{M`NN``ijcoE-4yK!Ercpfuw&FcS7v%u=nJ(&;B0wQ5HgVV(J! znAx@!uE$1~m+ibh05V4XWD`j<3-tQ5%G_lZh5_${)L*$WPE($M^Lp#mf7E=h7^uJg zEP!;<*0lbBBrY+Szqc1F#EdC_MN2i>a5`l$<)gi6(3bzxDk{aA-5zJv?-snoz9cJa zMp$)%>Ztfeb&v*BCRMr)MCi#9e}FpBciL|%?%ue{cDmd6O;5!Ums}k>jhH20*jZQj zK0GQhp^wlbE^Y)X0i#WTLJ;%zFm1%LP7LYvD?8;;$*yhNBLGN{n=ORAUU@5wtSV0v z+l*^w^g~T-*~i)Xs;9$4&hOR5@6!R@xfeY~dPx=VF|sK8tG7?&>rH}t8mPPE8}+px zomM^k%$)2e>z!6UqHD6UZx-{1LM?$f=pHwuQY=bK}ZW)eT*LM2)!wxH3q0(h-~fIZiLGfmG8W@~ww5tL{k@6bjSUII* zhNq!wks)n;zk-n|uM9%UG$a8qN?J-3bG^l+Oq{<$gq{x}isOWi&cCFYu5a-mx+ zt;}|M{5aqb4#sxWR?Jr1R(zh*_7{&)B9e$QmABiaZ9ux_Ul;Dyu*qj8)9vYx9L>;B z5BRAcAfJp%21X3nR1hfnbrpU50F3q0i8W^;yfAk)=d1rO?L?m7en+|W;PW?%P+%w_>o!;CtC1+&Rx_Uo zo~*6Z2UE}KID=_MKX=bgg#+fbu8g}UDav|=k zReLvNn}B%3$G-btadXlSokx?*SvLss$RvH?n8tAH<>{Y{<-3z*Pnq_BhfP7fQ6Ezn?&;!dd1J|^pu#3Dy)MWDHwT2 z;ntM?MZMz}!S>7cLV3v($vnnsCJT?SiCkiIMWg>7<$YS`%RS-xowu*J356U|0?%4D z?+Y|r>%8C>3rN$Rw9a7oD{v8r?T60EI%}pzmJ3Hb+tYwdB`%qPe0lGZv%bawZZPGl zS-8DEH;-X~Y7xjsG+<1|$jncRg)h=f2@-5et&KsM+bJ5000YPZd3O9?PpxS3lU(L9 z2+d7&;90fmiG-lefBHqBh*iBNRUDV!?>&Cbsj?;k-T#No&9_&RNjK%NzeBV8E-Dkk7zR|({cSXQSR13}qX}w)kIkVgWcwhmGi9_zyn%DW`#R zI2^7Ea&>$Nnx_bb_&(PAmneX^;2ca z-9ML6O7C_Dx8r_#O7=tBmjuhIVBH#DaKw?Fe_z$3HfN^GLN;MVHXmEVhH_687@o9I zbXnS8+5Fm$+Z56{tn!q=zv5Z1V5Mq%T7BmI^+Q1|kHn|5lA|$k6%y_Eif4FHOkdcn z)-`^}4Y-Z*D#QK?-f6)`U(1G}Q1AET*MJtMK6KwUjeh)G{8BHaXx1jMUzU_p#lv0d zsHanOWOt;&p-xgqB%i(;+u}Y;9e2!kA?NQbgurk!%YBU01Cr0aM>+p};LO6}7iP@T z6*ihSUbFsbYv#36QnIr*tB`#aMX&4pfY`P=XAIo(f41ZMlQiK;a7GCz`^cud@Y>ev z(KWm8Qy_KoUpFq;bOI>;*E}7sKR0UfG737|8H-X|Qan(6P$cb<+m@`{?%nF&8r&KV zEUn#|NcV6&b@g!ca60ukJrlWG=rNtnJ;=Mrdzj$g#rTU;L2BY&Q^$BnGLI+KdG*sQ z@4+(Y(s`IE#1!)e+lz3Qs=x|;i8E()EbVP6)o~xj7=30kQ*=(BA%binb>Vy@sZ#o| zfX8$qlTBh??fPH(vbk+lI_NG+%lvedo7JMz3y=Ix)ijzF>N$Ru)^6ly&7-a;Viw4NZzq~$h#wDIOJjW zpFcty@-Pg|mDlQvZ~iH-PNvWgDN{5jiye&>mLGc02ma-s<#Nt=OKb}yb8yLEZ4;9F z-aQ|g^(qsA&L|cr;HUgUm+Hb9yyCbaeglApS1`lG4r?;L0RRDzTjT#I@2fZ+?1pak zq=z%EoWZN(sYLoL$j3~PVjuucAQg-T$@BRbqliFmA(A6u?*LLTwyjHz&og|fp*EbuzTj$W7q1@;tWH$2>{I~+8?`dH&A1o&s=+7ZKw z^ma#e^TmIQh4yvM&E*6%~qW(SBlaD)a@ew>bnI z5(@&~#?e1kCZK!IN8yZ1HE3xKcRS$-b-N>6^*UGiz9#(!Y+p9Oa)KGq} zj>G@0^@asc1nQR!6pQ~d9d&>XYzmKZpP=4L$L-jf*tT%u(Prq^koCFUz7i9b&O9pp z$zzo@>G`R#aPs9Z#X*Vy??&e(qegt#!eyvs@6*ZD82{c#K%O3VJO)ZxRsAS+UDTg!>)oW|cCxe>EHc z($VWqf?;O=Tf9JC0OWMw!CRnFe}AKrd={?5Z!Fs_giCvh+SV(5n@xdMABh)(;6Sl} zeltjlsi zMbMovo@`oeZOMc&R9COC`1Nh{+28y7@Y1yUiif%-}UVv@gGQh5Kw{lcY7>FTxKS|pZAG-J@dmHxUrm(@;v2~v=8{6O1|Rk zBeXaXt#jz)lee7o9rKls?Xm@>L>jqCsa$&sX*S8$5xF8Uu}x zfSGBr`S|FgN1Wabv2+-pSKMSyzRq~78c?u*^_;Fb1_s&k`I)CM6M46 zA;Q$v$EjE2fJXN_V;@$3m-X<&7xH4=L|`BQk%x-+!CO>hDp_^Czkg{q1l12sv5uP@ zJTkoNXkr@i4T8XG`z=Kd(159HiWF+QUr84}VHm_7#ESV25qR0{hs5QB>Sv#S2?BCu z13?)38yEh|b3n8FOp#9#3O5%o?cf<4S(UQT}e#l}uGd+Y8J*meYTHSm4 z3Kw9b8?KSpsq3y2Yp%zveR0%&K2obhu|BCzG)!|fQs$$=(^cp_Fiua!pLV%J^iX#_ z*ZU^6Srt|9r{9^aD0YMl%Vv;xg6cwd**#m?i!=UgYcsSYtp53E{!d0##KywR)u0o* zw^uS;h<`v!ak0)al9AFxdFOuvytE2@YJHGJ|ur~({xvL^A5qg)#&dI+xY;o4Q! zhv*lgRkgg0A@rNdpP^~YI=tBKJXY2@t4)eNcW%-SBty@nK9SiS-d3N~@>>z4; z8;7+l$7KJ@zor*rmo!12k6A`)B(=fqj*D7zBp(t^4VCYB zmR-C;#%UuF8R(a#k)%nd9zd>{7&PKOmNtgTWT7MxN9H81qC~EE*?$%97GErw{SRtj z%CDV12}rlHm52btu=0D;omduHg~}$+Lj>!?szUD%}q~l=F~hjInF_ zW~sTUr&aW;$jBFRC@?B@P9O*`8u?1^a+= zUghBPjB-V@{n!2vHZvVHRcYaq-zA@F&vk(;(P*M;hORV|=s$o>*41$8sV~+SeMv?E zOmOJ^82>f;uI9e@AS~*H4^@I*ukl_FfIGV&u+}OQRXvB?jW)X9Ld3t%`*1~kv)y2y zoX?}F<^)l`n2AnPe-F8l^lvA>c|*#=!T*?6!@269q3F-l9XBXv?jWXvoQordlBiy_+nE29 zFw`3fecHE2&zK*QWi_D?^o@;rE-hTP8n-KQS^B~JxqXlK--4K)7dzKXkM27fk!}VM z=Z!Aa51G~c-U*g^aDDe!z2n@kmQ-t8;>5)bEL2Rzv|#A;G4qDq25h-r>`D(lLb}^9 z;LdGKc3XI0dwyJ#EvrkN7s~e{J4c6|e})sxu~wRqxNEt^d8*@=2LBxx5u|%VJ8Lq& zS9+)T>8hg>d>)`(xRTASoF0Yzfw1rhhEoYhDBCug9a?N8* zESEkm)-~t_^!|I&uQ{%|uHuye8hIu60p!aW?*=R!k9XVt@Y#{zw#Syg#DzWXcJx-v zZ)To5p`C0RHE^@X*nbLn63|T3+4k)|!~9Q^GSE!3fN|;v)&5mW&{fNybdJ+*6<6;Y zXlmX1cWMOVvi2Ze&8EOl|NJ{g8%Z}{`v%TM+;`X`boxtpIprBNx~+~_YfA6(dZjgj za3rC6JRR{NI&}CXfCY)=qvts9p0R^4D}6`;7@yryQC#?$9u?)MVE5NJ7zI@70*`~# z|JEl{)JMC5-tjfe$}aJ2V!O!WW92Pa>4pmy&$dG3Vu>k(E5GVc*?hJT;YrB1n53x} z_H@V}D&tOgbU5|GP)<(Hu#mW<%>4D(E6i6J}yvVciF6DttR%;u~a=G|)l}=7 zRUaMEbGr;0Deev<+MXN{NT&l%Si~x^Oo2lWFJP2HF>N`0orEU-dwV#w2OnjHqS76Jf%AAWhwvmRD63Rfy_6I<5zbm*SB%#{O7}{ zSW)A36W}e1v{88YYN6MoH^tTyjI0N6#yz^YyZP_LD$leG!S6WM> z39gW%RN(#fQDM?U^%|%jwEBvwDG2o;>)LF^U)F!Ig<_^<9(+ zct@bE?%7~$WJ`II?bVm;2NI>@J<8S}l3n#I!&gQ~vmQPFNryhtl)JSSJB}wIOtxY_ zVh9#tPqWTE_!Bv@%J0rpoiOz0fSZ$b6e=7$Y{W_T&rKiO+t_En}J~ZOq^>&RNR)&tKH>W=9 z)}U*A5BlpzjNYC0?wBDhopV3tbfHeqk(h^%rn5f{y}DH=;SoYgF1`0nV}NyKzcNzb zk>SiF$<&CL8~}#(*X)|x-?nmqlVWZYW?mN0|2U?nv(*4lu0x2&0Y|g{pEYIa)+!u) z$ju9D+rL(EG>$ZLeiuEq+jy0Zu@X3)IT=ZyR}H zD|xj`4D1a3`sih>FkTnll}GFoeQ$8YT^`a$TdX45Ev;QEiKyI?XK_NRay=GrjWG;;*9_77wI5L$?u8+flJFIH`=^o)t zfno)S^07)Eu{_>Ke4w{!itJj05EPcgp6zGrdDQ+2$Hjq{*M?scY^Rvaa@l}k~RDXNUrd%xBMH+M8^XDxO|ZU{?B0C zTvIL3C(UlQj9F}ZLJaN?u$6cCD-hqD3L*0*vU&#JW&&lyIfm)Z*(dTyW(0bI^ctT_ zH!gY1g%XEU#gu3gvC1aMsWtYwQv2@}xdW|gB6d$QnP+&N;C*n17@#~7Y^b{{_pPFt z116H%VREll{wn-!twoYgMay$=3ka8ir&8r>2wG1M)jD}}DLB|7osR>$Ds8mFr2P|W z2LrBx{GME#dVb3)e_@dZ zFNJ=6GGVZ%{Ylt6YKuBSZwV@pg8`0mv8GxFT+0okR5*Hq?D#WV$>HEx#lx`TORsc7 zP-+LiqxAQ#?`?pPZBZ0v`mTa4>@QKo-_&Q}#`e5+ptcw6(m#I7+aa#NyXQ}7k$R|&2!D!FeEC6ptH z{z7Oe@+@YdQ4^BK{L!`3pUt{!PjoSN>OIp`ia<49!u-c~cE^uVpYAmP>HX}@H?DKx z2)$^-_VnlK?rBki0V6RbAfVJ{{I_oV(#i>C^|w-YtB|^pG=+6DE8KCmDaq%M^^L4R zyC`QB8;i_JCZiOj#uVTQ>9&bS$M3`+tXPZQcgk;Z5|2`UY`?Y<r zB?fg^E>9<1u?IgE?Iw@~q+Fnu>CdX*ayK^d<^6;0!RQjNRJ4@YC9@rIU0J&5rN~8N zOkm@Jc}4r9Z|K~oNw2G4pM(+9j4So@C`?S7b8#ijrq-puu+tC0ea;fv1i!wUJCD(@ z3UpW8jIKSGDNt`GpO)=P@ar|Q-K!O1Kc*+ArQP-y4({g*7Wld{{xu3@jq)MG!xf)- zM3z16gP!%)8XYAuG+f>D8tt~FBPseVHM~@NK#^hAlF~vEC&L?Q{$U45NPM7WZW744 z6Xzd%+2bxzeelI<2p+XN&X&i{-!uZB_g*J$?RGy5*p^Vfzs&M|Xn^uFM=O|#&D7TQ zpTy#ocZZ56uUqkH1lcZqhCWF%kuiA+E7{q6SbETh6r5+QcBA7Ceq4n4IA5xbQeX2Q zzm}!ee&}tmO^3c_`u=9j=7iPV#@i>U)~ZO}F>uo418TpG6fJAC>2}nC%3e|E`lQ@) z+p3RMLVADp;IX^%XWcPG&xI73$B0$Lu88=vqBmFJ^5|q$>gwig(2q;e)A#Ly*S@iD zwR%N*qUYapfoeQEShcTML`gWKN_f(29sxKEloA(|gws!Z4qoj-#?c z7vyG^W=RUAJu-|p4a-s|+s`@YtQwhZk3J$ULo`)S?zwIT&$apeX!l<(q%FCl4){iE zo{ff6Um3}IrZQd|1<0Pu3T5?QrTx{)gEnO7&CqW+cL{B3R6HBWpI}I5wxbI8ETl|| z`oI@ydvZtDGweey25D*Axh=-_7JBBEwL)bGhIOIFnG>@=E%iN&#kO!z258)B-D=-X zY?VvSI7h{%2Mu~&Hl#5V_iOYx@86=kdY{Au!j)75TkH^zK73~8+N^jI_o?Oyy6@FA zpY^X}62JWB9(dK|_^YnmMefRKZ*9bZ8CFRv_No#0(~LXE7@>_2E)$detJl{TrreNw zs@}aUzl@h2j-rB5$(&WLt8de3dR3Ba<0za&1r=N|M>#K*Xa#7jgBJQt=rm|@U6Ngkm>hJfT7ut#TNXB3dY8@*Xap(0*yg7qnMzr7K4k4l zk(CV5yc{^TAlhJ`f(5+gwmG0J5jly*yr6k&bzf1eb{?nSSYBN>cwK_`!mbutmeadS zq(3W2D1n675Nxv$3JLsujI-c%P*be2i8CkIzZ*(j&F?WrN-HqXvh0FrlGyD*m{tk& zL0GUt74QV2lPX{1;?4vf_Fx6S>nRp`Awf)tm4U#smgQpqZiO7FR#nyScA_mA*cuDb zoezCxSf>+*C-^2!L&pn}Mr{?B_@-?;^KXZ8Pj~Z~X+PU{S(YlkM6J^<*_M6UuU1t) z*~Uw5sgK{{1LW}78&%v05^Aj{f+L``CkXnPCj&L+CL$v>mOpWxO62M#le=MS(ArpC zbKQI-*6Gi(CD2QInxILmD2e1;bCout-+NFxqirtdU!4@%0khZ^k{dq)KBD)|Ys0lc?O2 z_Cd%R>1*Sj#Jv7~$dF?PY=aakh@~wVYGrsL4qQ7YR1%uDt79FuZ$4xS=?}}m{|fA+ zP#NN|k3O|Ld)LHggH)Q==_x+swLywLYdTZx6&L{d|KpeVRB1l*$UF1gmCZrZGLpn0 zHhvL!TRt$S>;R`_)`W$y)vJWke^mygX3?}IlDFUqWh*n<5^}NszO!yLZOMivw~#?E zV#0?dNl3q6lS3!T@j<8OU*gfgc@U%SS=yJ%Vx&hF`=A^;jeS3-36(B%>+x5kecAx* zFUaIe#1}_f;{9#E%o-_VCd7pJY>Sk+YxPF~_js3R+r8`Yws54LO18A6$k2_Y*T2Wf zTso%ET~Ka_`E#wt!vZO_~^rdJd@p$B1a7A+@T!0gH0$eR<9{-VeoGH&sSYZO#AM z3A2{>RUasoxJ56>?zeyjxrji?@y!rs%x4oA^+UZw<76iy(9Hwd7Dk??eJ)bD zO^6Sg#Jky*!Hr$(8(7w^pV0?Tff;*)RDf2Ktn@7y|o z`U*|_+%yEqSGi`ESQjn%YqG^Po+wAZWcZi)SjrFFeR(fZajnXdm83IU)mp0cQ=IJL zw{&%@bKaZn@|FvcY#J{OKiP(F>ih%R2h}Rh+)1+Onrlx&KFB|LKZr4RTTRe{5v=tq zslCM(#MXAi`xsZeX4M+hU4#J9>}kvC@x-R4LQ9b11owRT zz2D58_ufB}IrE%3XU;q)S+n=rYwgVn;_|OA&K6g=Aih%v>bHqBiq@jdK z<&!Wx$?-1twv%Pilj2dkDdFQ6xn!yH-5#A*Q29n;>vb7s`O`{EaL)6)N%8eh@~k}UQ?L#eE5!G zZ3D2Q%3sd5u=Fmr;^7kLfSr9V^0LBeuT zH)vD6;=87uL(WyI+KR0&aVo730#|e-e)+n!bqq@d>D%Sp>+d6lgGPO4VL3F2uU)4v zyJjXaMfHTJZm`avI8?o&iDP`#nLCMkV4@qx_@$1wrQgrNN?XU2I%*ILh_ivf=l&_l6qQ2w+AJS**H8Z;Zs8C)J@8Zy(YPW+kX*ErIm+xQdG zu$@_zRhZQwks;nB-Y-5^j^s1t>LPYmKHFleCRpy0HhX~3#|zyxBx55oc*S|JZ$f6( zs{!c2XT7SRVJ#PzTVwlC;*&O|^E3OSo9^}Y)albZb<6fD8-_b=tF(K!AD}a)+;o6? zV9E;oS^O!DG_H@Cu8w-y5`UKRm|_3ZRwb4REk^<1W$kxtQ$44RiW#z(;;vE+4)kPK1c_T)TEbX*NeLnS#1gwNK=q7J) z$-?LL<6dV$YrYjQb7g<~11yUdl#Z;1{SnQ8Mv8Q(3Z8ug zW^Sml&UqH>@q#)_x-F|T<9?~$SoYr6+>QvlOX6eNOt;^W)mKJdMzm&x!$-2~;kK7Z z2Qi~A=^1m7JLoO;b#fpf1E=6Fux)iFOgua?qG7TUhkC_cMbEr-GS za8;eq;mO{-glv3s2NiN09$)qjlWQ}z)o$WXY-^q+A7tI_S5L_DA}^}KW-Rg0h`Hqp zlj|m~AsV$0f||}3-$(D;)v^jy)SZuQZ06hEoD5bF>nqhjK1fbP*RD-1JR>VB_44Kc zefMSqf!_pV-hu)H1f~UJI^Q?w0C6Z>h%`+YS{vzTN|8j2Yyxh9VKxAy4T#S+kOxVAh}-8{ za$9La`tkQ4*`g%sx9#yI0lfjp)yc!%to7DEe})*2 zE=1OHPxE9xd}|Harj7y>R85Dx_un=;tIM&F#)*sm?^}xC;FPF8!vm}cN)V3FR+SD* zVkQJ}85|XeLrgU1~@~EX-N;Ds4|q`qkKa4qr9d-|u{(d?sr;n39{E^Bc`#u8zVz zj=C=dNy|fi8@bQw-kT+Z@QlgEG{D;>dcb6JThMz=m{UTu7~CTzP%NEM7b!XPeONV( zdhp@#&Sa@Iw8*1hU^%<7QCwL`iUi8Yoxyn|PPg{<2K)>(Mv zap9ZzNDY|^Y5VCV`b=fXn4Ebgqcel%1r#t@VN+-QeKw#uC!~6)ef!&oH!>W*Qvn_j zGjfD7fzt5y-FV|4zOG4n#ZO{+m7q5u!-K0FOaet&YJwI_Lig=~I}_r1n5pne?fOA` zLi2EI-z_bExfcD@5!XN0sU^bS@z*V%g})9jF|lq2ZF}{SSgU^)p1g^Jp+D&AeU?r! z_#3}2(Qc4aczTdx9R<*{4cgf%-Ty&8*+Q!YwfbbDK*0_U_thsRys1lv3b9JgWTNYj6oka8zqC;*^-*Wr;TkoSy(;tUv_+m>n* zC`$-V4BD(Xg;7302Y$G=4gqS6```6cm4uA*7^G{wl)L@Bnksn{pq6E$E^}S>GRWo+ zLG#`r$MZ~GeZ!^7yY=KJ&CxuC@An5s{buc{bE7)MMJMg49loDb3C~%$_h@ZLAO^3y zp8{_Pfc$v|VrWZW=+AQwC-qCM(|kPnqeG=t=_dSEb7XKZ*pB3FUz%X97)`y{uwz9W znO(``5Dwb;xwt0eEFP(8%n&?j${>kgOXZpYr;k!iI-YQf4)<&DPnlF8e@v1|E<6$I zv?=~XE)mx#noWsv%^Q4KQP1zBjqCt#LM2)GFX>@Jo8k47tm2Wi0uSPrinJe)uN7&> z{-g3G3TIdxs_wxtnq_666#G@T_u%bF=loc9t$~;BT>=x1UC5F1dz@NC2f*{~d#qpP zI-*_Aa>DJ@auCjgRJhYpm|C4UGWyJgikP6Ru){;f#qdz4P!CcdJ8D%#Z|j^3L{HQy zl+xwvdr_FaDfthpm!?DRvG4QjsFn1_{B&)D{4rl^98dd_YBW38x1dPAh(axlusy_w}984RLqWx-FPjc}qfMd#PNXZ_-SKX|IgyU5= zr-PM1zYVyEN#J}?i5<_bQqn}4D1D^kwE0RvcWyz;Fhe;t^2Kj1r*U7=r5q2dl`ks? zuYA5evP>6wZqpU@bkbw5U{KP(7Ud;r&LbRrRo*of z|1ghyuolCi{qPuB6V)W zudv1ESVHGU)U@tK=}k21yMu!I&Gekh32z*~+{Kut1R;OnmrMMBkJutjyFl2NqDV|* zmX^b&(p{r>E-s+r+9kHB-!JA}J0nfEs&rCGY~&OwaWF*H{%(%xq%n|obff<3>bHM~ zBo{}KOcw}{`;5;8;d1CvRRniljfv>z@rOR-k!;qFg3V60$;&$h0^7-{UtPu&Vx+D! zCN6qe`-J-x;_vxrf{brXFFZ$AnS-o&t_Lnhb7YmXujYU=7>na!bp;ko-tJhFWGuca z$8$yPH8~19;MxO@wFkYN-ihX?9ti@^@q&&uex^%lo?mbc*+>-J_4=tAo00wpB~iI; zQ~y7d0Iu!*!+VtFSaXBtVbqg#EH|eIcqzP^-?K}%tp5v9Sa=OK<6Q6ema;EyH($PF zmBAW8pFzUd+j1A#sbGIa7Xts?mPj66pHZ(I=h8AyZkD~qLo-;kp7%Vt?R-A;B#1U< zA5Z&zePHDHsuy$WvvNac++P7l3@jm24ILp9Q!G?mZFflZ)#Jg-=T22WZzN!U6dXe^ z692g{7QG~+E&W>W8+DSXV8+%c7S_LutJO{w8zIJFs28d`W%|(1`&5W!Trt+RA7(ei z8FF<$*V9>D6XtJLY*0iZzt88FvUm55h3nd{dxrDSyZ1+v4oo8uUfXgaFLyRTT{j7R z@JMCQg*3M$YsYQYXxe$+%SD2L!6Y1RQ@+9bpT`LqFGD``)m6|X=BRdFel#h>%3IDD z%aDbx%WWa|;@nm27a`guEKr2N++ETBB;b$e+8q?a{Xrni0UrnHA*Qk=V6@A3d@BY^2F4d?a$xJ-xG^b$@_Y9xm zXo)_4#q^8mca0X}aM%5wx2+(reU?n%>$Zy72Gkd~osW8v@zfE2b-2SbQjN->uUzN>|F~ZMdfwGbsdzsda}gL|F_AE73$Q4 zJeUyVR_^7-Agu6HavHaAWeMTE@mu&uSK_zCv|cvyKw!y^m4gJB`2jg`;|zq* z2jDT|neBAo-xvP%&m)Rw5*w~~T8SO4SGq=Y0{BzzEQ2Fm+pQQa%v!HQtuE=8;AJ%W z>B=!P!1TUMff()A>a8mQewf&$KEs$O0XDWWjGu`Ls6g(xlsH^U&O$&gM^UEGc+gRF zb8}qXPEbH+w+QbnB}ke zzhfrxAi*f-^2Cwb0l94nuuAT0WHg#_S6l6OyaX8Z)KoGSPb-CV^ZF6=?Wd=;;cwNK zNQ@2GV!RPr9TBhA%2r;634S!|X0~SkF|{)n>7)M}v_n9x!TCcoG^;&dH=-{=7L?}} z;?C>?k$bbRyMSjPXkEv^61eD8ZQ$bt2Pt54x8Hg*oN0TB5Q4#kWVu&C`MGql06+K;Q+w~$2O#61*VFS zaIk%hEUI?AmGdcmKxPeo3zjKJND;&h9&Ah>O`EAQYICn9XHMF4fXoj1_0@9vv>WbJ zGUlNd(4(8?ghs6Qu}#cNnTc5$S+J}UwEB9+8_%>8)=C6`+_RaE##p;`FLM-)e}G;H z;&R&ZGP3-4%h#`rvV6Z+G#WHPOnpFL`B1>o%LpHEH?iRv$Rw(J&nbBSi~*5V70nu> z5MyalDIp*cLfbKOH#gq4e=iU$crQ5j_wcc8AEu8I$?6T8zlGk~-fm2UAge4+8%A0C zh5Hq@Om4kyy+4*;qAyR(B0~;???3fYSR6yTW-~hzJU+Me3L%{wM3Xta_x*JJZX={L z=`4*o+r~8lqEBqU^rc6sv{BnQ9M;pX0>fr@b*So|GSRJF{X6Zs&q>Pjn(K5dX5-AQ z=;Y(3YTuRT4&1N4J~qM3n^Fj0BBPq`GV#&Ff*Z5{*C{Q#pV- z3x7#y>j}bchIVDZ;Zu4?bfh&d<(eldsMA-C{@GYvI>>TjfK|7^{u6_voOs+NAn!if zx(_bV>wt#*{@mLG;f%$zd6jdxb|QZ)a%yZId1>Z5HCRH0b*oKVGoG#i+>2$pWK|h=i@GZ%8{e_^ke!>KITzgI;-4AEJ@(YIEK!Z{CK1*vP>nPYA1_6jK1;%~KC=6pFr_M7}IFge4AhL`9&DD1_8(Q4SnH{F?W&jnVI2YK;J zjIOU)3$)|jb6h2BPaJUEOjy2!fc*+Q0Asf)(uuoy0-k|67yNWl#Ltg{KKmVs$(7ws z2#5C$A4N;9J*6kZFr7Tu%5-Qiu4E1z>CV2@U);<9cSrs{*dl@lzxSyK8V__%zV*31 z**h$l9@kyNeS=-&CK9#4@7pcTREu_so3?z4k;JgBJvX}nk|OS%;tu~rIV|&5`>%KX zZmPhDMQs&MQQmke`_Gzd;@S=+PgL@*Wjz*t#JlIjP~L)A?**|sW+i!J{`w2@zjES# zjU6}HEC5YYp50i?SZol5g7_`4slr@M4AKk5$H-8Iipj1TW7Yz14b=YJ0$KjN`Ny?k z0=~EB50-#7RB-Gxn+E^m|7`NA^+Gs!ld#{|*!EMhHmDPgw<|6N`j%;j%6gfInO4Zy zwRpR9|IXAK4p!QKSuX~k(bp(3n&jh*bP+J|nBhZ!?L|4>dOa3nkUfI@1xcoY1OBIQ z!>DEp@Hkc=iU-GHdNsK9ECaUQjpy){kJ=G_B?qmp7&HNE#o`~)*74PUtN^))@z~6= z@c$8Xs-rqV;u|u(M;~thFNzax&>Eu>-;4>H}DU$Kv(v zj+HI|a(0GqpVBe7+EQ8Vr6WEX<$Tdo0W&d327j$M(WEOC120gVTaAcak6DO=OQ>(t zcyV<~{#M%RMy#^eshIwI>!+3n6PQ6ivtQ9UEE_Qs)B5+o4xLiQc%#eEQ3TsspcdS% za@BG&4v|b4>a`7IxXC;#*(0^Pdky@sBl;d2kEjg+M{BujN51t5d_##&71&#DRU9b8^K?+d*iGvgQIYOkXV@rVtY`~7 zTbLDvHk|(U*fmYVSM(m7>{cqmV4OxFE+=|v=JCv^*Nus`8EE@uF6sf^5A{RSXFh4# z*yr0Z21ss+U04M4zfdS=QXGNUS#W1NbTE{=ln_7+>)a;ea`;c;W&|FbIXfUerriU* zbBETdH%{L7sIUB2xVxy0n`yi$ur{7Cf0|9v6j!3HR{L{NYSlm-yn8^JtIR46mS8=A zCt`n?S#Gb+OX5J=79)^XO(d?^nq1=!wph#w>(8iy;2LjNucZZ4S`cv$_dZ;s$?*YTMi~}T~AX$z~g+U020S8<6 zOBiYK$cRH4a~Jlg5Dge|K_%=Xk$#pxrtJ1XD_+ly48Z<>!{qs3s{8^&m9*oB#(qwa z>CMcTS8^TRe*bbg+EadN67k=P!TQXVS9vl=TT1{9!S+A`Y`w4BjFjS?_SaE6Sm9`A z>uy$NhnEd)EDvQU#as2H%}ZYD`ae?<-QwG3AV7AA$y$R@F@bucn%##X;mq${5`=z4hIF^;%sLL+w4Hqzh7_Hd zlUlFzQ^o`*AFe-uM6ni4O8tqvu|xK+rclm`JpY5jPS9}bK6`av_q^}t~n^X_4hu&tL4(0g!(;O&u;WVt4>GY2 z7b!Jxr@FYAwsbtIz8~@bv^8;~ko2jVxVQfY5u4}2(}O3zvb%Bc=Be8HneE=9mMd^)FrrzUYUvrI0zVLkQx5^f$2CFVS-4Wa zNB9&n!Z{jm>h55)uN3tgKH%v15*UJfh)a@Yv_p*=cIItJ>3fL3gNBKJ*?*!DF_NDl z<~!^Xz8mRU-R{MlTk-M3=}F;S5%{Aq0>}tQ3Tw0Klvrpqx~nlH#|<1L`sPCvam1q@ zKGBMp!8*dUG+U;Cnf#uK$jGqo;Q+R{AaJQ@u^}_^ufc_GGLFi|BxAOW>Vdkd0x&*e3y~Zvm(OMTturxu>icJ%2mIH6|0+;$} zy8XiYeamN=fkMZjW^Am^O5x8G2xOCZNv@Q~l3vc-C{q;5JysPIyZ+t;$0f2p>M1c_ zv%`!BvEPAjgF>DM00#jyb}%0X>}U2y>wNp^AOKil+cDU7CVZzIGIe;W&~WhL`9O=~ z?^n`BI{mMamL6AXEM~2l)IQHw{mkXZj+g1f?Pvzp45$=s#@>ufJh*#Z4 z*J1bhmj764cR!xz5eBbx;? z;#Zz|rgp7sQ&D=YoQFdJC-Iz{-a8YebvL@RlwPocenE}<2K|*4CCbd1^ zspG0n!#vcvBkU%L^@^#NPL*nR#aOm}$9P;aVDl)iQDV~I=)km(e!BkU&E-_V6!#RD zbAkCgPyVt>SiXk574&7_!+H9N`w{EU^u{a4%_a!}F=zdSoT#j0Tr_dUk>DEYpTiKQ zmvzHral+x#`uN)F+Sb}(0-)O9C>fo7hqaer7*jCu3J1YgH9HyH?Xu4>%nAyz_=+*q zX4O;*^w5V(YmY<|Y6Qn{dDWDcBb+YY`+~j;1lO(hlyk&;6#HoI?d2ZlP>ugEuu3EE z+#`zo2K!1jX+~Owv$A(B>CM*w3;sFd^4Id&N8dP$nQ-u32;#`! zKqjEW1pE4LXq*3b%`tbr{ZDvC^}TrKF=UA0w9^sC6xaQO*~Z9Yjd&cPH!wo5C|;Zh z$ugvxP6c<%m`L>npU8`XsfVu$RX>vfi}Aw9YX9QkU`}7FDjAm3i@8n*I=$a4#O-yE zCJ_5la1zR%#&9a5p+vOswshb2*VDgD*1!7yOzMZeBS$=z>Z0mnlmB(p@}+j~D`SOf|aHOb9`Rw`>M7)tro{h2cL(yFR5e z&v`k3DJp{bhXCW<;%Mjha=!M`oHwKh>h%QnZj2@fQFiw<(v_E=jn9co4EXYl}`tmmCfObAY< zwk7sU$zd+;ghP$JsLEJ{Mq-~i$Ndjx?0+nZl&I!oj>j#bgV-GySj~LE*7L|bX&^3_ zlY}XJ>C^do(`^MWQvv&rA!kgDkQ7>6=uFyt<72hyu1YEh8B17LBPmh(%~fPK}zqeVZ#~Xb#3oorIab= zFdr^dSCe}jXSE4seM}h0nkB3J>+oxeWVb?Ti|A)85S{8bm%s4Jlkm!EIn`Oo5nZ|` zosJuRHY0zgNX0o_ySY1M)|R3Yv&N;bi?R-5bYnxbY?5x5N1mj^6}DB7gNjC_$)o3qhz#c329S=C^T7O2VfU#5unXut@* zbuN?0N-+I}4FTd6U6i0&(x%xWGlHxtJ1x6r32HJ;X*li}0Y$TBWX&f~@DC3cxK z7R~76a9es8rdRaHXsmbX-gQ2-(pZXPZKR8&3eR$}aK7;W^X<@U>0p5f+!&j-pZ#W8 z`LhQ_^h;N3CsSAjbJc!RezZ|zpY_OY(}LJmiBPuQIQT_g_STmCDXo2Z@cS@(p?kP~Omcs^s8ZQK)A1M-Pj|U|wmZMh}ZZ?NQ-6mVyuL?6fPk{vA58grq3$leHX%;r167po8> zbLMBEw16Hc6?oc0!BX^iN$?05tX>Nj-&Oizazd^f;pYBj7ITuQTtuW7J24tUYylQW3)#bP3NsU z5*yN6CB(>R^5Q7a3~v6YqzN4yk9w5_crQhLBGjeoLM%jl`Nc25o2pV8&o<3i1Z4de4c}DHYz@10eQM%Pw2cqt&WC#u?br ze_ecz`I}eBjPzt%)k99KzKtxS>HNw}wEag?Q^cd1&zt@nB2DGoEvWHhW?QA9XEH?_ zss6IF=B?%19M1IZq`C?FEHmOz0FwQTo7k~Z3Ht4*? zQkeg?9BObT=oJRu3bKe!>gRBBu08A3ks}Fc)zx0&@1q|R^2jrPjV>NuWygxvhdh<# zP+07ab-S|ufAHi~P2xEr^M-jgjyBwb1+uAvwF>{UziWntVa$Lt^~ zbKh78+TYjxP^#gy=v!*PeLnc&H9q)XQe{kdm#)P z_016LocCA@FGz9X4|JOWlj=C8mTV8rZiIHO?z&{^Jy$-M|Gl{Q{ru)Wr_KRptFYsV zx&H=3tft$_jft*cBw0KFLz@*v9>QVl zPyROl@Zn1|kAi2=iv?=o0TfTmz^QBV+%7fl_)Jf^+6wU#imIVXuaysPX!kE~HnN7y zl6DU8)cP)9AL@51E|?=(1$W=A@B91GLWeF&3mLZz-M$(6H0_=|-i#8vmt^tnbL(0? z*A^P*)IFqGkq8J`tT`-jksP`gYBbLBi49UZTK2Qv6VIjJQ1zc&vVL`tRF}19cPw@E ztf|GUWhDC)EEUt1DUTV*9t_@~y`uDtyjZQg7HP`(WM`+%FZ^#%QlKzxk4@|7t+@2l zjS0KCcFv~4QHfN~?D9_m@|$T_K?m3YA{}3^H2vM2Viapuv%byd6pTt(_9q&&RvknD2p_~)ZSBtN8ZU&9) zS{`YG8k2wVO{taVd)OJ47bRhRPeXi5khfUkIHvyTJG=8CQ{5X)!38ZEpGfs|iUqjs z&c7r$znkBLIB3CDh3HEadG@0zR>K(w%_Nscb@u~FRxJ#X&*O|AiK^(9FN#v5|CtM4 zlSwTdwjVXQT@6X8nWfVz6-QUWF?UOO4$r|)se@|b@s}x!;g;< zf=^||4CS+Tw=tl)h(C$O%0oxltn|vCcP7KwhX&Z6;#v6oGEAEaA9~Cv4u&>1)<&Fa zV@cuNaJ^w5f}z}&)Qh2fmJ%wtY=Y!_F$@X1x0DPCTJvIs@!W8!xTf5RLTUZjS_~M< z(Va;GP>Iyv27)RT<7To;4CO~jK6z7TH9I`bnsk*|?}TFF`;`w0r>PG2a&mU}zcNmF zJ>zQEwmq-&u1f8C7Uo5OBj!WL-*WA)<}byC#T3-ClJcLr(x>^EFAF{d ziJwcUz+SAs+HiaSr3*M~*(aNA{57I8e3_|{$5noXU~ouN0ipo7!RH;o;P8-r`)Z~l4vdAlqZNjrDg+sLR|T9yFv7H#@Z zqmRY2e^V^gdPb4Y7RY+a#(0k?3qsPDtWgd1Cjn!1wSLb}=f%OgXAI>h&Mqq_pbX60 z>}uz#r)uW9UhMgdMo!qP6i2wt z%X7BVGM8Q3`aklah_6j#{iv|^-qlmWvvGWBCXzii&HU*XVm4@6I4LKc@}i4>nW zuA7j!Xy2rka><#mi-x7*;u0;A&@<%sE{Yq!0Vz!vHq1WVCvkstn-7Kg_ZYF_4%QGc z?L&O}ozTuvfj(1_inita zWit{hQaNar@8b1i1ji?@Va>X@%`trJlgunUNM>%x{uA|p)K>vw^8t8n=YfN^^l{YX(j)(%v=Qowm z!oBPftWh2RuqS{vNGLL#?XXqhJok5n$1l9SkP_4)n(A4_AUEKbj4tyov^7H^ z&_?Dm>-f@276o$RPg?c}89w#PjppcB(Z-x@8bWCW+yg~&qP#XZ+DUvmIr@2=m<#b- z!|ZCnOqZE65N5Q#mqFL0bC}p;KwV5M!dX-!cD`c&d&yMTAVaS#(s{qjz{7qK`Z zk{Nf4DZGq`E&i6P?N0s1+9;-t;ybFo4%dDCa(-*Yc^EOK7N=|k&3(ODvcXvXGtXaV z5MEf5_x%G+%Nkn^&)ChQ2OMf6)vB3LZ%A*>>v3WMlRpw8*!j~UL$)Rz9Zv#3o>tap zjY=*$4FK-8y<~KV|2c`V)l9V(b2pShe}jSc3)P!xb`(z4hjWfsX`d`S4ri^k5 zgaQ+r!$)cMOJlh7)ZSeQ4PENw89CRTFa6E36<3RkX=FHmF7sx^GdQZ$eRy9SHRUi# zdi^-yNn6rGZP?WKe1C0PkalKa+_;pen{;|suAqGKD7yf(mB9zeDz8NMojWC!N0y;o zaEAThRQ050@N!SFJgvDLxYYaM=>Uy$99X3z5|>D*zpxOe_v zX~j^U1odUxul^nRcbp0aljhq{Be|{Afkjf^g7+pXgEOi3ugrQPJi8|D>)VspUSmAE zN1ji6FLpF6M39SG?|u(4(b-vuprrcu9pj6)M#3=!bSb$rmHntk0OxlVE)h=PW=PB@ zrg|?{8@`c(a#&?Hd}zz;{P4pDxqaA7rMo}D8QCdLJ2}q4Lws?%0u%(VTo-G1^NQ58 zYLH5$XQ5{&L)hf-l#{^}|<7M}!tw;-Y!BUS@pSw|GV_+;!i0J9;Niag7# zxJ(88t{9C+sjZ?-HT2D6f-m37{;(01l25*E9de?qwX1~>wuZpf6WU~1ps52>B!(T71fZJoXq`$ z$YEI;1%M^umkMXfRDr^_e>8xC0`$9m}ER&Im zd({^ zjX(apUxE?=ED<`v4*CdEv>Z?ZDNHzg)uJJx50^Z>qpzQk>g$9v>BXOXMe!~u<;g5O zIKCXFKv?+o4>PlM zljIq#yl`N9Vrv8Di5eCpZsZ<}_tv4~I*$$L`{r_7$rL9b!gHb4FX z!a&zK?GEH(K}l^$da-n>=CIK&sY2GQpyJTNQ`=EV6{LN$iWTiLy$e4ldd%L6_I(_q zE$a?`xt*v85f}@xvF`jks@oltC0T81tBI1?)gvyAaPIlvlhk`n?{bFcRgA6D#viSI zWj5Nue*SZr`k6nMMu{!ta zaCQAsgH`rS5DLV%a|Az|Z>BS&1*i$ozOp<&UV5%z)PATRDscicuw3Ff85U=~FMxJo zg(^5nYXru(Y_Z~I?x$Roh{Pc*LFGuJ!RlXvBIWE@0w75ACUgcI9vK~J=p}xAz zgv~9s6Zg}8P+p+gmtm`aFD}i4VOxLve1-B3S6jDsJFvv)*q*WFQHSOG;Y2yvFPN6| zcGiH!D;?Nk`Xb*~jC+dN@6Xxjgl^l< zpI3EmvS_Sq7{yr0<&vun`UuDTP2I?2mBEyaa#sa-c$VqF=Tt5+&xm_ zKUs1%rRgx)s2x(_xHECz2N4o?NuJmdba~5qiPazfrMzV@=G6~-XR?w!cyuA`@85jz zIU|tp-{;7c`DNEs^4=}}!+Iw-skW^@^X7_Nnf^wlT1e0;!7d@`d$~SjE zLA$Z|1EjZfA5>lt#9a#CXLr8)fvSN?;Y?kh4>z|FbbhYih)_|(@$57=WfX2h_l?Sj zTvHQc0y>UTNA3ED{(@>W0%UVgvs11RMVV5~C02Ik`M;6*w|z^lrEB0XK|9E8N} z{xLQC%q0j(GA*gqxKZ0c3QZRL)wHVMvf5W2ao~6Pv(Y@JlT@v=G5ekDi(X0oG(4+e z5hB5*0w^yIllebu7o~vH8&@W%h?5p7{Dy~+%8wFo%dFsx%bA;g=;6db({u-|Ke<_S zEq3UJ%y~M>z5qG}ayMpLBUG@V-gQ)a!T7WfW~0~1^?QckrdN4U1N|12>D~PO7BTz0 z)Kz0`vr8`8HgH&~!wzLe!K*^?JWE8Hv^HEc82Vco2^JeP7Le{r*IIuBm2&vqlUG#Pe>3E73CWEnTTTaJ_{Zs-2P2NzB7P}>dr7tkIrHBW@>3BS* zkxglMzh<|JWy1kSadJ)zk7Y7~TmMeBrpNqg1*B+!t?rM`G5Jx z-;MDnAlwEc96}6uLw^*d?!!)r?`pwhic4h^4w?ZZs98;1sxK<)3<0Y)_cJf$q>|I{ z*nT`}0z8O4HzLa)0EFc>=;I_#V;NvDFX2&{F>h!|%l;jKK0CTtALl=Uhzz!mA$a#q zcU%)!`#NrA2ZycE;K4A5>ucREzUs72eF4H>yZ=mhL(A5c1qeff)tJrs2|F{D6JEu6 zRznTRaQr%F*-1#BW6AV_pf73p9zl73hu<}IkmMJ8LwsD;X9Oql)1wdPz{~oi*>C$v zVb~tFpM2JSzhJFc@HkDqPLQtr6Ro8Fd#Wk zagutS@TXF6gmIi{5zh;iQ?O6zzZJt&P@t{iZ_LO>g*u7pgD_n9jh< z9D32!Be`J(!YltmkZ-2kTQO!I@NdB$f0&{Z04~c%Aao+_;&QDSURW=jj3(euRjvlG=mX}l3JHqJ4*9tp~qIUEn<>LI@6 zx#hj(yXC(XNF%`!NB4aA2Nj@n-+sfwX7gyCcDP-S2uM%Z_|cBfDV#N0A=)xpmoZ4^ zNMeoio>vKc3rZu*?}PPK5jvqg(LU$^bO<{9uo578FB&X%f6Qv8U)h(4gdwW{=l`ZSUvO`z4JG}NRG|(?qJ0z#FA18v$_63<5#w!>-%X9 z=|ZLOJ&4yRn-Bi;gM@#}Sh^AJ7rK_}7ZOdzTn-)vxToz#SMA9@uY0`pbDbQj-hr53 zsQM6hICl>dDkbv@1CgD zlkAOL#OS?{<3;@-`^}B&`HgpcrQIuT&dQ?S{`)s%UUQ(8$J-{)fA1Y4J}YUT2In>) ziYxR&_IWMKOgYSNT%DwI;1h03tN6GU*mG-o#KbIutHyQ_YYl6-c}H)rfX{VMS#iha zGh9S9v_lddoE`J zzW9a|ho))cM2#PbSPgCp)Zc~THeyuh$FLn^`#3$r4yi-jh}oT6(pR5RbKKugdLFki zY12>~iK;iWbx_3T!-5mTpB1;8?m8%tbRkuV!M4yR{eDa#?JYT~S#UYPON+ENy?Zh@ zbMFU-gIRG}tYUz0)QMoL0zh@p{^8akv0rKL-{;hx|7zW1(m z|6(l`=WyoCI?p=K{_g$R>HC_l-K_9{Ws^*C$0^hxx~bo5je{w{Rj$ibs!U`W{(NZd zS+kp*CJO715OX;6k+5ZVR;VU%n_C(oEx{wB$nUlfToc<>2KIj+ZXZ}e=VU>%(30NX zJCj6eQbqaEPYp5J-}5PJK6z^XCqpM>y&Z{b9UwiTKP69}Vs3wT#?!h*ku;7C@ukZd z(zg1zkh!>+xM(o`yLEf3Li)!St=5>cRZ6!PF*&g%exvIvl4tK&(?$uUC~4hVA}M7Z zsC^?^)N`UTA%FTk)$SJ$_s+v?MSUMR`WA6v*seHQ0YqFx5;duwxI+4t_r*N?B8WdiQAz0VDJHj8EhT>ak5$KHr= zH)X4@Vq%ZQ)9KB7*LdTF`;C(NxiEqv*;}|bZ#}+y1snyDI5Mz-{sbC(aiWKWsEoSv z0(B|XIOV$}%y9mV#8;*-!McZ)r*eAQ*Q9UehbUquuSZ)QWj{1e-*{YZ=WX^Ldl=GP zG6q+PUU5gxXxv=ZHKSqlpq>~D=WJ2-9xrkcRvL4O>udi_ zyYAr;+AUoe^AxP)aIg|kGSC0s)e^cb?y&j$x$aIlN*#Ko`mmmq;*uP($zLWNKWjQw zIU|#=-$41lSP?B_L;Ct|wiMmWQDohJ9`-_x&E9@`Nh7$pY};e5kG82#NHj-QKkANr z$ggMsvOp%3YIayJI1fP$^|My=AXRC0y1#4~%DCl`o?7%i`snQ}KAO`6%a6<}sxy-=_Wv)6@eb%NYg6;NHbEq4Z z%)rV}3YV<%Lv&H}b#{f1+qfBYKvF0QlJ|utf)pPLt;ihjv?qTy{qztA|E&KZC+GwJ z-d+`Jb-zZ-KF0i?l;?N&W<0hQe$sd7r}d3G-`1yg}}0d%Z*6XRvYx@}h0g;%3mnccd~3@NXlP zWjUCLWcx)RQa9a|qzq-uW_2kj)j@HYt0V;fm6QeUJcQyKy(nbk>R%|^YqX^383MF= za3s_xr<=X^k1sL*=|+|eAqI@*W3U0_W$S*8VG)SW!Ur_pUK(n^@!b#Y><9#Vwy;HK zGP2#PUi?7DqD%NW0>B0VebY%O)f@<>Xw*+mBr>daxW?B7vk{o4b=J=eiz*O-EOUG` zTqi$n9$wT%^BuQWEvb_43jJxEbXu)~BNwiC9J930+aaM%l*alg@BNC>P<(%Y6L<=zKXYKwPWCP;T3C;&|$ zz}4Exr~%8vX%Pr7ZY~1sug0*c<+zId5{Lt|@au*Fx_CuCTtqGlcnG2acG9AE8Q^~= zfN`^~ekuQk0G}iZ_i)GiJ^mVU$m*7K2^xed86^>y&Qrbfh;|X+OA|BGO6&(29qqQH zeWUZ5=~TN55L~6nq_(h0RqCF((C9S#n{$5dU+q4m(IPzW^#X%4>jI1ixqroU`O~|- z)}8OQU${Mr_~;h}THW)0WJmiqIE%KgKWY9_wZ`kkfwn3xiw)-6ltlsymsgTKw*ap@ zwBGgUphk2HHrxEd*MGc&&^28YKMIrN95r9!G42~EXVR`k9ykOZg^J1fasGycY14u# zW`9bDJJ+t(UgI=(c(4)=BEsfn_hmZea&}LxH?+QkYWs+O zEm8aI`C1-n`5-TGKPQ0~>4c;muP;HhM?tl=mA$>4U9mq74jXvdOZNe$C9reuqQ115 zGbGxNLy>I#GySL2OeG6AngdNTe3j1cf68>dSpHfKU9f3Anzwbnq&Ckyx4pZx*wC`L8q0w#imy3chu)o(Zw8t^_4&>i@ed(SBIH(r` z)(%6`Ue5MxAAU|j+0Zkrkae>GM*1CAPrt5j`oBdWvLo@`uYVY}oVM*YuDvYt%Ixva z@f-pYTE3x@!+N{xyWKG(8i<`#=g}I24!Ap?tYqu^(zP*@{&OKM$Ot`R+$y#*E0qQ#$we2XD z2y%0I30pZ2y78d1ABO)>2zOE@+=gV(=5hJ<>dOYd`hRX$oOt2YuilpZ0AUHp;Db4~ zPnPhi$G!e!zMMMh;DCoDLBs-PvvD*Pz*9t>^d@Vk{{{J9MIas*L zlKczwmZih^C?yIx^3v_8<$~%2jk3=ViC9r9754AwBki<#uyEMI$|iR^FTJNkS%pTx zHBsf}$cvpxU7O#gRh`-<#N#PeB82dQ!S^0U^ERR15FP3k@xi5W!TE5(r_j0M$mM6N zel5?8m=1Q@-S#C~*UrD4sh?$*f_rNc{fcw>4v0;Yc5Z=BWbbi8bzA6dX?K6_UxAkN zd*@g2+%H<#tF!lYU6bU4+1?6=nxs_{%^)tc{JrB~_7CAgy>!Ux z&9e}D{vYRms!BU&Y~-{+QZzqi?BFEe7bOz~Qz{S#z4|Gs$~J~8qEGKQRhcMLj28-L z)8!Kp8}N#oU~k6L)FA~DqaxE*V2R{FUR`^V+-HZm7xxpgIkxR$TO$RWGWpCOWt&eF zI=~BH@={RAcfxI|PuP}iLrjGSI%OKMQFEUXZbf>N4|SxlqHExb z=6NGULzT}!ZVP+xKjtSo&QD6jERUsJWsYT!<&Nc{SV0u9UHg5X#@aIdse{7*<#ifx1GvnPLAFJnpf2flrwbN&dVh7lK~ z9ylsqGvQxLQGC95R4k;?Uqa*@b^OlkOTZosR9huzasikO&71L--r2J61?z7FZ#d-p z9*GnN#@9<-8`vEcGnVyPg-Lvh9mv|7ae_D_E;z+q#;KTd;Iv_u zVpsB18@0;KV!H6nF$8wfP(|jqRfU}UJxe!ajhGjor)=XO9cQ`3>Qk@v%8&swD8@4G zzs*tSHrMB$Bw7dr8t5&xacvb zm!`i`Hao>t`p$AsOOumK*FG}WN7wT=AkNI?2Zo*j%4gzkK8B(nm`W z=#rHVV1=)AVKy)LyCST1gkv^ ztswg(^@F~f#Ae_Na*!?_xNc%xkv_rdbT+r6=V4ev7`|v>utXavdn6J6eXUW3u!r+Wm&d_1tDjiB6!{I>X0&Mga}*qyr%w+}?NC{xE%%hAAN zcfL^KB#0S&6`9hO(Dp{NfImGZm#KmiET3m2kK>}lQ5k3l5+vF==IA*_MI&#Q{i7B-zLmSd&HvnM zQ3!|Zy$KECp+g{NCtYu5q&x{SSUbkN6BX!aV%YsEIBTf@Czmtk)e=8+u#VDI^iN2i z!J3}jPTNBnf7j5aQz@o4#?i(81x@Gx=yPG`yX7ahuXBhgq88}7DXZYl0+w2y6 zMewigTv@?bPk(K^Ssy8l>MVM!twg~|`|iiblgh5lQV)DmGS1RJYKz`1{Dhs~G?}>z zv5Endl`^b~dM^3n-Tjw_A3W_^pBeyST&iV4o3f$d_(XAzmP%pH3C%I>E%$AbgEHcg zMv&(CJJTezb@$T?PG#YdjISyz(HBo-3!~}rE4S>Y=EZz%qz#Gh{5@BJkd8&DJ|6PP zIc0vI31DJILK-E(o6f_y1#XG4> zCu8g?U{eIPI_4i;nAb4!VYa>Z&%O2iRa_R~#_r7CMnLV+vP0m$`Rrytw!6GA)iiF|0%eA09w%C9JVeDg|m2vTDH(@wa_k{v2EKp|T{VF94 z2{^>jdYQP9hw=7@R95;j7EcV-0>z?m_rj<_A7uEVboY`+9RBP&^*;XJVJE(dv8tmJ z^na4US5mBtKM!BiS*V3J=IOV?oTPH(;XCH-Bogv^HuSpfC)Bf>MY0CP5qHzNMUE;ttJC5J;`(B1;c1HFWBT7(T>vH8wGf@HCF~>E*g+XMn z*PD?vP}~13Us%nRxr}4I$zZae>J{noPO}$Q=8&>FdOCA_j{%oXBCmpqGyefSi4Ub6 zk3+Lc{bV7ri0`do@d>u$;xFg5K80l!vdyv1F=oh2ZA1?z%ox7t!eiA_+AJ@Y6w) zS#;F>0fyY&c)xOS&h|Sl1B(b+xN}D2WD~@&bW(W^bcnua8%$GQ{jyxHu8P(n=ZB5V za^n8#Ga59B%Ty5d;b6oV5-5t*#+$<#F)1iPDLRVFQIP=dw%h4|OY7@^crvd|(KC+< z+jjeI(P)f(*$MuaBmc116~daB{mE3}wQN zjG`Je7gB(IYg2t9{%Y5y!mCL5nlLLoU4A?);c{X}ad$#DMRN+sclh|FF^{JG%152s zNhU_5wQ^zn^9q-F0n5Z8!TP(*u z4{)St(=z!L$qm0+BJ(tl5#VAtGW#E3|1tz@bBGzL@)oRaN9uV$w7<^~RFGkp1bHQ+ zC5q?8wqQFx5w4FPl_~;({e0tBiU6;-3&WC~F`DRYI~Ap=U-U$b!Xz#N^g=lET)<4z zAbxiZ`T}0`gT=Ciy&2<16)+e7;uhj~EEO~7mI13@NjZI6d#UW>Xxs?42Q8=AfvWk_ zJvh)!vpl4r*wW0t7*3*onOGTxp<7W<#Xz?E-KVpZomu$T(=*J~v;3_ew-(5=EA}D2 z10DCIJ_{NL(XhUH{23Kl?5>|8pF+H>x~r`gFI(ygK;rJgjipVM2-l8=p>_SqB0kN& z)K4Vou71_^6Gg(fEd#DehflA^6T@TY`or3v2#m$Z6J>@smMoQ4eG$L1i7A}sYa}7) zh-#(^sXQWG;}15CF%Pvq;;ke7(6-LFZ!!DT)M1@!m48)YFd)Xi?&;P1#cI#<0N8qs z;?c(8K}oaf*B(W-BfuT8cSR z!?^DJ>c%OfrwgM0Bfb4Owxj%?fEObU<^lQtaNiWz7?YJ&kK^-b9lG1C;x^= zrcuu1W**L|FPAWMx&fSAD&p6IkGPrj+AI?j!Z+6D^x1qsS(`72KZu4z#6wy>Jr-M$ zNOwA@a_223ac1P8k`yyq>CS$4Gl{^ax0(qq9cv9Ronc&h|63483y*g*sQoHOPGhqB z+jj$`kD?%R5c{59tHc~?UjvCvNZ;UHDlz3<8gMFFxwh)IEZKkQ=)e9tx)Dm+$MV|t zd8HVnHG4Z%P4HXUj`ck%ds{5oV~?fi_VqB-QO#{lNJmIdFRO3$SUSG8l&a+Fjjh|` zlFHY^g zy2FBZi*rcw8E9F>)Osmea`AreTGOHJ-*AqEqHF?AnX$~JtNak(Hu)Z)6qO8?(uMB7 z2h~il_$+eGYqeHGqdd#erRe-Jl#QSpAw#<%aOJcc<(1F>z!%|~NAx@6C3noHtYGrM z+{kTt7wHR+_Ul(4HBU`!k+ep}&CaF9MN52FNXD{Fkawk?-*^}b!s1HoN=h#0`oL8q zGqweiJFKO}*2cUuj+yO0?A~fY#aJU1B(gIQNUH_&XW2HxQyGYF70eo(r+-OklM>@R zN>C)U%O}ft6;setMkf=~a+LRokLFcLPdbb+I!%o~+vS6dN43eVKQf+V%NwKAA~G65k3MyGazZ_wObue4)*mx z35o6LHR;WT9tnnmR=GZXm)_CfEp201GDHkw-OE_!H9vK~-vP!4pWaV`3)^f;P*<9F z`bs$^sDXp?W9%Ss@Ouh5gOj9lD=4jv*$3mP#Q+p}^;Z6{@!Y!lPb(xU($8t*JuKPF zWrnc~r1|oA;v14)X*zQ(7 zOqV~rF{>u2Vy z!*-x`!*%0z)2$Jt9I7A4pm2zq`+qdNY%`K{|KQmBuAb%zOCrm6lagJ@xlkX_oI45- z-JcZm`8{hlwmCgk&zI}Y=vvDf2xgBW@3f!FG6yD=#W~E!wu{2|Pa7Fg2)Uwz4pH>u z?Gb1Wv;+JpOn9%?tNOC)TE%a`W*bJx+Zbt7()PSM>;cq<_T&6cmD4znAmkxDdEZlT zxvSu!nevO$)U*no;|6q~QmdJ{TnX ztvmz(Ohew;RIH?~rFOc#ri^31XvPMx-QEb$ zva7BVCY!YcN#f1SUo|yMcq%>Fu6RVHl?jVTS>a(w-Z`UfW~kBc^&B&LgW?2Uh*mx} zk7L4nv!Z>n1y>k6NRS_L#r|h|7poz^xgpbct!l!{{$HH}Pv12c^-kofyQX$yD*;4Q z3CPwdiU)<8nTUOjdn_Du`8oxNVE&c(N}t$IHNgGH&dj3IVucmA>_6w&YZH0}7+$hK zm2@ywAik5c9`h1WZG#P(FV9_zsjdeyT+pufEvW50%C?OC-A=pJ` zyaGmiG!QLxuV_8iiah;+0qs$7p)SYnspyx(QZE-@1EcU#PF?CMNcHjrP^Z zL8n-D6c1OdTcmsD+`8L(6Ma`_dk&*kTfS5DkuJvPsE_2yI3!w%Oh3*!a5Zv|^jzLM zy1zW2YyEm+F&=-Ig+4FR9E){WAo7#g?w%dBSNF{%i4~rlRj6?$haI?>ErO&_?n$Vp z=UVQhv;sNa0=|^A5z>f94q)HGs(*HPkl&7&`0)A_(r0fa*oLmW z(tH;5(eTM%Vt!wgr6OFBgOlt&3B5W8?%fG_oQZOjc*$}-R5#ZBZ$jKxhwqKgX)15- z40290OR~8S7#HPNTqm>+n#XgTH_G=EKl8e2A^gyqI=peL0zmu^tU#N`{(n!L%N5xD|EQ5; zqh9aNqdOT77%s0lc&DZSOE*b_kMw1KIqx=%&qv%V{7v-6oc-2`x3B zL+1{@^5q2zEr^2waI@ZXF8|i;g2NtT)s~axc$MKIDAlo;?Zpb#u8CA}%0PBU7Q3(% zva)b2)^bbav^{g%iq#VRM~>ty@ANtf|1C=mdzxc3-S2uz5u2neRW)VGzx??Go5+*| zb6l_W_(NawI*02b^B$Vjmpsghdg)vsH)*N*e|_#5B3!EL6KQ}M15{4iJ5;j!1u8<( zUq9iVlk!XZV;OAPOn2(elE?h=f<%&`Y&2<4xh4_T4=v~4%sd&4XonYWP8w@SfyEgx z{CerJMbAy}Q{4o*8-aXn9=;l_QP`8a!oDhBj&)-st zLfopa(om&$0HFwO@b0QH8^xCnk&a8T?xarGXSsIxGnl z>5vz@xdzN9Z@?lD(sh2=)E@56MjA?$`!Wp`X+-NMz)vnqKqyTicknw-yKSN+lwU&I^L#QSO|>DE0dJaPxs+<%X(s_I{(9a-6n)a!{*TuQ{e< zg*YnDp69nyDq?D=UK`DK01$n>EHU*NnpHmOuuUFQ|89}p^-y!LM^&Y{s1P|L6^3r} zp=+k9y!AO5jPJMHHWe&Z!+It|h(a3TM%LO%{z2;L?qj&BxOP(O&H-ONcoN0kZ1L4J zHok*|&8G_E3mzS#yHve+R{;u5|5Z7z@pA9eQ#oiyLVe=czZX}IZL4vJsmRI;U%m## zoknxtsz^h`Qi{6-$sqeV?}NqJ^l$U=@QQ>ElKq9t%Z9I&8TcPn@&96WZEVs^=Q8@;qWjd)*7dfT@&BVFe)b>v z+<5S`cqWh8U32cxv3a~$T}AzuR^vP=dyau%DOu0TAf}u0ty0zu$xGYL@ozf7RxHto zUoMNfl$8e@sVBN@(Nnqly8JN)reJTCd2{=c50`STE|;&MOW5qt@o6yir;~3pejyKe zG){G#MV6PHO6AD$B&(0!l<7$aa`Ptu*donj!N*7|fOJXGo$}}+u-4`hYYrKQvtCLX zrr4*-M=rWl>0N4P85A3z3xr{QBgf3tpGtng9#wr7T5CCIx>KdJ< zmnd~Q-h?=9_UZJ*feoJ#t)?Kc5k^z%okZNLSR3z8t1r|E$U|SC8^aF_m@cDauJ1iH z!xy*x7vGE)SeiF8jcSVHjx^agZOM9h1ecx=zP^v^e+h&_PB=#7{Zto$#uELmzQ?9A zMD)e$v_YKFIW|+)nfG%D>nXiNnX%G(+Sg93mkRYd`lRWKXK@PsoJYhIUP=yG>Y?%G z{k6f_eKIXiuR|=aOuU2q)uqj5@Qo(3eB|zxuLA&t2M2j&9>i#pXN&rD+jBkZr2p#W zt-@li+BW~E2!PHLwSV)e0whk5wIHPNogeXadrC=m%k6Ig$gp%U)E99TsLo;B$8a>= z?;qz{ue$O+AziU5jGg4Q6c*064aS_@r(zHexh_tu{ERqX?g_!86`<^SK5_AJareRd zotVW_04KSW&OW0uA)K9RnJRazu_<-c>GN!h_*QiLO%cy`rfu7teB?a?A^Nk_JLyhO zVRt+T2l_=!4Vu-@BqmvINk^3}Eq}FTICB9$38y0qr^j{(3`^T!NZ2 zbqKBmP&*3kWAdHqGd?@*!LjBsl(ZjU$#=2djEB*}0;^IpD(i2YqMEdidG#IRS!l(- zXqHk*&9uHf@EwuJ`usCEm`Q0=2SA0-7HCcy$}R_udIr*T=!j@q6Q_ItCBNj;EvYRn z;>)g}I&A%O&d~n+e*~(E+qRPw%fy%;+0$OZ=SzORawv~UW>Hg2*#ggIp$#&46~6S# zqqLGlxWT@woNH*ni9bfvoA-~)kcd}!TJkcj$lpe=`G9bzRkr}#F;tg@_8onQU)WG* zVk==eOm}U@>lHM-g>-O5RLocG(f)SU7~w+Vxyp0TfbdIIclKMnJu|}bdpjPUM%8t` zAjcV|noD|7bPQJ0Z=X1fZ-xht!1ab%Z<;zB8oJv@u2+5Fj@tYAsCd)Ju}17q4dhgZ z({U@n{I?r@NcL~h*M5D%QC&z9Wl>9nciy>*aT=`Zb5!g3>n@RHUCU!#w&vl$eR>LY z7^^MJ%-yS7qE~W)%k&SNFy%7taC(-Lkn;EmX95dG;ezg&Hh5H-B|q7|uFRg^JYbTi z3QL|OK(+2;2<3(05`jOodwjhN?2B#5xQ=H$x>ND$A~5uw2{n{P_~RX?BtdqNZH!~6 zYv*!!j|!WAYgsGbBa7fc6K+q&L$_`tUw}l*db_jfvl_dax|*XB(5iL1R@7BwoZf?# zOV2qLG%e^K*G-=*z{5 z=;hZ?#)AI8l~(p>X=m&IRIXETVR*pebLV!^)`O=7|J!Zge)IcT67M*W3D_d(?RUT| za{3+ppabBlfCB=6Dh;^tNNk{fB&##WkF?(@oodJ;l3*7o&>4}OPKP3YTajl#TupuvLS#$ZZ(ET(*DpdqOG1X5k zg-DSDMB$1kLw z=(SwYjrt}lmES@&f_EUrh!Lq(lQ*?W{rMs$;6-&!U_A5WuUyDjxO0kVvQ%+1<7ocp z(%dkzjaJE$tk0OOz64Qk8`p`?l`kxHo)`u@_-`hk{l1gYD%!pGvcR_@2k=tP%9{1~ zkhO3$7R6CYzg+cyyi-*VZ=O0lfCf26v7IPfl_8za?=3=sq?I*QSK-kDe|ChBLQ5ZF zz^kCIjt|aKmvO~8Bjxt`<86(uq@5O=wa1|<+ z!2J+?t7+MYuS{>>gJhsRRhYCo5IjWRJJL(srTA?ytcVU*4K47_g*DHHl2nx5TWx9E zbr27J$3L?o6j4TiiC5l1fdEv#m_XFk6CceEW&Drvynhj1Y*L>s>a*f^%dNuR{Yb?) zdzrZT&jUoIT#DLi1u-@R@Q;uC>xb>y9zkhRXy(6B6oO1L>}*d(k5lcOqWg!)nLm*L z)S~q_(XvN@_D_eRq(g^3d0X5RTV_PXD|~u32dQqz*d_NSF!!c)Q<0<50U~GK{A>bO z=7LqKkI3%6E~|Hcq^L*#EY&(84Qc8W#D{P=Jup&RDS-<7>5`|RRbHe4%=~Mz%QcsC z7o)1`jJH5E?_#z6@=kmBIoqu}&oLlGA1*$ZJ4*-{HN%dis=es=mHHi+V_7zSGw|?_ zRzXm&((7h&MuojJ(5{&08aevX5TAo~h)J@IIEM$Y@kX&l*V+Q(EPKIU3V_RWT$aK| z;L-mmFh=)%O#kmQi_&aQzVmDEz8(47mL9n9I*Y8C$Ns+x0&0~{$Cir=EgKT;O_yU{ znoUQjYK1vTF)4PrE=4c-Pj}j1J#McehQpp;1Zh$uCk-4`LqsM3R(ins&aO8%F~nr{ zNYjrJP&|Iv?#Sx?YT6H)8FUTUx7V!MXv5PExbJk?Q+eh+hnqL^=XP%WJJ2ccHYVkO z4uf~~D=J4E!#^YZw)&`>7Hhlgr7yR3a{qMYZ8X(a`NqH2Uo$lwWB#0H+@5LrzWUB3 zcrW5}FW+*)&>oZW_NK4ZJu6z!&E&tn00Mg7p$e}C!)w%FwsRc2XsCVIWNOeXdB*?? z`|;u6-kfV2>N1}{Tg=JZ%N0>hGG*Ew)UpL+fh>5UX5qI` zsl6N^+u}o*TVj7-i>Je3Pto)jP3IT&7;9)NLE1p^w;GoHqRWSdZx7#x)cPGpel@l$ z(%b&|$lkFdFtm0)%3g?`_I(5XFquWT{R_Kt(?L2eEFs8B5Q|-FM^#YmJikK(Jc{|Z zXFZ$Vm?L%nYQ2yu*5*k-{g+<>cK1c{YB?IW>g^Nv+dlQd zb%G|#aVTrj*%u>r_q|r3D=7n64L(!lqhoHpgVUDqb8Wk33C?u!-}_T=z(K2 z^}N90zM&rCYS?djYllDZDCCaN61tB9oA)=*;Pk59b%CR7g?ECz?0R6V_0FOG zUR7o>&n6*I9re)Q)XPJOO^+8V@g3X);5aFRl5vU~ixipM;__9of8uHqhXz+JA%*B} z@WVP_PM7l=Lx<@ZWe;;M1NM)d+s~MM02q`aiFqN`36#Uu;|)3LZ(KWCBx1 zQI_M_FFQYC5V9%B)iP>Of(p_>I9v7ufvz*f)JQpC#U0lK3PeHY@9+Am5GI^y;uzl^ zi&xVhd|i!tq5*y1E>zfO*~A zJEb>Aji0KlCuLKQpI%4oFMV7#UbY-YeL5QaH^Dwo*JKPir1{{5b?J=)(SE1>g6`$p#m{4WlRe-5$TCWUF9De zrm;%@%X7+)ZA)KRs(Lu;F@{T=6%hyzCf?(z%HUOhLLI#_ao{~l4AA$t3L2iG{)7KB z8hTVW$0Vo5H$rkgR{9xh&ewG!1$aeKe3#{_Gi)@xJzLH>{`c63DaA$%&HMk)Ltnqu^B`ai5w z>I!zFFWq75p?sAud$K1zHjuO#@Hp&`31l24Bds{x*{$(}Pof5*6mViw4)XeVK%bLg zheE*@4%TXO&96O*wqAp}g>k9vcAUzKkL~Y&EpKr`Vd?y|=!M?pb8>Tm>x` zMD>E`jJ7DMX*Y}Pfo-Saigl*N>PH}3bFI$$1k^Vr6>$?Sle#ewb@ZpdcF=##4H(g1 zHyrSLYw|DL%pF}%8l2je3$|$G40Jp>bV@k7x#i%ltiJckCI4Omd3vv6# zhN*QQ8jL3zsFY^ndChVABxe4;0h>4c8wg_Iyf?Tex8F$qT;|>+ex21B<=yao^z%Nn z?EK)W5`^VfTjhLcr)({M~!zepu3cFq5T|XR;{^l-8L-o%v8p z@`v)0OOt!&23O=cex=Hg25Pn~Htp+*?KqECFUarAfB*E;^Q&Ui=wJBPeU8uR3sM%j zmeUT2w|Sh0|BAQbc*Ap_`p)gXLfL)rEKO%@HzX~g-&{*SJ6E5dQr z9Pg}*-)GL54S?jXg0TiXvY23*NN-stJMq+8=>v)@p(}lS36X`s%IOgy%b$7STB1WC zgegIeE8rm}6x7#hI3QY*q%Aw~qUS-*{7k)Y=!O1@YplOioA-KG?+&AU1hGI5g~+&D z*2AT-Lg+mk5CuxwTp(a^o~Sibd4c5TiWVnQ=uX2_ZK_K#h}r_nCfsQ;x(_R6_d zVGn-h&IV>&eUmV&cHZIimyu_BB<$KL@oye1W}v)(?=zGkt7@mxLl9tyO$x+iy-ZFU zZKMBoKm_v63#w}t!fSzaVd2+uc8h#9J!!Bd3duQ47KAj`uDCHV)SMx+QQnv&)PQO_ zkkaUQXr=^+y~qJ9uy#$=Tfp5 zMa*VXu)WZw*sQv;@KU}(75*4!nrd@oXz;pT&y&xg>WuaAf37by=OT+B3abOf5Vd4; z+>2i1muF?mFMC|SD41f(7{cgs;Q=H+YNGPOjE)@2UNouWc8*juH)GBOqA2BeP@mS68g)$|2W9TN7(iL;4S~=z)jGnvGJtV zqtUPTSJ5A3U9nfS%1#A2`w;I~zI4==05%{C;`m?67GD8B3qc3K<%e?sqBbu-$EZe@ zCs*RWfAfMUM7GNT$QCWLa!r^GXmAa_J*Z7{JO3%VAb$c34qm3;Occs?AC|WHAUrq)fCMflr(%eT_zgP z^}~NDFalDxAm_&N!3BpHU}GY$ysEJLdWNw(#w`cFdiNFW>ptid$765q?3$S(UfkBv zvuA|aPZghSYYfE=k`Hc?-^^xkG{m9wHni9E*8e<%P3gf)M!$gey#J{ULd7zH@`L1% zAE^kiXFCD`9<`~w+I2-7f1hWH2?1-)0Q{=4$mZwumdLXoVaT4()WC06_rqE(kk#e^ zyf84P54;seLUKq$qG;VO9H_53$S zZqPsQ4A<53-%YPc>zm}jtXI@~Za{FxzecIk;l(aBMqpfcu3cPTcuw4TM!)v+myipN zj3{e!mA7YcD(m*{jGIe!Pn&-c=9!PgR#)0NoBOB;6yDi%N0;%XB+ZAcy*Is)bZ35L zVt;b_^RdXsev@Qlz%%!`lE@#mO8F=ysOBOg8+Fx`BS|a0&wy4kuIuUrx}WcV-OB>$ z7^b!rp5{tB|Ksq{ipP$(^=L9#Uvn$W-EQ8bY5dRejh$;== zRs3LiI51RK8&A>0$e~VvtR7RAquz;mNyjXv7;jrXyqy$Ilr55uB6&UN!87%exEtQ* zHmL-@r7kY}rWdhyk2Dg#tj`coE?s_XHg2IrW~t@|Bx95c7==Ink()Bte!w8t)g`Q5 zE?$4VN?n~tcu}nUzyyyXj?os=&FCQMh!g@8c|fY~EV8frMD{}W+ml@BY45HkupcXt zlf_yhq|O)19`Xj;bxM1fyd+pCMc1q6&3i!(1QEp88Z1h>8k}r^fK3f{YK4V4BR*r* zW$2=N({w?_B#P-^3$iD{rM7OhPIAkppHRtvY(>-ayCNHG#JvoqBmV}JO}ccZG1=Oh zo|HgXH2C=U@gh}+iv!N=_a)1aV=(m(j{LO8y_>r`_Q{{KRfkJUDp<;G^u2}!MIDx5 zC-u_MvvdS5!WID!ALVq6kU#pQdCzh!>rc1BAcQ{I*{+I@Ucil&uW} z>?I7i=wRnxlBO@HbcVOBg!d8h)q(2lOnpT9%}+q|eSO*xQ8keW-%drNnQe20J{e!V zV6{X!b+@%Knok4^!xXLCi!+$==x|+2n9ZJ&ET>6Vvjj_- zUvNxGrP+OtTw%^Hp5iSknAwl+dYO}O^+!|O5c?m+pv?!coT)-4x7T&7@uF}F2D__= z@cY{SX9Yi8@O+5!itjjs*e>v1m&9gFy$d1gi@Q}Wla5}ky9t26XjVLK&uz;=*~DQf zySd*Rz(sj-H1h`(*t!*4&=X57k8M*aEf1g#Pn1y}{lV2TQ&X&0RdbB;?`!E`nYZWy ziUhyE%!u63O-w0@Bqg|PX(xHTs(a4pKKnE6s5BIFf&B4FHyXS^ z(}M32Qi%cxfsLp0U(%`MV!Q{^a&v&9YN=(W)tyyllpP9fW4uT&HPI4Hrh4#2DF&ar z+2nPi^d&JzQW(p|-!AVI#2z!2oh0wTvKk7as_`@AGMozoXc%BYahmZFm{9z~jIWob2O&Flwda{ zx5B1u?A*PA+~=E|GAh3i5Wp)^$$_M?IDg#*>n+#$u2BNQH&Z8DtpDX^gW|>U#d%gv zPB#uU&%a|G8-Tj=TvD)y6H$E;GGkv3?9vDxe?Y(m{c(8Lt7&6{%$UP2$Y&ftEj9%L z6;FVbPBp2g?e%rUS9{KR(d*x)1;!;mx4|Cm8F%)8jCSU-sE(!b-#iki;!HqPw9R}O zq250N8KvLa>*zpK8&kxORC+cJ)X8e&0igIt*5@-v8kjG5)}3aB;Sq>wFU%LqPtmPZ zRGfQy?~{pBXau;-xVo%nZ+Ol6w~x`0sA> z(XlcaQe$M3y6>B2gP^LwmPRH>EN38H$0WH4TFuF#Q19zsd9@^B?J}3y@eqptaRg#= zs@!E{TJhA(wac>WhKbeJ@2nxdaWRMx;_R|_JF08~zM5VB8tp+xr1z^;pemB=P6W4% zN7J{RwD^^9F-expp^nGmE#N56qHcS(l^?9wc?Rh5rkMSpsd);+|CIF@75^6pDzb(T zkPzQT>qJp`!@VB6FYzG5G<V`-WyvvEtM})@Gt+&<&W8H?6p3jyq`7?ucVG51R1=Pv;=bx6 z)H4ko9KR zFj!i+enmeafcz4sKmvMr&(H0-APCU2tWo5Hj&d*9eTsoR6k#|O9@sCA?TI11n%#Q+ zi)AYq`S__&h`^P+Xs5%JCAP_@2)>2`MU?!sOl5sz`Tt535?aE$& z9UV0CLn-xRZ%T=S?}2@0+i?ZI%E4S0K3CfLa%{_E=E(P;TKo*(jliMOD}(RYhqp78 zhbHs<$YeG4fz#`1D0(f2EAGSu7=yoRr%r;Zya|z-2J{e!ie^;68Q`mjQWWKYfBRAK zSyTOApjA!%-I}xRc-|1jSlWI-VJQfu-WErDfx|)$2_w24EH98#OwIKOsnNcHm&q!&4*k}aQl zak&Z>8Vu?@E4{1iufJ7%uI6hf{w%$Rzxp=#yH%KQ(5qnHrOUR7Vat7@AV%UkJ;IPK z%uVMxDL(Puwz}^CVum^6dHF}F{Hw%DdG1WP0 zNiw4bqv$7`Mj`VAF?P>&|QAXRCU$! zxa)s(s0%#HU-l+A|1keTd*qMvi6}ex1E+_vTU{SA$%JR}QCR^-Q^fDm7(q{26=n~Z z^(43lgZ8N`5rr-)CLZN`l?Kv!WqL9p5}KteJ33NnJj$xjLc;K`k=IL{>VT- z*-L7fw@9vDm`3f3^-0M(Cmhhm=LBuK`uZ@N-ufsZTj_7LC!mDf&B7M|sDCbq zXGywtw2>xr%iP*W9q5?lQUsLhs*$|ny7%>2-8aPk{+$INU@6~;>=pn9c4CQC)hw}> zUe4Z&zlqxn@niQZ?O2AK@^X>1P@Xj^=}0V?%!M#A1$VH;dr&AL8)HcIa@=%nlj#hF z*#0mlz!?zTPQuFA;}Y2-;jAIb6mQbh-piw*`$4Uc*&9Li6(frc37EW%kDyJzBel4C zb=QTgfTlgh3abjQo?{)TH5sdH9OUm}dR>24x8jv+vZ$v}Fo^fM9_#bF`;vLPv8{dk z#wKE<8TN%BPgVfj^c6r$E$^gf9YJ;Sq?Oy>QD5mPzKug|*D~~LvA+RdDqw{EZT<}L zZ}y{(e57Ak9`NcD^Z4?9R53R@l$tkOR19si3$sXr@cTHDZ36~>RXshqrV#Jep)#%f zV%kOJj$xd41+lnN1M||~c^9VjVu%9p?>X$xiKY|yH<6k*^XydPiajA0+4q!)p4!IC z8VIW-U^p68C#2hAFydrBKhG-Pd)og#N1D{?xo;VOuzjk4c(iF(xOSZpByRc&C!`uh z_;MJD;*@DjtNQrhl!OM&wvmZ{uhKy^N7fTD4FQD^574!=*9ZX0Zwic`aowss{p;N1 z1S9kep3_ApQ(q64VG7RogZ2?{)hU1SNBMGy|CGm+{Qk} zSohF-tdI(<@!$3kst2G3Qr;%}OBoc8Bv*wckzEL-ipVIxR~Ah9E;IKU-N~N6Pcj9K zo=I-rY21Z^3Cy(U^eSjw<~g@tIbhb2mj7*qgo+VCA_SOP`_tdRQ58?D`rLQjpM5@| z6BAfIj_ZJ{ZB$cW{lhR>ilCZ+MRhlS+$^7O2Tte;p>M2>Rduk~c=3|e4|`kzvtN69 zD6ab-@<@LY(8zT{)W0h9~SFL3v>}doabG5Mmo@pzR{ZoKit!+Cx@pJ$YERAz@a{rC_ zwCbA8TLZ61!?){+>fYtR6POM#&@zXohZh6k=F$Wz*nDX`zv9F^4+C_+wF$dGF5LxcT2>h!G$$NtRN}ubO4rIyQ>lv zt1SQ8Q=JLt^TFv!QHT@POa4LJ8wzeR3T_Gjxv|Me75RrXVdP{kL%h>uxvppF;G}5Y zO+j2B`GBO$fr4sg`VU{Ps0a3`rkW>DHsNDrI?}VFbj-ezWml-t9wGD!K-*4Z_HN-~ceX z`jtjut6T>?2%DvC(7=N zU?oHSDsnIWrm?J*f7$uzp4{Q7=A6T}6(g| z{}jw&fmtSmB;j4ZUgm{;bN$UW3@poS!eQ>SWlq)2QAf#-hg{?3TE_oj{e2gJP>cQb z5So4Xx@dK47*DrO7EWZkYhW08ak8nDQ{ZdOFX{$PeN4{@hz9?}0On8&BH~FNu(;@m zPIzo4IPLQ-8-~UYEZ$_b_{t*xnJg#&2wje3-j~P{x*SdBIw?gGpLI!Bh(@Wy2QVxM5xwbtcnLpkUh1Y z)cji+btI>_c*x8%>azWcrb;62qx^skUk-^KkDSgJQ$UV+$ux;0&w=1CB_4s&+0mWv^FViGmrF%V4)hdZT4V?ik!FuS_X33AFzu7Cy ztbPYSnk^U??@xGJKE>D@UJ!ZrAk&&%t4Z&dt2VX#eS8|v&oH@Wr}Smuks>1sCz^}u zr&+5girM5fXCh5b!dsS1&OOTb3-l zyYhg^WBGdyV=C_qgzWwqUVAs(zpDV*;W?vW9Uuh}9gKK8r1N-@jo6vX2UMOf)dK4= z7?Bcqz=QHve^x}YKqRxuawK3Vpc7CW!Br?rfh)0D8kahgBqgMU@?gcoPI%7 z;6%I~<&;O94`ob2!G<>V9-3kmYO1tRSO0autZFv{|9QjU&kHGhhrL@mW;x zaOxE8v~x9(^ZN6$l@yUU2s)e{tVkOn7~mD5t@OHBpnvdq@FdLM*aqA>-B=-%?yki( z++}n?#lpOVg(kX-?N_d#{7WLgKVgadVdWtqcMd0<@a)B`sI6-}v)u_RezNrma_f`k_^jybeH zy3}k?{12D#S+KMksD_4HPv?1FIA5fW0_+9s#%~sej*t4&Siex4pGvFS1g&O^uy~H_ zlij{QrbxwlY05`3n-}^`I`lnB449ZEY@MAul>1hNDmgaRYu_uSBDobxWkMugi_B|u zmQ6;OO=W`liXE-i2qZK_70OG^gV?>G%Vl`ee;4-c!)IIpDF5N|9re^0AdfuMlUD-B zm&rC(@c`F;SE(G!S_aY4BdI>bh6@QNf^T6c%nI^kkae0v@9%VagEn6GN0=!BWByKZ z>V0GN*v};aeEot|krUfLRJ25Yhx@7TM!4@x>m;i9QY!F);fS7X{z-3O#u# z-6;a2>^z>BViWSV?`w)w`4P7UI{PJAN>JMOf3zml8v+ivd~G@8GqMi&l4XY52|MGO zr*#f(>JPJFHeJ?ZA)5f68`6B?J*886BQmW+a&!bdKk8TmT1fa5vsY8|mGP9giEg>) zf=x-nx0Mc*9*kK1jcb=l-dJY<{ivD?+dGG4AMHBRydWV^4pc4v{uUWDr4#Nq`QZ-X zkZ~i~$ax7;3J3Yv>dJd_d~ngYD*zHRAP6Yw;|k`=4)4XO-L%e>pyk~MF3T<+D{Z!Y zoA(s8&`TjJ2gPG9+^0@=LKT6*F` z9Z}yuZVU+udb%o=@h5W30t`H$Bth>xc10@JkB~gR4`P23SH(N)=c-A zT13ZZBvPtntU~)MMuD%JjTUHz|48M;yI0_qTaaDUh)pub`7|AqA?Mu@iK}AIQ1K5e5SVq>g683`7@?X@)FiiZ2bGdU~Ma8^Tkal0!sUQx#-F!2QPEQXfGFM z;P+T?q-D*9W2H5r~IK}XqbIi>LD=aIdBM$_Q^#l_I1Cl-d(v;T6EZLNj5%|qAkA88G6Dq z2mGP5jq5`A{$FgUR(NxX<283wI5NP@4XZm!V%(zz zO;7$c$-^99TcAH41$<4-3>Q>4@}Zm&9ZS~|RJlU&V?BPuj8%=oT+xeCjHK+`>qvzz zHASy!Ov22Ik|be|TY}=RhEqZzfz8J79b2nfy66{oMT6N+e{VMz=}lx1M^J~=PQOA| zTL>PqTu7Q6l!%-~309tli%Ww`i$2X2x?wCO$O;+7i1{680$mF{Cr2&jnKY&Q5X2Lq z>F_48t%&l6#T%9#zsiEuSI^8|>aa)Heio7DNwYQ|mCJUuc;FzLJZ(6ghfRoobOhqM>K1#Oe7xlBIjpgjC9MD{TBW)aiMTc5^Vm0!*f`u7~$;a?2(ssA8 zJk~iIPwDMyzSIeP*VFG5choBxw@jzX0Rdg<(V+=pDB-=SND+c?&-T52>VT}d{5#&W zm!60=zC<}5u`mWDv0Bbv&fSHJ#VwE5T~u<#{EAAuRi}j*gMts6CQyrgZ?{)={R^{h z5Wc6|EB4m_)?x2X2etU{c7KuH8(M!|Or^8LXv{$PxsU%x=z-W@q1x}}(e)NaejqDk zxNElndfh9SeKmVBj=7PQ58AeuWKn0mCOW(*gL|d6vd$yvR_9FZpqs}s(r-%rI;sxq zd<#P_*KZ1afeR*oi-+p4(46Z_>%S4{m@wJLlyJlpbN27#AAh4tnGmSx;Aer z@5Dr2Hhl$4rb>(91#)2b>qSAa=YF8uxUrc7FSSm=3cSG}5v<;_Tzj$7wK{nATF%Q4 z!fbUw{`t8!^}tYMg6eau8HN^|OzXhStepWPng_4jC#Ci&-3Md(`u8vf3Px^dm{b}A zOk9Rr?29C!xB{F_ph>5!njiQ)Y8(W)kC36x$HR0cI8F0oJ0{l2xr=(Ylr3Y z%fS1Vb%fiYxA^kn$q8j@s@NkDvsfo9aN}>Q9S89BJMRB~eErVtV}qVc?G?z#?RU}b z`~x9zTYnp1DW3LBe$CXzE(&kBAN?PYU-#(t_j$&=7m%*D}6 zQS2J6f$7X6?B@{e@~B#YwBga2-v|G}-C4G=*3O~r z*5CB>XhHlw0Tt&k@T%GV>pMFCo03Bkq?bANf!30zl!tD6U}-&)*O3cP`G>)rLP;nU z^E6*>hd4hUA*z8HDecYrLMrQluve`W^6Y4BX;0?e_-Fmdxn}_;$kzMZ>_HrpwaGNT zV|Db90uhVD=QWN^wQCadPrX;ZxW*y&B9ls4=K9nyLiUBad44))Gp;f(+tF55^ds&z zI{PUID}jC(*Rj zHP`9_;+c^2)hx@0RsX|UyT(roDS?$?exCN5zfoI2W4QCVsLyhQfp}n+C+Vl_#Vy#q z(Hs?GksdE9I^Ow8d=-uL;<_;# zvBac&JWAW?pdzx&lJtn9grgiVA|0<>kb3*wPM8N6Kd!3L3(vEBc>BFP&42?PiEob2 z1IGOW@Q-r3a|N=u*@r#RW_rB+ev3E;W3T!(JboGP$!gr8{6@PSz(_seM+;CU+C~01kDIs$uu7BX!I;kq{>BadH;4BEh{ja?4*O3!Z+K~4Z zksqvEMG^20r_ODC#19RLph7vXmZPT`{>0?ROYY7Gw}9K}v&Z+icjtk(!v{JG|TKd!IbC;=TFye!)$^ZROIw@p$F-5vvTg(yxdt za&zJan`UixYlWo@#X3c2QAgGCHOIBr?-0FJ7knsiJ-2@2#F`=IN=n&+rhR4>P8{B1HzutV$}@(F?;7N(XHL zZ0NsM-q!AFVM}17+8n)Uh&9n2V?KZ!m>q0_Y1;41s>mx#l@PlUTwE&Nq23XXA=G_T zGm6OHJ*R3T>w}j~vaKRyt})A`lI;}~zC(s;4W@gn9E#G&B>^Su0n1Itkd^ZqZJ)N3 zYqaG-t?J|EhW74it?k%EJ4P(^nr=yfKBXnhwUIBs_r+Di$UE(1Di#8*epAb=^+lQQeg5f>}H_ou{$#s zS|_t48r!OB*6I+tJEJ$C*!RIezVX}A{kQQNWi|MU+&aal0WgBRx%EYCmXT$tyJ-5^ z6zhkXb*rD-7Yp$R-$MEp%ByQ1hj!AgGhD>j7f4r;u{Y-n)#}{8hq=F4VaS{kX9BeH z1N}z*yucurO!oULK>o@Au=5=m8y>H}GeM$m5c;(BR4rxBn)>WE36%!R$qQHeh^(7oOw?U~pBfntYE2^H zFo$qoJB|9)7ol{#b-EBBAg#zRJ0j`-#K;U?bQ(mSEf zUOw+hDqYx<77G!2osW93w(RoC-1Y7WOG_tn6iWtPd8mj@Sx0t8k$cn=Vh|qy%{L1k zUnFVYb6hYJ-+LT*&NP#^e1vGj96ZtzF9^uVzs7(8BeZ{B_WIugkRfxVtV8rfh;W1| zLkno(%g;O8`%c#zpa8a#DViwmTh6@ReVw-Kz08~}cItg#+0t_w;`(7N64D@cwLauB zqPKNc;Hf^mb(S<>-Oo#%?oMe6KeH+QgFlOY{`fF91wNZ&Z<@- zs(fhf=bbpAKOINDmd{1+W9Ug{E1P}se+Y5I;{ki{-m^sasLMs0nAP>(S_Oj*vzXV- z-@o)o7xPz#?Vr3|1$SAt0CRY~9#LTYj75uTA-4$Cp*RHzda0aLdwNaRkPH;Ja+J_M zdd&}y2)v?s0Y?ox4WM5hEnAR2=zzTHTS>Qpn!WYOx(T&viXi()-)#r5{L4Po@wpPO zf7FMo-~Vz;53El%b<#aJ<{Af>37>z)@cx2(kGxJPCqWtE5ItMps#-9-B0=Yoe5*2u zsK`Y~ZzFyIIsYKrgO;8H0id7-cQAm@WV8Z<(NIiQhBsRPd7YJ2#37+_zI+(qAM_VR zjsc_2oW1HSU`o9oIw8*q~m6ZM}PmU0RQ%!;POL{ z!yOn+uccEQ(Tl_A$y8F`4SmT2LM8z3cy%8YBNnvRdVTy>ND#FMc_wRJI?Vleo9-wH#H?Jbapo z<}l3k;ttZkRN#>ZU;M24t!UxUr$WX1Jg%?csg*&<s`Sse%F0qX}%L{;v+xAt;TO{NeSb~(;0 zJ_1tc40yxs(dw|Gs;%`kP(PBm4-$O(zEf>Hrf}h7mJ0Wl^Ke2%v+gQMPDuto{SqJ!-_sAHdG>moVy3IsR@@&W8*HU2Od zX0zz=imLU4pqN<+cBVe8Xt!ePc@;)rIr~JK5Q|w!43;dS2MXF{IDd7{05}2w_b{KZ zph|FeSBcQjaR>7TcfVC;B?V7)>wV0?lZ(V6fOuaEMp&P36k6)R_82qgQO3&0o40YNWy&O=8nbZVClCI*SG zoDyslo1e`N*jYD)*(`Y@XS(J?r;Lwx)zZSAdq#*>Kvm6t8@lJL5*-5O*H1W4HMex_ z^3+zj(78DPmSSY?8ZdAQY~{d%WdLo3fzj-ghHtU+W!sS!qEJ;|Tz@4ty;p?HO*(pR zM6i<5<_|l$W);KN)vffe2YotIWy~8Ww-PG71|&!3!Td3Q`_u4cJ=KMSOjbx)B}k?o3LWV|q#*ovje_LJBaf*u8l?A{u$lBQ~KDlQbqVCN*19scL#3V|2=2 zzlbGemHm^mDP818_){U0gh|gPuPcS+)s&%0jQJEchEk30FCEM09l8*7WdO_XZ4wha zqJStO=(GecyWG*saFJyA7rkl=BoR&fFr~TqN7h|1smQ#u76*)3^IUr2Nmo=$jbz+9 zvP7h6O1j47W)PdvxaglcfHe`js7MY!h>bN9n@oKKgE^T*1KsYAD0)Vl(Pb&7TICr_ z0C=HdbvI7gKGI|pEJ^jBG@zsSSCI`lfq}Vf(rWTvA)y+Ckvv=eD-HJ#>~b_vdd6G* zTAkld&dyw*K^n{0DLbL`FCx09)3vXrdhSw*#9hUnabKpJ5m(zp@a6_!V!BkUm;GY7 ztfKRmDuJ;I<{%NU-u}rA(w{RO!4`)V+E@Y3fNYRGE4p^N176vl@oDmbe^1Ma3!Hsy zyY)o5*#T=hqBZxMt_aQ?0f6up5zqg#pMH_iBye2L-ansba94Qo=|J_87tl>+u2RmS zL$NM_ZAk?86xNngS~Rj5a&pL*SGSURQJiMj9@0lq;v1vplX_;vF$es~WnUr&v+@5J zF0kxKPee<){qfcaBQd-FF!Cz0tb@zdnvgeqR+Q8wZ86XD&1i@cO@@o z;t-tIKkCI>v+a9cjG#n*#~Z;sZ92R?OxG$e8^kb=7;UuW7^BL5U!0sV);eCD2l=W@ zMj0OKU!0PD(-6W?+c2e6&;D6Rx45*5jP&#)ADBE}&~-3( zun<~kM-$F_*E`G0oE3ihiSn`2iMY6?q@{R8J3!#@Rq+aWzY>8*67=40!D+OIz6)I)wS` zRsNq`RwUU;sNAwiZ>qkW1`SmQm6 zDo+gkxMGIHATUyN#nE9@v|yImqPn6@$4L!d=#(JlA9j*G^j7%Iyxh3@mZgid|7!WO5&Jia;Mp^<#&PEhmp@f|RwEy)rq%GU2V%%*a+++j5Iazn9{I zfc;!WAx-i$1joUvu$!T(zFPxe9{iL*(}p~lz3w*1b02&dOyv%mSQnX=dt#%}g2?}Y zue>5~d(|Q%5?ZeXl~2cd3;P;%D%ibV^}owm!lmJ-TBCKJ1_vgIdwMJ$)@SSHQX?#= z{gOaL>W67%*4m67C5Z}gd^`yOaq_>sHnVj6zE$;4)bWjuP&^{M((|gHeIW|_MU94+ zKcW1o0HZhNcYoK1)Q@RSrskWWScxU^jN74DsVN-FtK0=F{+vkP9seLb)AK_|}PHF;r51#4po;(nHc ztB46FlhzDk{-GW!S!5iINmGieNAO_vLYl10j0XB3cj?>uP{$dEs2hPhoZi36z%j%v zlKPepd_z;Kzi9Uu+v96Xsb>{;x{pWjwxkC`a%Pw^yeEmLcI@;AGpbu05xSq*8PpD!}mPmb)RXf%$uJJtt~yENcZ8TLd%Z3kep(|5`I(qAl^EP6i_ z`zVx05pBrc{Q&A807`UEWiq}1A6t)5htWMtB9vASBJ*7qSq%7O^*>%h|Cdxj#ISwmny~J)pl>CBL*8vX4_j6Qk`db*yn8$YuRv%ZZ&kCHNTn; zV@GnTXZi9EK|c;(=#115oXf%y(SKPMBWF1WXU=83W}F46@ZH(dwgBz?8drm|G3XoX zC)vzwAGt+hIc%bV*^kJyFi_IWu3`L7tbx!LthyZAm};J5)o=WJNiMAYe_gP>qgvjq zDj;cLD0i>E@j_RVWl){zMg-K)xU8HBZ`So6E6EFcmo&T)eOPQFvr00@7ue9|RRLNlDX4cBzuBw3Y!^b)2+}eIfk5+*^5Hye z@P@|cny+5U#)t)&pjldV1FA;hGd_74|9nfo3ok%)!pXbvXD`C>69D2GWxj~NPNj03)2g{2v>k+fyl4(n z{3Ts{v(XGIU&R+yuO}Ts-SI>xa>Sk4V#Q8BtLM|rMRy2fX4{CzdlX;Liri_sZ)@G_ zc^}sYACarphPXrtRjnC!cl;Go;m>!`BqQIHLBkgcb$#>NSN=;dZbSnsxvU{$>$u4S z%Pu#ux%i$;-bi+Y>{4tb<{EES_MdcBa<7kT4Zm5Fc9MHj) zW&I2U){+bVjNP8ai@}9XykhEM`O53VRlrwCSQIPhN zNa*Njs!@;*<-N?`nW2+eqw|%OnBrP>gNiH2p6l`(3=&644zO^_DHtFJnFggnDN5;j za8blM!*rdazgaZ+Q84uvTi14{*ckDh!a!!LOVRB9b{1tBT+$8|! zcEgH=C|XR**CN@)UfC{SkV| zyi|#>?0bK}3x-UmU6c%Znkxgf7;UuKH6842 zM7qBqw2 z^Y0^T3*W4N?p(inXd*f;xHkJ8>}FK;F;{g@{KBRWPqybBDUWzRo=KBgrq>uu9kS=l z2DgJZ|GR`>00~nIX{lbz#pbcy!kS(l9(GUen&%knDS(eaYAhn&K6NhoV`fQs`xGDx zTxeL;&m>n_vF6asG_8xgGM^BITZ?t!zk$D-O$E`CYs0kPlb@=$Pcc%5C%s*aqYg~_ zU8jCE`e}oE-lS@XZi5uM6e%XXLohQYCmPYfY{Y#RiCy;I0%W9_#J-qd#9|bGFhwu` zc(3GHS4e?c%XK_!0*pG-tQ`CNw2{OZJ*?1k7%`wtI^_89sQPY@7LF8Uiq`eKpiz+$ zjva0@2#~i=G1m#XE3kpOOYKRWpnQmLh^g0)daRi*zd$dI2+U8DqKOA|!_K?vM>#4P z2%HM4N#I#S>o)iF|6gB?+jg7LXv=L%!1J(JjzQey>N;t%^Co?cdHyunLbIjzpRFXv5Ja@+*z4nQ)p{BL*Y;u z5igN6yIJExhGwy zRINdughK8jijsf$<*Y{7h}OpH7Y2ZUgN_CQs;Bc__CDf1({>?@YyPOIb&^xdJO7KK zb>VH!yw1eiE#`+fO(7$)@FMMeBK3Ps4Qc8kz0|$-97Av+1O(O7n`-n-O40s}_Y#9Z zjd$Srx($*gFmfxutEuECZ54st;&Fj;kPF=!Je?>NPQ0PS*9?jM9glz61A_ z`4^Rz{obnyd=D<#f9CY9Zl<<~Z*>EjrIejf7-XPrIqpt{B=x*u$2~ObROzEIO7S1B z$Oxv_@Y{cQf@>LHl3(qs88#&<4FjI%Pm||aW!eWscUS>NlGanAN2>Ik-}(hFF2ilZ zL3{Cm6vYEyX);#~A(t!3&?$;y>>Fi1ut# zs_aJwO=>Q^)bT#Lo$#>-LqIjm)fB~O`Hp&p#|7Kl-iqNMgRtgmuxz~sn`3Bj*Bb6jT~W! zkmh!r=UPeQ2KcUO4@O5l-q)JIUp8JCSca}nH4y-meZg5_mCNp6$YrhGicUNA)VC&K zW8IQU#lz9cJO;th8J)+B0k$enCcqyTO86SE9?T#6Ue5u)^T@pA9@#Y?_%Hr7yyag& z?y~Nicf=jwp+f@!zl@Vu^id5(@t{1(`L7n34Hg)}3p`twNQxfy>j$$l(P^FVOUm|I z9R{s0>+R&#ok?)Y1ny%DVLas*3GC@?M>ksBmN_9HV=}*_o|hGDgfoJ2b6zhh0Y^-} z@Zd%=K-pX`-v0?8ARc%JYpl`0=^1MsYM9W+O?{Ge zTjGD$IAY&M!8L?=A8iY~bn)QU%(-ZS0j=sJHNqi;2x$KO3%>e2xZRaySC3WjvVraCE9R>3jm|e} zoWj^blwU~^9{~A98B2Z2UiH1P?$AcjNR@W6n7p@Cux?Wu6Ny-M*iG0?_=#0xLorG9 z@uQUBNN2_Kmiyc@5NkpsLeG0%saO?PGJ8D8R&A4CgB#6JQr0j+ySg{W?XxLflAG{&F{5S%JhVh3L1EQ#~f&bD!EES4l z3kUydgW5;;iY)(gA;l`O@aNFej8Om06F3k@6zVsnJSJP`Q`duG4szph||5=@3dWd}Hv(P}fl37v&>C^O6inFH+wPWIQiR*$9BSw$!DIT%^Esq- z6SRsBmi5M)5||YAvD^Iwul4OPi^In0Ctxi~Ax$Q9!sX9oC{*|Y^7FVvPTDIt(nOXC znRVuW#OLtnk91-|)GPErw+CZJm3v#*3sDfzVU`6xx-IRL*5MSo%@lN z+D?bf{J$`__4I{%=Epy!ndD(o`4pK>W{VBn&mpa0X&;7%v8odL3Nk66%K8ffx3SF! z0^Yq}yUI(wW<>AtF7IadcQlOo#>sR7t5#Y3rcQ+(lN;RjR;rtQ^Rjn19uqIV9$1F= z6-4qjSDy~S#HT9pDLDHl=scZ;(g!|^EF~FZC)>PgiG1i4o@tR@?{2gCSAQufTjJfE z+J=raT&OrVvoEvu=!^}pP3;P6b-&~A{;%B$$bM?&i-NzRz@?w%8_dm8XmtH%;W=<+Q4}fnk#>zwD0P5_c$1j&3rC}`e4F#MI}z`*WO+%*@_t57<_uUR0YhP3n0(OG93{3Yp9;X7h)m zZK-`N`Ax5kRLQ+=j?+6MnbZggL*id;tJPrF7E*lhl-5^s{mWM?Nf=$}`;7 zSiXhjdRkQ0G{=}a{ohKjkUHCcWB1*b?305;7gdc4UP)5+TxZMvxZDuSeyr#(!!>r7 zBgE9Egh?860Pk<^HA)S!hbdkA(Z7rADgR^;m_2Z_BB?dsT}@;}|0+RqHzSGulw<#T;%#xh^fL)v z^5&x(YjF_O`fIDUjCd`uR!z7pYgq~G%Na{f{9F=AnE;&mHepYi69`Y z#{T19Ms(80_J+Keuk$F?{GNyPv}6z>Gp;hn=?$|PR0~Uf)}N+3r1P8{&5WXAsFgPZ z<5l(QWSx)Mj8ErrxpJ_W^yl|je^2sCBu7{Z$bmah^vy2o^hL!hgZ=IKYd{c?fP4Z4 zQHobRYf-+E7tXC2$%z%AqUHg|TgRBA(fg(#K038j;-zw+5;xQ?>BC{AmEsA!tUv z(XVr9$40pglw#(Dfj_=vL8r1HW=9uyGPT1=mDmcZ2DEw!;XL5hnSSJ`!k4@X@t+he zC`HWcfnyfv?RU0cELlL|^bFBp`H&7gene)PHn|vBU&fi2d`nQ>A+ncmDYg(&xHbhA z=0`f>k<77m(5Z5je0_OQ;4n59?X;XA_7;_DE*g560=UO(rGf3GbxgC=)*JF1vzQol zY%!c3hVZ20T% zV>kVI44R7PCWAn9c8MQYY{G%&5f9J{NMwb4O}S?FN~tISwskrEe>R$C@|SqPSP?PN zdOYC#gGnfG2#iMtyzTM!hCaU60P$&5zgH)`0r>x7$B>Jbx|qDUiaf3odm1<*?qpc@ zRx$)Q6}c)WRQC5>q_`yqteM|13F!_x;_%3VQ+dQ{?opJ(YUy=&5>RwH^MhM1Cf+4c z{IvBUf)-VAvJIXP(2##Mo5nH%{ORX@oq&d+?^pRIQX61X=x-w7Mcb7>p5W?v%PL|@ zGq=X#*Xd4ut}HjfTP?a|fmJ`_`T^ZD7T1Ck|FolZ@<0)2)HVLzs?Dtuu8B9)5uCFt zf4BH6+;t<%UJwlo=r90s*}>%4GTXUiCUAy}Td`bTO?GeD70Smw>Cmrb_qaCIe<|7t z>*5c2lv(-hykmGUVYOhJNDSw?LxN7MOhZBDQFWgj;y~8I??W>pg!9cXxJhH1^)9Y* zC;4TAh1vKFw^->D*-@ADE-1zLQ@ywzD)Zn02ar0&o?M2V_l<<|-W{BFH*B6$E^)Zi zG2MFZW|eztta`3W{^m!;{+m*0hn$;D#`#(*jA@e0DhF74?fmFvvs`u}F& zMKa%Ap@c+#;gxm5zSN;D4?EkDNwg5Ox*s=wrr5fUAVv&`bqDunWP*_oa4H26wElHw z-4aRUpDCmWg>=Q@AX-i1-Y%q&rHYo zqsJm*4bqU_iVb!3wre?cP%&#V=}@akQZlbQ#faUF?zc#}Uc<#NflXiQs#d$@nYJjX zmbc>U*@uD*mS4!n$hOENA$PoJn!4@Tpm2)sA@Sl8ieKj(CDsVkKPO(rjHnGF$*mglsrf+(G{=O?N8iG6l54pFzH5fRhBtkwSy?qWwaDpidJA zNP33cgj&S}7~e_spjcCt>%1aRFcd#zq~yf(*9$FBsW_Aj9AfPxLPzz%T`<~kVhpo$ z+QWj5Knvve4XO_=;LgK5k`R1fVg_+hM}01xIC6q{Wt<~vci6dVE=vW8xKo*I@2H0` zQfI63$#J9TI`s&3fB3=m-Kl>SqFluP62=6qAdA8S39#{{buNo;aPg)2DLTDqZ`Yl; zKuzErPbtKvgVBZU?Z-zSFDB9ajCAmER|5O8`f>UD$YtizOhp92s`aA*{>!$p*S2jv z0rROfTO@F~Eu`U}FfF(Ntfd$A%r8x5?k7*6bIyBkFa24Ffuc&-fy&tdUvZRktOwq= zELl>z3si4M(OsAAzC2a6310Yw;&ql-KRJoRHLAGE?HZ_oIcFtaEU~lrKq-tkXp!UCMy=Zt}Y7;U3v-f5ThsgsI}YRy;_QD2135WRjc zSyj;B(53Zwx{B)mVe2i!qWZtEUqU2AO1cr076EA(N`YUpl; z?(Xg!x;fk5|2fZjb6ySCHN&3SG2hv1t^2+|ML}Qq5Gur;$L1&46j8NsA82$VH7=FV zo7!m6a*P-eQ=B3TIw8i?E_4(I-9Xahrdt!N2)A9`-Sd5*Dh^h0h9Q5L-7h$;PXu7< zQcj=B_M#V90#k-Nk+*X>N7cu$E6a;eF{es}XK1(5d*{(>1iYYk+~;z&(NA|C+1Ba=IY&XIUVeAnCHsbyfj-d2wx>PGKBZ;LZ&nfJ zOHM#d&7nwiT#y&8^B;NO=5nwUl8w&`Fs@_x;r8h(tJcra7)}NeTJyty@ zI&0o7?&S!T?L)*;=pUMy6fnYpTNuwBr%6B_c08viwZi!_=lGUaJvG>)a+cc^WGW{W zF)=$K=?z{sdy-W6l*w5OxTfg!^T}U%rYdSlG7CC-d?KM>r(gfIJ3KPo2`P?rwUBHe zoZAt2&Rp9lSVJL?9GUt!+#*0I0LnZ=LH}B_Jh8HLs=y7omfnSo8RRMEM2(exT^_D8 z-vryA`5)1Gz4?{)+2?a&4C4hJ$-+_%%cWebwuxp9#Tm;|_c7T~ha>^d<7rVA_Gn5o z$^d6x1qiHa{9 zoy+1*RNyY{=#f_RJLa}bb_Sqs=!#1G;+Rj1-E_QCnKWe}&0b2(Gq7&$ zMf3m7ASpdgFaOJ%>G3J65Jeo0ZpDe9D+4zo6UmPBte)aQk zJypT&%_8ruzUMi%k8!U4t0J-AOI9=U-@WSP@lw9`^d+O;hb{PRzHxWX&*EM4GMe%i z8D2#rWG`oOund^O5aTt%O-kY9exZTLjiO~b5IOdBvo|3sjoLmvM^AVb=9Pe z0$CZMF;I2vi#~@M*x@CBK`$S3B#zW1DUU-`jUY{vLRr)?s^(|3!%udk6Yq=EL4ug6 zc~F<}ClhO>!?}p-ImSQE8XLJ_-i`L(#EE`^ja0zBu8<+ok9(X;)k>ed{{X6u2txrL z-vXe5D|PFD|M=+H(`IG18wE_$F@XUt zmJ4QIoj6d%yAY)UJXuAnqZ`qFt?U6CLakNAd)ETju;uTtSRmv0*Y*yL4xcW zxV(3JUF^!QvE#<)+Zx(t<(%Jk$Wo4x@oIr{2R-ac^vcbm3L8rth=%&hrvT=7sd2wL zyoOyYwh;K&oK!0T#NCV?puQa7VVrv0?XmOB956+8lKGL|_!nC0`HwKgstWPnUuGmz zT}Y_B$Ta@XcNNu}(Cj=T=QSBJWSr5WHDF5Lv1~5OW!V;BF}yA|wkH&j0seZa;lvVe ztBnNdwW~VHZJhP#b*p+Ub?06Ensb3;L&A$-+94A()+f1Ow%qv-P@{Db4OjcaSn;V4L$;&_#Ftjx$Yi0IYMSw2SEebeLup8@ZG4f z*5IMwf<|7HPcZfmr0e7quc5K8>=|b8gnv2`Fu?TiqyG@Fg)fM7*`Ouio%F4XWaD91 z97HwohBHUz@=gHq_%V0wMJu*k;u+xkX>8N@e~QN=d@Z4?Y?WkrIw6d4I*rH`Td_ttvWtZ^giZq54zhmJ}FT(+^l{;er^)uCJ*M&br3?Zcg1~ml^U(nmI zEDt{FsyP?E(l^xXRCfGX8n?-y@wp{S5L4nu`af5$e z)p!jgYSld9Ot#mJyE@y(0SJX@ZGz4oEwI;$dpTBaiS&Hwcig%veOc51xrMC!66N_1 zD3-4P8sSHUKbH4fc6kV^OO6i$cI0vO{fU12g<{_C!H64oR~suwzQUlmj5k3uwZdoj z(eWic#FykL8w=Hkz;OOjdNC!~@m1bJY&Gja0EYr`)lm$TKcBcFf)iW{7^6y*1l8y% zaoSuV@4d{DjMHEx>cj=guCdnX6)Av2irUnxv_`r9_=OMP9l{(x{D@#-3)u*k$~gCD z)Go9s%r&6+mw_8;U3ZmzkhwzcbviX9V4nkO`R zeyR{t6V94|B$DYk5Bvms)`d9N?pluN!vf%KP$O@c3W9B_^<+<3^H|L)R7kOb2(V&( zl%OD!MZCD1v{$veJ52`)iiv5{z|5E$^y@qXjFZyFr!nLLle~(pOwS^~*#xiMa7#Gq zotp;R#{O_+L}@$Exlh5)_sF5ldUJtWP#KTJaHn-w#@5LWq*66V`R{};$RJMgrNC#n zwJ*Z5Uhr3IV6?HrE>MzP<_sB8aB4B4@(`+yd<*g08b|onX0c0yPF9;fQa$uw)eRoL zJPhQz&(gQPcGT@SP6dLs=Fm!?-U7ZdA7>V>7T62a40do@_A!MTqkr)t%onJqwHXoS zt8JfUn{J+gH;&*h?L1V_T=EjhL(p)>W|?evoFm-Q!l1U3(qKdgcxW6=H1fFdB8^XLb1;6KFBnjFF;^hcQb&4H@=gmyq`wHDC;0+Xlhn=H&;f{a-ng6q-INr z&|EjU@NeTU^Fz>~@S(_|s8y+0JX)JUmtB|d=KNsIpgXX?T`NRpJv%Q(+FcG!mw%p& zb8gc*57}Cu#ML+RQIZ#Qnn8u2tZkqnFR&$+dsPJPcf0HyCVELFAT;ETiHdGM-zfhu zivhr-LX{tZ@v#&O#U;rvkken%CwyOmb3bMjqqBLNn*HBjd+_wSHLdH|_nYCTmnpUu zcXZxnSfLHV6FsZeunH$%rHb;!hsj-tC%|W@;&19NKdt+^w)-5IaMKslzg@3ryON_A z*&4Yb??51|mv?gtEcfu46AroeZTnA+x96J6@U!jc!B!x0ZBIC4x8)QecQrZuqF$ugVa15(byhiFMQNf_PA3c1BIy(QyQ)Pgh(j^rdhr>o= zx9*te$?8b3&I~Yf@_Y0{TX90x`2R19fw+;TRNR~1K$e>YQQ0>&@q`_=0nMRh^VDF{ zeJU)#fRj-AZKPa3Z1b33YE{lol~&>Z_uGL76*~5q1;^t2L%&~UAt$2B?_V6+n~R|# z1He^BoX>yEkp2|ov*7xzZ1JPLJF_k^y`-fr&CzeV@)6qON6P=tTh%)KoR&fBRlJ8b1(XVU5npzE3ov@1NuQCA|UHZjy6#Deqyp=k(E< zEck}-dh);|zread_lbM_Q0Javf2BQVD3g)zG{~*`qzSTYxgWPz{zm7LqT~iz27Zp- z_`Kl0!FxjeMxsaVBs=0YV1)VTeG7+6Ta!V3td0wjoBGFds(Mc zx!Qw&BL$)6V21mT+p8tZw!4nhL*#igo`@Osb>BPImh0B)z}wRf0rUk`7Aoh-d%MxG z{Afw*kUr^aNtVgkk&D5W=WkeL<20%RAu31x%nz3<{Vv$cb`3mNKkqE1Pb7uN?lYhy zmmh{x1@?lA(0Tqb+e9)`II>?t@oZ%I6oLHA9D zjAxv41orRme}Y1%FA8_TW9J4^1-Du7cHRxQ8$t)RZnvD!*upZwb?Y`ghEC)452wTI z&qAGtz#vP^#)wduI5esAo8VieP}45!O5QJY-Jb=Ae?90s{?2ocSm%meuQthr5i8~D zmj&UQhlx%Fp_P8<9;)D7DDC?HqgkOY?V+`+Y(C2E&Qire?}nB*HAYt0!Bg=Ttl)%% z7#47~p)@)P#O0l7BJ}Ro&o#xgc;4gWRj>znO4lb63Utfden9ZtMewiUSI1VWUSFIBQ4yZ1G zbpmQJc3bzeKdwkj5ESXryzW)tvYIRWN}x1XsQDvseM08hazssiIt|F348YO6)Xfi! z#VR~ge`ISu((N{$&d?C0DT!b@U@N`o>9n(`UhijOfmAq}a+?`4Ap0Aim@IV-l2st| zzGRpqv!6~_`!%&j!e@dqDTmGBBzWH$I%S5LlZVMSvUsP_8YmA#fXuU7e<=0$yX}J5 znxxTxNfM>6a&3e*Bm1b(!n)M7H5G{N$=T zq&1ZBbLX8nz1bdvY9J;bhsHf-{oY5!yJ%mvOeR{|0sK>&q7*J3fF6w7ror6zf>qnO z_ooTHS+Vc&0C#3cgnES{b)V&LsLs}H%0fXzBD-$t;qRomrHbarQC9c+VXcw|vP$n> zB+o-@VK)GParr!%IU!V8>|BAMw8gs8%kDyJklmmvsS|)x&6GlFyq;n;7K1*{{P|LlsJW zN)((Lg?Tkx;LAIrt9U4>Tj8MqSRFO)FbO)pw@fplm6vXwb_^gP%$i{L`?b>?8cs{h zP9YAO=hDew1N}a&qsnby>|!OWwg}7znrulRhtpqY6efkx1Y{a!TumlD$S5{PivUQ& z&g0jDK==o~yT$Fq5W}U#=iplMky%1a03n7wBYbir2HUU8LGtdeP@+vddIwgoVbykg zO~u^O9WiCRkhl{KKqEG4=4*DNPfO-%T%=?cJWPF1wp~ad)1ELUpOo41`LB6F>VO5P zy=c5S5z0TCZ&DIP0vYdFfTS@r{wkjGqGaL-HeeFqG^RNhItQH#^ZLv6o4t{gt612e zbu~02JM*ZbJ!v{;5CK!1~(&7?f) zjzvHwc?{RkGWo2haL?sgM0oQhzR|`N7&6r$mTFD@HVFZ;l zd$f%-a4yER_7Bn=TH&C~EB*KkXc!39JEYCcy+iD_)ucQymcNN_{k`pus^;JhwdL)~ zJUc1&FPp1?HO@K6@r35!)6EvwtAwRezq7axfZRgMo_!D-j%-@I{4~2@Kqx{2>7sfX zwLxCT^>dIO(rONw?M^+Pm6)}K@JbD89T~sn0w=8QOA)-8!!sx0)Uc<)s{RG_47eNs zh78?NheFpWP*TQla0%{7?Y}z*+s2q*^#2#lN9lYt9`t_7khgc|Gg_jR#Nlro6@34M zz$L3<75a@}4FT{^C4P-h!?Z>g3Y}lH<*}bo-;FR#qt$<$)}lBFBQCr`W9BDH5%0K$ zYDgF76{WlkD4lV()HJE4kTI9aeRV zKN(D`ZT)1dSZ^07VLC;Xo<%P~Masy$&@(BB4mVh6DyT>tC3@Q0AsLR22rKqR8ZX*H zw&+A2ER^lOiq}fTIMs}#uBj|P3ya0UE;0@#1iyu7=LHp^jh63+tCk_bab7ZeN05|( zP2(xlwk~6RPt+jE7uaBVDQoo=j13G*Ng^&v_0*pP_T&l?pY})Oxpt?m4MdAxON7TV zbj+q({Z>H5jBqKx8MFdLEoqf8K~nkgB%!5K&*2wjZv!E!ulX_<%RCaM8m+3gA`~3FgDF&DUPWMa6Qns2$ryq@tdf0omk>m?@>vwV%6I2cxSR%)28Tph333gO_i2F>?#z86)t%YO zpcpi9z4RQ6KBO)^mup)yf^{;Iq+Ixlt$O>So{>|z@96@F++Rqj^CXPykVdyz78j%d z^Zk-1Kix=m9ig~=!6?+-FV`NmfNMzhQo2}_XAi7mJ$w;OttePdJJHN>GJGIt^DcARj~bPy2B_O?r&8LYp{Gfhx$UbPY`IAG*YhnE?xrw zA=gTh8+~^{)GMTsPt#gkw@X+bmwl~)SaP86bs%gdmxP^joE}LE>A>ux

)T>pkK2 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 XdQtAXk)x;g06&|H_7=GF*YEx(g#7ps literal 0 HcmV?d00001 diff --git a/docs/ug4/img/readme/navier_stokes.png b/docs/ug4/img/readme/navier_stokes.png new file mode 100644 index 0000000000000000000000000000000000000000..8d122de2ea3bb217b1ecf37504b36ba3703b6b54 GIT binary patch literal 319785 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

5K8f@P)9sxK3d-*SXa*?ew)Q8{ zmVLHG_k68{bAqxIA39tgNO8x~%`?Ar^~X7jP&-OC8(1*!Vj;g#B4+U$Zi*bVqzM82 zenRu_JVi>HJIY8&R4W_G;pXlvR2eOad2Y?r{Dy}AkD4u1M%nM5V#!W*P3&_8%3LBD zTc%TJPg79);zv{M{cf}FzRYIj+&lNf#OVC*`Ba#4Iz-=As*SwaLtB=2Fg=YiI*rt$ z+#q`SB7_{~zG*{Iciwa5{gO@B`)uUZJrVe4;E9~6&xm@_!sh0fq9c!TC}K6d-Ok}A+NAGff@=L0{avs_L##BOQ2pkNM6EUEy?AsBH&x`SD7fO|{6*?7GYn?Cr1{L^L17m)t^$MEPdKDPGeUS|PN@dqR;9AI z3L(iDbv30BiY_EYTmto~sUP`)d1zWi{W<4_%E?c!RTjmYpcpe%Hhud0EE($rMpFfX z)~%sXNaBfMYr5a(z|q#wm#FSm?|m*GD*X&LSDiEK6l{Hq6biHOpr)7hDRdz8|kBjj%0 zXw_ux;)c|*<+18b!162i#s@k&&txt7yANYr063C0;6#iM`r(Vmkh{W(rmG!ofM0TD;yle4a=<_8YC|_kZsALn9At0X}3Xd##?iUt!Mbp~1Ant?^8dLC+*4 zFlSNrDr!0bZpcJTil?p4C3Rmm!_E$AL5Wi(WtNS0w5#e9s<5G&2`DyL+Cc|DI;V zx^GxS1aA$SEE_zy_5d_}%3DfB$mdeIeTBB9t)7D<>gmeH9Al`vi8WprzN7(qo&UT` z(4B%8H$O)sd${5^hYr?0>qhFqflzoQ93?Tpiip8Uzg||XJn!|K*7t_T@+C!3Xbt~J z`jFFbhB(s-;yk$YUy+MoiQocvr@v@jmOXNi;z;c}h~b>?0rPnIi6JkxibW9IdrOW| z1Y5wnkJX;^HYt+k(_G+?w?SPM#fcRYgRgQ3!i24ck>540ha zZHCh_k#+l#Y3MqP9BNpK)N)CLL=FKg@ZP-4rA9Q_6LlpR;D$3;Pb78DGi0^aJ*E-6 zU}@UKj&C~ol!1Z2g_qhU7s9p5Cu};NtgW4Pb-~Vs~1Sw@N)xh8^6Y zGd2vtPrnP1o%iTRnktnC-=#U(2WJ9W@C}E0uG$pEo?vV3p zB@0l(p5L~122xkIwhz{z6!-m!z)*~0^BYRH8c84pzL zR&lZU_;xVoDP!N=-eURWL_2VHLEVbgfO#Yib0wFcDAn&pOW5ZA&VNh*0MN=|-M*i) z*WbY4V~L1-d;x!Su52L{PdBk*ZqfXsP<`NPEn(!BGYr`xD~H59F={CTQ*4`KA{9-& zi0EU&6fMpCrUIxh`}=e(j6l`$dgh7r4jlN>Dgt*_#zo2}9Ve$TysBJuzu68IC;v>? z!S;)$PudUD2V?nE%l~7O@;@tz--&BK3>tBXPi+lS?(u}? EXA4-7VKKyU|9OYC( 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

`L%NU2p)-rN$!LEgU<3 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%0DKT!MF>>u1!S-D%SXUfsmSN?QE8v0yTnwgE0TmG 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 z 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 Lqg<(I9sd6S!is1^ literal 0 HcmV?d00001 diff --git a/docs/ug4/img/readme/poisson.png b/docs/ug4/img/readme/poisson.png new file mode 100644 index 0000000000000000000000000000000000000000..0e938de653184026b2d4fada25faad8f3369ead7 GIT binary patch literal 217648 zcmXt8Wl$S!*De&d;_g!1p#&)|2~Kc#r#Qvk9fEstDDLj=R@}X~Jy@|X?~iXLJIS2c znVsBck6aR|tSEzyLX7h1(~rar)LhTRJdve&kCq$k`3dP8QUZ3-H(Wsm zCh@3QkzcdQNx7$AW+fML%jjZp^OaT4@yDd)XvJV>I&QVqGg7wn{Y6}25RNB&;#n7X zDAAlWC8gDh+rHjy-Cs03tl36yzi)nwa}J*pxqw7eX>Y54kPkg;SIUK9!j0SWK0=lt5MXCXFwRB84f0dis7(_jkN4`!;(yk z-ti&&*lBo#+a!0lG=k`6`g(boh%tq3-+G8?CWQIpN{HJ`6_igWWiy5vh?ZGoEq`St z4vs|%3IHH$>)Fp~TT#|lijdwWQQUjHkmw7LNnxYf@QUSXm*7k}mU;f?I39b(c~MfN z5h%-&uE?|chl5o6{UXo2^QYiWMGNhI;-QD0qmP;+!0BL(D;aSI!ZR61zkAOaLK4lbLG_%`n`F`Gqd)|%G$As;MXH_h29Kbb%iYF`T(a#kK zf%Cc0bY~Ia`wf3tP32jyK&hzT5M5oci%kq|r5tO39sc;g3jsRrld@+`fU5a*g&WYcLW^QOPKfEDR2uHpYMh6vTy?7Q&oar>j z6Y|V-(H3&={oN}V+2LbY9bc0PXdG#R3=oIcok8e)Si}ISCltfqON&;MN$omLs}O2w zDO&MJY<-Lcv~;h1RbrJDDCm{LF{T|u9dm@64ycW@VR^cHbg8ZhWtp_i#`$kJ%K8)u zQ<4)cEY60^?~Fv*p?``w=&S<&gj9PsVd>Tf@%`n4*QBlb`GIWUAc_8A=-GB}9S5QrD2EhRMYA!sou_}TGyB1(}f5Pn)KrcR!oY601bEGY}$sjAON zYj;-$@pb8H)7ZKx6onFvOpLNj?Q`5CJxg{4$GH*`tcP!oBbWA$|K zj92GB4FV?}CKM1MVMbE4$GkWSg;Jv+C{=* zQvyX-8kRb(I7qTQPz&a2yP@+ZchS!tQKqp*jv_`Qx|H7fO&rn~(rw=cBc8ykP8&i6 zXvMIR>I@994vD-Fpm+bIG4&H`@MQpg4o`{mn!==w1Bw-q4kN|9xo3uQzmA(qclHzj z=yc%9>R~Jt`dmplhy(G+xb$hNn<52&WZp*%>&5=$vv|AvoQ(spRF>Um!R0^57|=l! zr%o|*Y8o3Jz_FP^DyGE<=Y=h&1&Vdy)w$*mCxz2gZ`zquiRnh{1u$q7@mCsHU(a>O zGdb#0`yPlwIv`|}9E^>R1t{n>3EgQim}&K{+u<{u@Ni;S z1%OGv&Do%9Gb$^(0_<8ts8;~fMZGq`~stA z7?$7sCl=4#vi6DaEI}5V4o1pY8=y&-gW-AmYvz8Pwecq*qH&R?{{8sbenn-@c)LC69%LXaSf6a6uI1_q44+(yYNkPRc!I8@+n?`O7v*9)K zc;-(DE>&+$8We|e_Op*Z^l$XbWXo;rF$9D z;Kt`jP;$wE)m2*EZY?{pwwV_+WB>em?L~Ip{eTu^-qYCXyiM(NDC1vqa@6~Kn9>!h z-@b>uKx%lANWoU~k){sxJ44ebh{0K%k6Y9!p=TS(iJe8N`M_e}zfmr?Uy=R7>h6YnLNC@{=wuxzArBZe3 z{}{y#=qOdEIW($N>04d&xu)^N84b||1F@oH zrEbjlcFc-ez2UhkWDRTK%0(H1l&L-sjgVmRX^`c7wW7sgEnlK@*lvE^VV&~7`@*~3 z!RT=&)zbCS%@IXFIU^Nl zVbQayzw1;gCZ9j2H7n=uP%sVbuX8RR+gFMQ{-(kJmWGM%BkKppz{?Sw3VCvfe)6=K zBW}E5pXX`HHmtZ?MWly=L84k+Wd&@od%R5{Slc9u|GH^+$Q_^!ow+>LYgZFPfYm1~ zg8RX`5B=XmeiY;meePRGvuk_FpOM=FK^S7^D}t_e6n$rWXl*KL5@N;FDuF|wP^4Gu zy#abi#W7j5ek3?IJrt!@gJY6XnL`%-P3`tVlc(pARjz^U>D;rwR5xzw^F%(Yl{?RU z`w)K(^18Om^Xj&JEPmFj<_otaa(pCTdi-1c^h1*o^jv z3UsiCvEK=sYF!vKqTw3IXrU+=DMs0X#_XW(QQYN$LTh(^()5^le zG{1YJ<$Bx{)itgeJq{%RRB%JTlPG_h)tNp0N{crX|87MRNFys=gv)T4Ao`26rki(! z{)(*O#hft#e`NVm76So>?lU1px;tz-DmGn*U%vDQ9A{f1^!JsKZo zf*MUW&iM~CZNT;?s!rxUPxK{znM9(@O_Ue*u=5`nZH`?Mxz@L8dDiVxyGY_7@BH!M zLY#Uvnv_Ap=mw1BUYIHSP@C_2ckb>)|8aSB#n6J`0v$GT4iKnFN5WMx+)H0?u6ihu z;O?aZz#L?F09(%+yU9`tin-GevvMlsSu3WHhL~{pX@RX5qsejS-oC`$gF%(pd<`rB z>)+$lE}Ds8%T)i{u5_EdQSNA5BNRt*Wx^4F%j>hHqno;N4f5>TLK~6f^WCWJQ7%!)0s?-9XC5<9jUzY)0xXvw~MH$}A$r4uK5hU`^O6xW0#~?c7U+*K+je75WS1`$K|07fY_j zwrK4W-g8GyatJ*fkcL293nC!_fW#0LQB0K6sgNRK=d&hwd<~moHr52#(^$+;IV5a) z_Kx=&(X!NUrm23F9$ZWS{z;GH4msB~6iYN&0ocRYw%y$>nC*AoiN!O#t$#MbC$*v| z(cB0pEbInm8~%D6d<2+-FzvPHcxU!A8C%rxLP-w)? zk^NGjZPB=U05D3;E>6 zy)#&?&up4bG|zl6Nh!?18hJ6TY{1PBvki8`VDwS{Dk0`xK7166gFw&NWD(NfXVq^d zlgwZd;!7Y~xg|IZlNW*4Jp~&F&cPYtK8UV|9!Ihz7gNb-s-8kV8zwP=i z%T_PCBU=Z}Ru>xD953@9Um0vMTv5W_c#+`Z>Ybie zDlBo6X}_9ZPV&x}DC7>oQrD-v)56C^Y2?n#Whhtl@8^tVK*t{n&RhXDi-xV)YVxRo zjBr)W2O3h8@8*-smyKEmsjq(vX)4bbE{F@Xj2e5>iC{ho{AG0p&4hyq_V3Kn{j)u0hjPx_G(YXBcCQ z0D(e?Cvb@nw3pN^OoI-b0+$I*LsX(z+-ZS-p9hSrGD_mC?THk2!zqv|16}TFR}%j) z#}&a2>yX>`Pw{%3WYV@!%HEYYaZGiRVrkM+2s;93-K&A~;*_6(CgEs!_>oCLvXv_v zO{5Q`Y3%SDokX|O%eEU`>jxtganA=^F#E2O?rf!V*Y*+66W@b^ZD#LA%Yi3%zW$*kDepbAqBR*3slBx%z7%-2)p4IAy^_1p{&J{PY znUVg9yd%KU_cR@jwvhmPN#whc2V^cgx@%cO5Mm>$hio;aUOQa((y2r!r{jXW^c1!H zx8T2D0(&;S8_uy+^xvlqt#PDpS@<-Wws$K2(6mRZ=YBtTdj5%c(n~0V3F_BMED3W- z%M|io*?07pb!U5+Mx_J&hM`Wd`s`G;vOSY7&+2};l%YuGB!xvUeAh=M)+_uH)Jq!Of$e%C2-J6PGBC*JA(rC8-}V@K~x%i0q_}x zSUGT;d@i$MFWdCRI$C?2$8?VRx^Y=q6ZONl@JfR_RofDu4dWu&4xPyzT2pt^ z(NJcE82BpRA^V)=bj_M(kN?K77QOx=lEe&YaUcYVLM*~$9%VZJNt2xU+!KbORKXAb z8(!Z>q=CrxzM9Bu5JIA;BXAKS@!|jwpI7biTd-&$9%XW#JPw$;Xn-0E<^6R(JH>Ns z&68rupbFWb{deb3Wi8rBt^av?5yC#4|9?1Qq4PdXC2}3? z<}T%}c+5b(!hD`#c_J1`wjwgwr*+0wqu{A&#aI=mEL3*?V9o8ef$>B9_F22?N3o~N zrlxm7=3+`DC05;8?MkQC?*cT%1+!KcSq9Tu^1J>e4SME6qZw$<2qTQTXWtEkPN27l zBgwdzj~}k<6K@jQlFA~-)E#69-(8K*+bsR1P4DLdWKz=>+oLfhGtiB4DOBiEDdKvw zhXGG0YTVv`!Ux&e09uwrZADg(iqRBuUyh5LB;cb`nh<6vzK9~BT%^bF=mg^i-OJEu zurEiNNaerbM+&*igJm$`h5U09@f`0oVo(0?;TMi7)e+GelRAE=h;?B(pFr{gqH#cA z6-#wXJr%oielFJ5pL8sT7?I5o5L-qO>^^N%<{+TeSN*2rLu@q59S=nP{5Nnv-v9h* zpF;PWyYUs_w?}xxHWG*$Zd;1hZUbFxQc>GA0X*$vu2r>uET*hUj=!FY-Z&;SGX(3UOAMl!_fqIUvU&L(|i7F&)Pi>hc49Fltq+izR*#zYv6TH zX7DjhHmz^>t4SIj6206(_+xdOILFhp>ZX~a*yq07MM6!b@tFDC0fTc*vs2&^O82Qd z=h{ej#klI!w(##5*#e94XSILV`jm@#=Zj+^H-7s=jO8R%*Ta9U-C1o{Ktz%5B7pp@ z1#CV)L-@#z`74&*n+m=5ZIVG8-5{Yg%OzbjxbOBIAOnNR)i2ge2_>I@n zDazCSghj24*Oc6U>oXOw)PTqL`Z+*{+r+p{HZ^6$g+5)8bqVF4??8hkL>WUMzi>tV zt#B@@Wb0nT>C`YAbQ4`~x{Ggl@E^Rk1@t`qxuw6d4pUuO303)8uJJuXfQm7Omc17+ zHuA`;$wuEONTp3Bnt}}?0-EJ~eEjp0HR#Rh;8kN7YuaC%68ISN_e#3*xnd2vMtJGq z^~a9v?qoF!%R{v2dC%kTTR=ws;kG1nu*o$?(oUo}! zVoMd0;7I$)R*j;!SH{3VbVM;_y%2FINXpSK_7%e>>NUP>~%5xPx%pzSEph z^SP$l#{6SUG7fVI65^)2@l#>U>-d}XW5FqKsaRYDP#LkHH*W{D*F)Df z0C(QojJ6F0Y|=a}Jfexb-UV6erc#2-l$|!*J3qAhHpF}Pz(9>1oYfHeL+i_hRiP7$ zA|kyWgU=`IxJYBJHe=2cO(eYUh1+dYS=(M&kJ~w>``Y5E+R2$!lTV(;(w!pQ9%KYO z^dpcMUA@jbH)XQQ`*pJV@@05m(I^@uTri63u9jALq07YX!z{ZEi(*$ZzA5RnKw~q{ z8fTOA=r!Qb%5pMV=DYM;vJJP{iAm1TqQIgwu#il(Je1Tv)^W-AWB{i^c}s4cg)aPk z4wvyeGO>T|2vPJmd^nzV+nO#!l0+;~Fir_Ap2D*8RkkXbOo&skd=#aJVF6{VYb3KmlR8K_ zzsg~higFp2Ug$)4%@tR}@mOP&Cyh3;CNn3&;3X9si(%_+l4BdawVv4V*`!y{Vfb}z znVPLS%#H%^ey!vJ9m1=tEtQp$dL7xnss=%kL$>ote=Job>-KJvVt7JHT5QbPMBt?& z`*D8zdn=U~V4&3Keo8^l7gskVqMzwudd z7vVlD8I|Nkhc-q)HQb*}PDI^8@F}L2={S_EG=qj*(`<$QSy5QNDFah88W^gnxkD07 z1QvyS9b-^lzwLT)QzOBhNEW&b-1H^q#KPotx{u!MCIi4cIw+Q;h4~cB?_+sn&NtxL z;4V^ImisVT6e={*ixTRoo!~FSua{SBP&&ZX-j}VWj*yZS&YJD%Z$l6&0re39uJ)1Y za^-cVJ)zfa$77ihM~J4q%t0I7Z=~ONCpn}~PCHPD^*)L@0y#^AeLv9edH3MCzwJAP zAA7zFstnlvC`6W_4=W|fd}lb^kd?G#qeY_?XPW=R_mV3#1yUWEN;@?p3Q44l!ZY5v zTK>ZP&!9I6(X#Z_Ic+`W|M&cB)~&W%`ZD)po)d@y7|>Ks%BqrVb`sAk&_+44c;KHRCqU@sozLfB^M^eBs zuv81Z>z+A=7V_pn2N88OV-F)WAK_WWj}w+Pu_nAkCEgcZ8VxqynXmh|Ttk(k=u#FQ zH?1RP=?j@P+19hhMatNa-;a-%4j9&rrbqb9aQQ9q#w_i%ER}y|Lw6Tj2&~*pAd=WJ z2Hmww&ORJ;QMj7bd@Jh{8HzrB!E*@3uUjo2XCLQvjik4i9WnevoTG?quIQt~p(>0ixN3)X7T$q&(T7DO2oS{zU4Hb6R)(&4#Y5Kb85%7?z z4UtDt$6dL%+`4adQmXU^EFWEBCahavtM#hDR()@Xs#{he zdOa#MGhImo)S|%ojT%x|5%IU{tpr(C6MM$p!be4h#=D-LnwPq_QNl4XXpA8I^BbDaUzT}Cd`AQwM&wK5IB+e&AyP&+ffu?RVFNT1LyHmp zC~G+Z8uSNWAxXLB-ZFP5$EsW2{)2Mti>;m&!)7RKk4cUwpv-3>)H670WubPF{|Fiu znf4Q@WYvgP8ArJlAV^!U4@~i8a*`7N?*+JAe17}b_0`Y}*XvB)%kJ0VY{+{f``;8Z zM`A=OGM**Ss*`m;BwdVq?0JY&EdqDj^m|JV47v~AP0nloE@&CC6S-(`E>=h+>hWCm zA`tt=OL`FpnmE;vh3a(+nR26GeQ8!52N-6w)j#3uq{#yIV077+45e|WY4#7UrTNV0 zzZ4ddbuCdD{i$n}Uwjjh_UiLpYrhW@jqCtS1=tw4l&W_~obQfppj=FO6E$%T9G(XR z3)ru`S800hmByhVKLVek1N^oKJmJF1V<>S8tdNhgUxzD|zMeeMcX=^C&@ne@jYP~sC&tAwzdyMoD zD>UbneqJ6!6H%Xxcr1lGrbMF3Ayo8&D&W<(Del$W#Kq^GgbU|tD;``%_crSz?5XIS z#k7=;(_pjIX>mM#t>(P@xwf0sN^$6{GZUDMtbmCoAc0GiL=i!9YUM6jjr4^pWRBE9 zu51QaTC>xV+AH~(YpXytr@!tQ%Z^cA^k$9_PZFJHPb#t{F@bLf<>_-3vM1C5G9DK5^P&C437>R95neY7I)xij1}W1CRE%5zkQEYqiZw%Zep>PtD`vBU-Ma z_)o1+e5}U5Ls~^N_XQ1Is*gD+gP;Bh(Ew;y7{z(>~H_K@8nqpmC@!7b;=Xf-QC}s2Pq|{@{upZoYq{Nc8H8Hk!r%47fdgh2u;%H z;LgziUNI4VL5bSP4&5tLp3RMiF0=F6z_LG|3!(}d(i4<;y9O9{M%?vJ6ahJQa=-n| zo~$giESo4J<@&)OW5OI9m35D8JHu)UqBpm)mU~5a8 z%A(Nt0OL}9UOlIWqB&jes62O>O@1g!#KAGC#gqz<-wsdNWE?V=YkY3}*`0|OWXng= z`5+xWWofFY=A_zj-j35Lk%;X$PvU-Q;w55HVB_W zk*T8gJo!0U98E>QE~(dz>$K6(`64#l^UkNb^}=B3zKsu zB)AmF_9G=iqgY%vI`|HkE{IcXL{oL^D<|t~yH!ssDGL4GUHcca6b#;@S}^_o?Q+g6 z%fRK&tZ@t*H_}a@&5+-puxVKTd%`MG3Cc?lIpA@q6 z*M$zo8g!Lm5_~iSbd8$sA&0jI{jKMF_!zfJ5#r}LCC#6iDgG{mB43pfNwxtxW%YMH zNb_Hq(Bf2ceSQLSt=SA7nY~XhB8sCGf<#laQAD+|#+{>UICIg0fwOip|6zPB_SvO_ z)vVseIwWcVt0N)H2;%(AjVHW!#*DMzE9yv|HHbhqg%+q$Ord|e*Ct^&j=9vCz8v9x znL9O<`4U?2Yp#FU>|*0vFv*aq25>s>BJ+tbpn+F@uD9iSIp3kxTw;Q*+@$rBSIYyM4WfAWu zy7{T|)$I!&qAB7J0o6bg2bT!W)U28rm;I`agEzY38`xm}`D99kbjwKr~ zvpc!h^mrq2xL$O~DFmmW{ezF5P%i-9o{#lX;IY!3{IhRyc~?lX4D({%dtLmNrR3H5 z=)iYERyxVLtlho>Mjf7u_zGF%h3d zW|K`rhWFp2>QBC5KXgT+-tRr&{5cF{nmiT@=PPVXSmG*7TjQ09u8Q8Lb!^#R<1dI- zQ}k%#OvJ~JrP>z~_Stvwb>7v(t$Cbe7TwgWBpzE#mN2__#Ld$3VV>GKDGRO`^=jNu zxP!^~(=Y}Jc3U3RWau^&VWGT_KkwXp+%adrFxxU-Mz3S@p>XN2-NTl#NolOlxbM<_ zcvF+uYJWQHyDLmm`Ep@2Df##5R_~UhLri)gQ&cOh!9FDj_eMtjC}*VVVbKi_~(sr>JY6d2Dt`-~mlCD}oDNp4-ayYF4dwrSWpQxTQdittr$ zcc?TqhKPX&yTMo~QG2h&#KD0jV057B6;GRU;ZW#=8^#x|_a{U9TECu=#dZD6ixtgA z<&xfK8!aUNy2L;;cb8A#`P>Q)qJzQ6gZ@}4Nb#~qU4yuQ8{GV)xcfT-RE{;o0;50% z=dPB^c}g9kKClo0#|8y$<1`q{$11&qH&l)F$Lx7*;9BaCX`$kGdj zC$BpGa|UtnEgaqy#Owa|Glw=&$PaQe0L|=z2uZ^|^)b7jkjaH}XlQ5z&!fL-HsvzL zu8Mw<5jLbjOHv)f@jJPg3 z6?jO_6wIe+=6m)-Kcrip!taKb&kxL`aSo2IdNfg%o<08hlX~d>@C@+QHc$TzMDRfw zQg{E_ajS%+LxVFg*u$ade(G0BlR%bIxLxHJt#)Ngfg8?n6{ye5n|=7)Ayx}uXnF4y zep6<2W*xuev#6R+GCW<>NcZ)>beCd}LnFs=#sO1r2knArnBI-bsS zH@5mqR&EXC@beJ68Cs(PQ<~b?aGQ%V{F$!oA^@^6)$VIT!0uT|xKa z+qOY`F>KVI4=4|h=q>hNef|SQB?PrnxA}Gi)dkIsCK6mD`p@ng_3Z4&(`WZ2)YjtS zFo@VC-lKc&MwkrIQ^Z0|!)$t$oEbU}hgrmXvL4cZz_L*rx92wr4||CUU}Pw!7$ z3o>S>A+s$ClBPfCZ~FRHhn(Vzn-Q!j;hy0h~FrbBle}7#0j-B^5`I>ff z0$DAjp}Wp9Cyl%a4>z=UDQdJNOhu%0G1j-N4kI2!Mbf~C=tlycy5R0`Cc?L z;V|vulb})#jC=4E6q!LA@SBc*KS)^KKD|Ca!M!IvMF(|#EnkK+#x+6{@&W7?3#zB4 zN_@rX!I@6Q2(&&bTQ&wbLo3zg_@_ATix^7clPIm}o0<+`|5mrLt=!#dg?iDo>6jBW zCo#$e^M{v&lSi3#6YTq(NVUtIbjplyp5w=RvLfHXt4(M@z*hYh{KA3ol|JoeOK{a{Y05*Voomf-i_1;N9I0c3Cjn{gQu**dBy|4DbZHSr16Dv8LUoWLSnx*>4vO? z)c2KNl~Jcv=^S8EyI8GGW%`*)3dW}9M(bykKZG*g`Tg%l0bR#i@R*uD$wrTQLE!f~ zB>v*9sBzh0IULl`26aJMvVz4L@F1n|cc|)H?+^Ud8&}syhJZ$d~tbXxw39(zny46C}Or%B*(jx9! z?$$ia^?dYxyB5q)PzW*nfn_93c^x3FZh6$z^CGz2M2#tHJlK_Md2?$XvsCN3KH!8G zJ;7#Ju^uBsCqs|So~uL{i{kg(K>mfC&$CgrbQ{M`w;P72Gp=;(7JH<@7|1E}-Y*LJ-UmewTXQA7u8tp2-Y4L0jid2n}r{CV)TM)@>RC z(Uonu@u-5@BR)FgUELO|&yW-yM7?Ui4;rqzz_(_iT~fO&X61zcv&Oc0mvHmz7r5cD zhdEINuT6}nsQ}zU^uU$r5{JpE>eI}UuXa$v3ylE;V;t>3|DnjVStY6l;s<5QDK|xa zB@){-Hm+ilSgxyOiT%kFtT=gU@p+^nJqG;SP3d=3ql!dwlZt^=fp+$-AZ%G zpZNpbWC)4|A-2Nj;viZ!j|Zo4nJYF-p%yVJ4y9~U>uWu!V}aqHyoR1VvB$a_{>n5; z=wca1R_e}v_&0ZX4_f+n0D-8sc3`cY)i+jRw`gzo?|X!bGbZn2BDtljvyydog9vo= zQG;C?HbbR(;TzizyJA)F-^DrJs1q z4Nqww6Uedy9@#fzH7^@0WqYlV?9^jw^T~SbnFhd0RssQC)??u@3a%ai8E9x|o9SkfXWF}R+V2b8f8W^NnSm7pSGd}9%N`5Y2iRd)^vjU_>=KGo9` zHh1!q4>Sk=efMum`H1#=%hh|)Wgkhz@oZ`6N8El!iQlr%sOFYxvPm?rhu>PacJ?K5 zaU$;)@#w^a%bvCnxB6wq& z?Z1K)Q)Tr#?TqmRj!hu|?s;0z)wrEWv7r)Z?mfA1x#sNt>M$as@x3{iGoHWSY$b#) zqBOO0S3Ii7esf;ekpIeGV~Ez~Tk|zvC>27P4Pujq8#Ln}wh;2uGc{c}CfT;T-4wCA z+wyihIwB1#%+7mt9qf4*X-7lk4>ne8G2HPa-j)4?Qym6QMh4u)YAj&pmLr8U*Gv@YlA z5Slk9)JUfyc|aG3Y{?WIb0nTJxN33bs1jlJBJ!c%<3D!x82s2`kgD(Oo8r>iGAQy^ z)6@TUA&}%0w=@s8>w&M5&h4hKwQ21L&9@Ui7F>b1o4x|+;kodcv0zly$er463}(JF zhGM{X!s&6!()wBLE2+}9L$5X|j@gMJ z8B~KDo`_*Xe4o3PoFj*ctWzhhc}JuZFiHCmc&lrW5s9>^9mR#lPTa8t2sne!l6kPH zrz(KOFB?%ZP4*|1v4gzfk&-#42!4{Pcu&^+ zVL)jGkdG-dOU~_jKxNm^1DN zJo7QjJhasnv@$+ARdH&9e2s=S-}U45Z79wf*uB)x3zbS!q(2@oRC=0=m+^TzL#8if zRMDF!I}q|FZ)iWQZ$HJ99_Ff~oH__R^UAzw-PvIU1z2(!ROfK^==nz-}8SbH|05O$p8D2>T#JNTeNejm{f5WF~?yp zB+t)JdbiiWHo^CMqjP~)PU_TbJt`%Ow^1XT9IckL4JH}e#3u8BdQEfH$9tKI08ye` zCl6JtRYhW*D?yp-7mMzk-ZkMD>_nfFlTR{BYLm^Tj5e%UDtyJGvUa-dix!-TUQyeT zbnbs<{uDB5K|GB%t;<8WWUet?*KtmE7t!md{4^R&a|a1G zF<$4LV#wZ@?8`cg4)enUj^A}5R-P|0J-~vN!M+X_kok)iUTGlsO)pySU2PgF3 z;~s|XzS~WAr=4U0Rgs<9<(^-a9;CRMy(-?N>(lUAYL>ON%AH=@`Q!#rM;L?c2j{)? zg)t@m;AwOUr&Ea&l~>7-#oke zyE0k882<{Yliv4^bUPUwsb@Pvf?_>8-FTh<+L1pV`~{7;rdK>Ib8RHVN5v4DDF8** zee>;T+jqfKsjMSAJ{I2+wi7MsjuAf#83q{;vnn||bJI*q#{EiV&8pCd8t$BF&BK)8 zABT`o&ur)%f7-ob8^^G zrv%URD5M{-_(?YKtNg52*F}C4_HyQrAZIj#DpsP(`(`EWR9E(qm68wEndsGrYSy9g zsxaiw*vLBAM4zQ$yl1>Cx2+>i`#QH-m?Qd0q2rOCP!*Qh7HA1Gl=zvcxmQd|DbF4u33Mj={z(o!Y8ucByi-@^eI2{Bo0OgN=A z+=-C%%c`M<_%jD@y$8l*uf15xFq3!77f4k2>q*Wb~GZd$8$Ts<0e zq^1AWP}|9LJx?%8{30Thw3Tw%GM!ff(v)vx=s1@~f@MLFv zDCu=$`_*D_3z7{!2#gtbr%kc`-^09xoQ967ZHIgqmrp6O+1lSsu`oNAKKfYHuuUx! zKJ)b2K0uuGeV{42r;$gutFYCNqh33sUr*G?~Q)qrbkA0Bbu2fl>A?xmT&A36Nv$@(@i zfsu;;oMEOaiamC`d1ZNim6?CWR9`vhwrIDXB9}jS$0OryTFpk?OwQwZw&|J48c$E* zw&Kk{$n}L-j`>s}ZD3gT}EZc|Y z2u2qFF{1MOq6u|jV)lq|2;MRRI~^t6V)--+3KIb`E*T}~9p zqE-}`dU(ZTl5u<(a(AmXBTfNvfraJFF!9MJWA5Gy@QwD?`&&4y>nbiTQZ6o1-g*=e z1aFS_)vD(HeV=cAv&P^1yDiERmX>Yy_hbJ3zwh(>MMxNyvn@MKO9q3SPd^=V?|ucx zRpc47Y+ebxmyg@=EKW~CdfkMb$1PfOF1DjtS`B#gl{t#M;OWO5E>0(OuOqH6Lh?d% z=CT3H&&e{gxlYMS*J99(=w41(T(5KEPK$7o(zzI$20aM}Q7At9O_#|yWPn=JVKOvo1daJ+YW5iv zh2-=GHJf2K5wb8ZXT%*~2CSmJT%msz&I&gL=8>OeX@%!ItZg!uq;LqhT4G6kJEm@O0Z&jK?|8U&K6o5X{sHuB&EH zMHmWna(E!7mYwZ@@BBfXyLSU7lY(FVa>!49GUVlph$t+1^(y4<-3m1$L6gl|;E^O2 zH<{;IoE=Z-cN4ZAG{nAbNl1K}3=KU7C&-)Yw%r95v*geI@ev4e{UQQVHVjS0^ z*79h~1x&``B2!Auw%gojbLUnnT%C+5i-KyyA8-fehTh1)WYAQvWR@4wFH~up{P)sf20z zUO?ejZTzak{?jhwVali<;rfoiBH5c5%V9re)Qk9}=HdsU|1EMMhE!S7y9()Dhm86$ z&px`uHdwjq3MQK*8K3{A!{Tzl%O^ctUsJ1DR4Ni|lO`z_ry;HjfBsi%c%C9la#2a- zf}6&X=whEeoe)$so0~pylA{fr633GDFde=xUPNr)_plv#&{TYd@4b<31-|0NOMzOp z?s=SFWaL@N%Cf`S4VNS>xxCJ}I7|57|MeC3wgR*zt~TEn446_#zBnx8v~@V4*Ui}4 zX;Ksr8;Hp@#BGT{D)WmzqhX2{*mSQVF3!f(8{X_^{@=h+EY8tJGn(h6Vbv9z_nW+a+6SbGp)^~C?a0qQ+3l0%C2N~ay5|z* zcz!rE`qwwZQ5o5eWowE|F}G6X`ea0rzaiwbrAVTZ$sl1eO0aFHHC-%Q;rSMR)uKrA zSunabSqw@kstt!hM{wStX3fsy+EPa9CK_LWQ7@ylB=2QbMDSazf3@K-8fJ_KDXj%b z=t^V3bF)Nn;G%$wgCUbq%F)XnULeGs?O1q$Y^=@sfa{YHWm!;dRPcNo&$I9<7PW@Q z-A5^whHw9a4QdTnLWq)_EX~Q&oQo5ww_jeXP^mdYVaoY&Oq%8-v1AaxdOo1vOSrXB zp;EPIwZt6Zx)OlyxQdTH9J8_EasPfm7>YY?3U9_qL6*v3`SjBXYikb6OAb+#ndLF#>8>Sd+%21bW%K5qqSUHWhRqpZN()^O1|~Y2GzRFs}~dc{esmS9!twU zEn{v;^OB?e3H?FF{Ra)frOh_1wcxeWugCQ)_FoN%!h+4MCbzd+T%U(rorbJ#HVm05 zldslr>0gEPI}vM}4M}-Rg~XhyMDnbl+7O3h=X}id$(TEj=V>oih(f8XS4tkFmZfGq zhqe@9SP+df7FJzQD;yjL+*m%xcIAQhWg5O;n!#&Xh>WMc&Y%AMO~NSU^0MUq{eVwC z8Kab@-F5+CjgzRDR$igBA`Ek?RZ)Y7~*sN|exH=tkbvkBlxk?)6GgE;KY-7PJp}kz8cR69) zkBKH8ahMT~61>1>ZaEMEekZ2V5UcK>lbAMMgS#q`d}%G)U9IWRyGqcOqEfX?K=@QW zA%Dj8WqTWR(izMFaS?huVrE+W}{rnU06W8nrie#K_>PLq>Yeb#QbXfIcc zLPL(Fe#Ifr3N(tvwK~nYK>Fm&#*4wSr(`8Swd!CuT|8ei8pODs;=OMzbMtnc`;S{B zQHG@p6yR8JdNk(c=Y8J$#vHA-!+4aj|2ig$a%>ywHO+tcw;l4lVEvX<-dC$ys+3G? zM;sLth34Z=CM+!2tgblbVJ#bRl9YsDiSH@)4^z(0Qa<=bO~R5~MG#E$45UcZb`+m} zGNwIe^X~gKYITSEJ5??&G7k1*e)Wq!a|RFFk!((N=&hh?`SD#(8c%vrH!PJD}Uxln~HVj;EHe!T0n_dukR#0tv zTpSHZlN_%iik+zz8s10~B^yK$Pcp($N@LFB`Xr~mU{jQf9Gn!~x^XE`&zETUe(?uy z36?EGw^h5rU;No7wo_oGns6e7%)`f3KKpb+S-|Se0LM{`Msn=cT4ZC-KOfSb_j&)D z3!EK?9PW;oUk*fIZ!UHrb_#6UHq}0gjeAXYpZC~*-X*9xfMWB08{4(S%4%yWH5W>l zU#W3J6LB*qW8m0fP+IdedPzNO3)ZMRJqVFzZUoA*c%EFzjX6j+&8PnXxucJ^dvR zj#6CTrncf?J6aOd6gZxP?Kp(Pl+hr<4Qy%+PkQIH9Qgqp-=aD1bGFwfsLZ1@STHMW zbbV=6P^C0B=XohnkWag8KW=mQYJj3733HLBsS?jqTwTPRpN8DJQ{(=FI$PUSk|@X0 zlI4)4Ij2Vx2K|g?%jOq9AD~o8wW3*Ev}rUfJl6)Lc=kNvTi>j6>!wQ>7Scp)bkoyo zYZ8_m9>l!$*q33XA@DT=ZOFi~q*hTpe;$&iC7YW*Pe1Rnxact%=LCV~(c>!jwyO*V z1^?oII^_I3VrA9GHqN~~HR_OD z7a<4c`dq);HW5LJciS_X#}nVaoscAxcFy;-F>=V56jHd-xiIop5XK}b2XQjDZPHiqlW=eC}otk zGgV+nQ-)=MZOL`=-9K93@_w|u(iVsqE# zKJY6x(IjOuNNFwlrrkn*wwNvyj$5MqMfQ#s$ur)#FTdcgFZAG@V!FCm;jjMT297&T z*)P#bwvWjqm$WWR@$hk#{k@Pl76RksIO3yU^;lU8SX`3G!)i?ksoPs}K_BhO@SRqY zPd7!a6^>(Z@Uq9%*_hkgZGx)J^~J;p;nfVrn3^cGA;;!d#AI=GJR}M8S;SxGVnX*a zq}udY-l$V;xYXM|@i=8NO0i95go0UFCG9zz`}cjm z{*4BI_UCh~tx4+J{VkuTPeXq4lMz4o;gBbvgJg$EPqjADR3S6-KqrNSDYQkoSjA7zEffIPKB?&-(+RYXZOXJ zSI-701TP*9Qg)vWP#QMw)=ASG%aTB&5;J(sMPfUe&iMqtVzY6-&Gp%slifa+qi2vw zQAp*JvcR@9{mY45qb94t_JouTY7VuQ$JOzOaX*;_-H&<+%|(BfVwY!cEaP&TQaDbD z3YK`iJ2z9$e9?#R7k2Pk7L3LP^NlsW@!krT7txzoKV*}uRJ7S9O3F-*iVq%EIX{j0 z>5n@c9fUl5T$2qrm4WU1ns6cw3b(iFWLd${{uoP(s6UBwyucz3Q$GLb64$eM_|-*L zZq>Q>aE{(pNWT+HUzZv9wqsFbQ{AKBV{8f2Y_+4O=Ss4E<&U2O0Gj}DtAgV_)Y8Yln7B82Hlj-xeVH}EUDCO+KV2G zYXN@MVev*lStz2htj>jLuhnKV*9xjlm!Rs%sy(zxzxZ;Eh>MnlOrE@+pIJOKQ z+ZKCmo|UZMX))|Y47w4HBb%z|spV)r=tlIfBknzDi$!~CNj5rX&(rMhj%c(T+HJ8q z2Z1HwM&=H8T^YIy3l2Bd1?#T_8l~je97P31UT}066HYSz_>UXhx$W|I{ zrc0U@eD+z$kA5=ZHy?-i{?tiVQmblQTcHg;ToxsrPR8C|%%cYZw#`f_A~BKLWPd2m zP9r+kDUTl4@O}9lvrI_0_daN2X~nO9(c$=T!rrS9wxhUpyEd~=YxCzlSBp`jl+Lz( zH==VnVRL(qm76sle02%OlPu&o&Tu?S`tb~Y+r6BSWd)0Cb;_bNc(pal{RpZqb8A&5 zgM_pF0por`YcasGKn8k=qF8Qi6mEC_j;66JFo9xY1Z+!uWF{X!1jDUsH$uJV_E zy3RXqd-Qub`}+x=C)=J@;Mfq33&Zfs)>)}2+HE;j-noq8)9wyIAZry9q?}Q9G5sqV-EMEyvS6ZXWskRk4 zs)ZSyvoR|hP3D$sqGT`^vE}NSZMeM!i(x{j{fa18I zdzH|+Na$UQ?8tUB+Ey&zs?ePG2&%Rm56$1tvK6(K;LOuOuauGoUq{c5m5n*sSbLX| z8LYBpTDJWBJS|vQtzv0K_hKxrzf^GJDfxtg;PjXTD-_!Qy8>AM=ABjriGr8gp`*&P*sLrzr;qF%KX3 zI1V!yqAVn?QI!HWOePt-FGF@71gKJM#Gb3rsx(6}=k8XOx8H5?`uTwIFs0FQ-?$4g z#9N%tG|Y~p>0d{5FGDuBT9id05CbKPt5ufQ>s%g<=wDAThXwiU^OD6IH3JuzCJNUw zkeQ~;3xbMEt?dzxQoM>iYvE8@$kRNRh)Jy#rMZs6aY34tw3ZyoV2Sk(OOokT5d!oSeox^jt(OR{fw`F(B$MOtbceAtb^}}nSp!^c~|5m3u`ro-H33QpeV_bV#bIUMM<^pvb~2e109-mFn?Ipmo!d6bYCLrlLLb9px5&b_*b`jxQt(}+vYS6pAl4Erf}?*=4^ zWb*p%o8hbtv-#O)WA5H@m~UIyR!QK=23r<|**p%up+_rMQM`D1O_mW zIAvLKc^>jJkOp%U5%E< zjXN!Rmm&MlyCjjEdX{d~O`IiYB_VEjpXFST;-;41) zsk#X#Ie9Ky&)I3rFyJSjjagZ?Sy~ijh!`Xkl=5)%UD(@8DDr|k z8#d8ID(v$tXTEK*eb?m=zg^**UlUkiW!d4`^N`n;oPwmdYf^0#nnxduH?vHx1O(Va&PHttk-?}K?1@Z_T|gI9;q1jQ?5=z zdRH-dp=d7$%&!C{U$~$^D!ogS)1WLpBfuIa6)hZ#g;y)nL}2oCivp^32g{ab3EL3` z!_28l`lA07TF{k(y8wyz4Y~cD9 z`_Fq=w&La;2?X~88_&}?wgk?Mh6$hlrpw)(I&%x2NYGqK<|>PlG|d^0Ql32-a_@dc z++Ia7`_7V7aNSBEQZLt2+_>S87}&|NMHx^QC4mPA2MPUt#-nXl^un&d6RH#lD@kO- zJ~&93Yihptohl!^FKKDN{%FDve>mjjOR*D=#yOvTI^o8e$Ks+*oXDoG5xiMoBGCiy zz8ZsqJ6l!qET>{xChl(6xpTk9!RsM=F9w8@l-*~2uFga5+;5rejncUF1Zt2$Y*Y-6 z#pUskEGb#J+2nM$PZFmR*9kLNO`=Iw^ZT!VodL1!opfrw%VzD4P}fQP-(ctlZ?*U z1TU~?&U-ZGJY3(JG5ks?>TM6l(M$#@^*J#qOr3DkTmw)v<~;gWF@8|u2G&e+rBLR* z$kx)omWE?61`MSnKt&6I;(0dhr7DLnI+9^wE0f!hQ52#D)>?6OHYOgY#+ad~)@)qg zCW$lBC=-d&DB<;!4(Ep>`F^W5S(-B$rIcmKuYYz)ySVXtzi-P8sCNXoI?^9 zJo#k6-~9&*wAv17l!>e_$6&~!LO48#D6)b_4}9V%$1NgLmHv$nuh_PQk@x#)lt{`S8~h{?7NC ztlw}LPf9GSB$Em>lDHsE3w%%U@y8=jn!EREWNAS($*9z1Fs5-%z3%Y#`*WNfM||}2 zOY#ElKWs4?Wn@ODD=j5Ll1-(Bj;lF698ne}tGAmh->lP^4>)|;Wq!GaXJlff>2-@H z34?CL{94V#nu>*9TN=`W_Hu>p`GnKGAxV^zXEu3SGPfL%#5uXqo@Z$;I`pg{iwlaP z;QGwt@}$oDUmt#<)DFM%gI8;a;({_-;D7w@R`~TNA-C2n)>a)ZuX4s=!R19xk|LR> z=4{*TXZ+$FfB)aEaDO`>PUU#3l-xMsB%>?}YzuZCRr&nMn6>o^?Kua4^OKO% zlbE~r8w3>zJ8v`{?%r?k8`HoqoLxY9_-EL#XLr4-es zN1n%wy9tdsk327>uHMqpEMSPU=AzHAo6z4fnpF~Klma{2KOuDN}u!sEAU^g0Rc zmPNHHq*xHhgX8t9n0t3z9y}2Dnwo`um$D7}A`^T1H0JGxE}kn|Y|l~H8Y~4AC9bFV z>}f=;s<^XZadeze2?VByLfH)G=QNwQ0$#n2sZ}*6CkatBU~$Q1amh8X#+wJi>z5Ns z;NHCoQJmxYqDl7y$JotHw4>dUP_3)>shRBG&tKEP-*#ifkjYr$dZD=RmkF6ovGhEPeqk7l@OL?Nqa>Cl3ssu z#l@k`{Az`8oX!&HrVjyaD=|gak}UuLAOJ~3K~&x}T}{31G3q9gFJK1l6mpm*m(^PyyOR#~Kyz_4Vlp(Ft1ZlTV?JQ}-BteM|M`k) z!()A`ZSo9klqzw3n`oGD@9~1XkETbXx!qN13^JvVVBLPnlV>4YcWvrbMVge@o(#Mw6yr<9SM2U5gp-oDABYw_aKZOL zQOFo63tX*v`ZQ#9#pZ*rSNPhy0pqab^Rf7<5yGG%{1Ch$R-;MSlb z=7F*-OoCE@V=HzZ)_D44NSYLU{hRF>W~eCfXLj3yGB4P;+n~rwPWFcc729Bu7Tt>p zuRrgwyk6zT?I!hx2W82P%?86>B>4@l2ve+Yb+f_Q!GJhSWi!hQ@}w|Zq=awhra+StqH)UJ^FEvR>Nu{#u_aJF4l^dB z6v~qBb&PGnx4zRR2oyWpRlfVZCg1r^lW%-b=e_r8R0GA2emtO2*L?Wlh=22M`uyzY zW1c(>IX;o}wQy4Ks}CnUzVEWolAswyi7pG0IA=62aIBK6%arTujITVhN#X)s3ML%5 z3SEjK!uLuJj}peCg2y{98Zl7ZT6g&Fcj~zg&6f7<2hY(fxNln60-`9}Ba7$>Eg z!Db*sci2m)w|%s>$dZ!!T);5jaeSGaf(m7>`BF?)$Q_R4ZC;6iO)N-?lC} zI+!p&?~Tr~a?s95|R|-q(*=EvQ2na_RNmNWFuGqH5cJ(YX0Sc^8+aV>01QLDSO=6#NL z2RNQK3Xu}a(IUfhgb1^=Y`eS9`^+zSv|7$Am)6oHS_vjP8K>;;j=8rbiDZriahx$3 zXB0(Fr2_4ig{4dW;!m4={rw7m@U1Fee=lHpK{FZVym}S$?|(Sr|Ng<4JcpChjLWNx zz%8k`CB7p8`$b-Ib)B;c6jwVW;Dw1>=Mr|IX+G} zzesufz+oDenr8)%c0AGf?#H+;GpSIL3dZaEidQd2SX#EFM~~|qA5G}@j42}*sgL9} zh__yA$kUv=J1ycc;}<_X#&I-vwp+NaqRb7EH4Wj0-x|IVlfG3PvgVUv1R(+ETQZ0-`Vze7l5b zlF_@0xi}g#xQ1=6G*FyP8M3kAQ>iFiN0csF33;Vei7w&ek4DV3G|28(Ry^p~=x@ zPMYS@gzU)m*y(1x{lKLxWYGC8I9j%6O^K~a`u&tApN)C26Yz(B*kFHe!mobOC!Azd z0!5MM4Emz~?OexPoQCW?s2f5`AOpt{^GaD1xQ^oPP7~Kv{PIU9M3a=w?G{CvV`)*X zU~(E<&oZC8CY+@7u0mEe8r*%ngyUFTosDojdzPCF%%H4MFCmRH=2xqLni(nD%N63V zARK0<<4-o_aX+E8;A6W&&N-e0;X96nWkYMZ$@O5Ba3VP@zpFB{->Jb{mZH_oGI;iB zo%1urfB4CSpZ+4|*PkRjeVMR#kaBgI(e35-UwPG3~OsH|iSG;^N!Si5k)n?F7X*LvPRzNNxI$4_Y*=G^8pyW^g zDB$)@i|>BJ<&VDU^6n!GOBcM{P5Jmq!qeBO{BFC%b4mhNPDW)R1ev8v4v$kVu5#Yl zvE?K{K^jSFnO1T_bM2DJIOEleh|Nuhl@*7%w#B>eR#{$h`25L8iaITbRm@%pGI`g#$29jKK`gNlbQW4zJ903HOqqWq+}_W=YRNbTAW>HtSxD}{emdYnM@#z zMCz31iZm}tQ+Rcd@h|_?m|JT$-~WSv&pwaw0!^i&O#`rvvH(@`wXX(z`ZQ+HPr147 zaIhCKo)pZ_xvbyvN#l%4pgFvZ@m#q7pvLp3BUZ|irL`(bLpaW8wmp1bb9NGPaya4k z{U+zf69&DAiz7>_e4>H^>CKwnY+5VIT>ia!tHIL`FX&uMq;92v8+Ti1OV5fMEk_g7 z56T?FM<4 zV-OdLOdLv z91giS8gl!=ypa{|q7*mBN@Zjh$B1>}~J@knt8POysSk(sW%&Gd4tJ~{ly!UOF z!^4!oEt!lm%B-YSS1diU34HjU|JRJ|+X7|$Uq6Uw*A=VF7Rw8oz|*)6^anZ5UZlMD zwrhTekdLVu%Bn1IEX`z;@%%-~<3|C#L4j=pWkH@QHa1*VR{kIA-mJ;4EIrSA*4pEl zPtNmz9FUlYs;;i8W|7@ZicM0YEL#*QhZzo87Yh2qy7fPBgd_YH9KNtFd}A|ANhU>+ z7THv*=dKAu0!R#roaf<;`|Q2fTE6%;vgBXT)h7ZGKp+7mGS~U`x4!RvpEu;`dY>;p zZ}Ij`kLFOo+Kpib1BWTt85Ek^I1-(%LXxldw!2)MCEU0>#PZE1JDY8W$IFb2mB|c+ zHC`1wj6SD_J*KbK3+;MFZMcNB0(DZV%gJ7cAn>RS#aAkt$;CRRh?Td-kqxBdPm`QH z75Ui4^AkF)0kvi%>|{@Km0nSh%#;#Mdl-9+OvZ$zC3X&vm>%7`O0WJ^di_cjUbLlm zS>d~%G`YE=c)g`LI>~wOZV^f2z*;5vLF34Bd6RGNc|6(BY`if%-$+?o4LCf8G*={p zcT_A*T$YF!r4@hngAO};DN~aXfBfH$qkXX#`+=rjlXL;OzQK)~HJ(0c6GlEmL$ZO7 zW6i4CJ| zfa1{MjC7sdj$wCiz=N9sgG3Awapa+#EY)ld1LIiVFqA{b!nEf84aL%|$KH`+cR%OZ zOULN2=Cdav?*0Am`jlcvFO?;hr-U(43Ly#{XO}t8Ugq3dji{F4;?hzsfv+vrDzX$n z@$ttszW@D8)}OZdt=}0X41{^>awP64moD1(q zo?noqR$%DXQEPn`buEEh( zhoqm8r;=oWbys9E&)2li1}IN4v(%t58dI)^S1vZ?z4IX!T73s+hdml&WonI(i?bOH zk6X;mw8(P*iq-L}@cNZ0yxMb|AI1EapA2(t)^U1jnH~WQ{OA`0?%$B>x^?>M`cVqN zI>q5h&hP(bL>y_pSkGBq_Ni7qx(OJk$qaOQ&`aR5ZAnr`qptY$^Nip9od(si;-Y1W zxtBPguDUX(P=UvdTQ%Oi?vm%0)?r4H7_!`55wnz5grTr(udOzC_3VmqLP>j-XSYd zj-->3bTbBt;b^PHVqm4qyad{6^yF?SxFs&aAM zV|cPE1wWFH(@F_aP-(_yYwW$gpfOUG+`CLn~F7t@%_U85LL~zi*92Sw|Sam(Oy>h85QrHK%75 zlNtgAtMi)G1&=`rn>&WT{JR0)dOu`mKWDh97#s1(jr?2fPENHfK=>!?8Mkjml*^D0 z450_5ND*jDh7$Ed2`SIT!Gc_G^#TV z7b%p3b1bZgwen!6LtN6u6;QO7-PVAEtu~Ej#Qkqg(;SUy4wvY*GkUE-0r-BmMTQ{s zuY~GRDWEnKb9U4f4Q>H+@3jUTZ;SE5I+$H;(i|&ejCkh(aI&0xr}NcXQy-3rN$zKtCI4eaD=`SD37ryYl$Mq$?<^W!<6YspRqBYfAIUmjE(zjJnwLJJfKw4fS4{y zCC%>JE?H_>UaJ9yG|5CEQUKDimgO5w#;3|W{@D>nyB+3Nn^$QUUa`aQJS{N#Ldg)7 zyn-(0^S%G(CS%i8Cg&SW&Npa`#8he#VIW))?RzBsoYR9Yjgb-*z^CSTg^S~)SoDfz z-Sc%}mG4t+#8es)uK0N8pgz{%axhP~BcI!^%Ij<2@hSzmfm@S9{FCp*m^{Cd&^Ta_ zz|1IM;j^b1_t%QFUjtvfu*{5UCP&444~lZ6xVNTxypeJJnxj$o805tg4UGnV`tyXT z$&hLpZmdQ;eLmprTUc0#=?^SnsBy@3vl?qb-6_qx#?m=QsqD$j7KeK$gYv}6>G_Iu zU|3kLv-$Fplfy1UBe5(IPWrSiQWn>SWtN*7nU^`o%(W&vuP*=r*kq}d%q`^bd!7{9 zcaE@)&kl=-Z4tLu>JgQCh#zQL=L4$Eh;l9D{IJi+R7J*QMX~fl4;={0qA@Bn*nT^s zIuu>G-$3TaD2OWo3dQkmhtcV(JYe1#EDEX6(0E9tk@M!s2}w7-ie>M$#Z{IK#3|Um z7_j;LoIJIJk;uxTNR#xWQ$IWIlMM_no}6)Z+^16UsMbXB(P^dRso^I-Jmda*b)G(H z5eAZ@R;g&}RYj6pPERvlz3lV5->cE6LfSXQmfT`9!{wzUQ>?#8xxT1r)}(Xvu;fNG zy0LGGJ$Sok>2)m+*F2KGA@m*PSR9a8F$rh|zj$Jp9@R{aIO-+G>NSs6*Rg%z*xt`M zIkWui%bb4V_~ZYo%=nlh=^1=a&ZRB5z$UlEk;mat#@mut%EYOw86mLAfd;vYDl!s~k2^_<_%$pV2x?7@MvYX%%9LuhxWfaemxqc)TJ& zBZ^M99#O7`|Gz9ZkZyZ&X`1#yN@TXs`d33{_O&j&0-LftdsOGnZ4S6nvp3`&9K_Ojy9e^z|c+!4p{^hL_V zh-PtC)9)LU*4()n@pyf})?1jJm)t1dm+P{pe4;?n=^0*b^q858iDHkP%??AOG0ov3 zy;zHR!Wfw|iVMv!zf|YwpwIf}$DkD7{LNV=<|HF4&n3oNpy3YR6G+V7n@a#H^$3#+ zfm~~aD>?*|TNH}Ulp#Iv6#WT_$T=LCV=P)wGR4y4;ZKkjk3-Qwxb4=9x- zWjF{$pR6_18WF=|CD!f@Gq+S1ZECEG?Vh9CPN_8lzVp2)n!^F14?!T;ao=}rZ+1C8 zN~kw{Y;H)6WB*blTrsy2`LjO0cGN10Y8jd}xV$j5+LqUE1}sczCPyV9 zR~4P3$t?Z8r4(t7PA!MWmT%nFq^T8Lq%YQGa#4GfV#OCPEU^!Z(+*ENd~NArB@Yf6B~9hQHt1!XAN3iXsup>I zR^*ID!ITadIu`=mIoWM9G+w4u3CU9{cuZt5nrD_Y5lLvPH^SlOIrkr2VBFXLBLB55 zyv~949VZ7dBXJ4OGwd9|$vIcuE>5IJfhSnUdPVX1bIYIpzcTOpN8j~$wFPmkWhvn~ zd{6$&NL}%*dzwcZIh7I&H#|OH9}s$)m1{oz)Zr@?IN0v+;9HZ- zU#oL=HW2P@VHWWGuVR8c4bzJa_TRP&(7AlA!dM7Vm!}CA$AzilT9eDuK7(FPxh6}$ zcaU^H@UBuIMyINr9dv1*C)AoTt`PYvCEj^*S*ndp%f~6DNK;#&C}#N~iWH6(~U`B4}n%9Vg94!Cx6go&A|*r)^fzm=;2QNfLkVh?96^=43z-85k! z%+@&8G=~G~bsuL8$~npnk4`Hk4B^(D8rK#hKKbviT**|jJyHyhBnl)EUk-!%NhbzV@tJg~`E|vIq|K^BNNfY=KjAe`eP*Y8?%tFF=KCHx&}h$rb{HJ*KZyDC%Y@yXKEuP(g&rOx93Q59^P6?N(4*UP zbh{bOT5jH{^6YVk2?t}7l3pyy2_otbLdC0Rm*lzQ!N=pA9rxMaZqpbpF&J2!md-Tr zwrPd+{3&cl%c zo?Xn1m7^4Uc*VRE=j7&-TGk(3@~uyrY`yNH5Dn}g$;G`E!ok6Si}Q@t<&a{>HL458r;TP|y^%W#uGH zwVya5U$L>RIJ z`=kTI;@YqTp@!1In&P&WWrpTxiG!^c>%Z9NWVb_Oq$Ize8BFf3_$Bhbml0MNdxWKc zbdcjmVttP*A%2l<=!de0P)-^H(E#^&|F^DjycyE#KA~I@z5my>_o9iKh5+*yKZ39=kQWr-_=DBqJOc(3R9r+-h;OB9>?mXGd=rZu;aq|hrs zIo-aaKX5EfD^5<~U;ovB}iJ})KscI`@3?rjbg>C=WW7Jvv#*h($AS$Y+y3W z(O#R0nHv4RbSA=1uvfD-V?@(DzuM%*XNT;+xny{<%=ChoDzfY=7!SbMOpVR;Q`+YV zjnR_mDk)NqeT69w=-9M$DD8^@P`Cs`eWeS|206XUOuY2x2^S}Q>ccVRMnt6+5*K5G zK|kksw?ns;kR=u3Qh>?LSMlu*N|k`=#X4Ir&S(rr;_bI0lZ#?eYLqJ;vkMh=HruS- zYG93gkHbKTT{cu`C5xxPhv!e*EM6;7tti3(Q$ei0Kp^3sc6dtIxOrxH^|H@5AI3a; z0xmc7+A?=nPMnRGmpLaVDGzUXe0WDQF$}#vT($+>*zGxX4lHkW9G#Bk^$rZxpkB6D zXD}Op$>Gh8D9A3g}MSO&(Sm4|lnKo2}w94e=XOYrJd4~yo552~D=S-$Z>gU63MynNAS z`FiaN&R?ziv@Zti?{rvMYoY^1r)>%hs#i!JHP_afY`r6#BQ9s1o& z(wh5OVT!P1xg|>trw3im4th+?*BBZv;|D@E6Atsc7$|)u9Xr|YaN`>j1fj>lR*SLO znlOOvSMys}5dN~%aCXpTc%niSE2dUvIeOX0^WI#=4t*V8U(3Raa-{7Nzw@1lQfTP) z9LvRxjuB((v--fYS@hU;Jf@rKN~}{@;z$ z?#b*=D^2Ko_ywG$j3^4$ZdTcN-k~uZQ7U|?Etzelvbc)omz!)nIp=7% z!{}7?DwoRS<|-jJjy#ei=Xkrr@OYWdWx~U6&oSs{MdF4k3YafWFbCtab&hvilxyNt z8uYUwNmz?A1L-)%W@?-rbZMRRnVfHsCDKhK{T!QF;!42iRE5S!OceXfUmupp_98Cc z7JA`QC1CFQaBA?7zKaaaG{llByu125T%6(-jn5Ucb2D z`b}|61)fAO1-?LyqDb-LX^VQzV|FgYWQJ0#D3^o)<|&85@a$=i+t))H6@lc(fy2XL z5Up;%XV`d^@!*E$&6XrG_xmz-8LB$Q>yC2d`12n)mS!C{790mh@OVQQ4a0S~K4)YSzBm1V?W;HX57+Y9jYCEQwaR3k^4LZt*hexhhpU~bgWOQk@~jVQD; zeDO^2V6DiWO2Huq>g|bTa~nQ+Uwq&n-&K6MkrVhZ-t@?<_|4HCR%vo8`qs@|%i??> zKi}*zI~&ta3wcxlWa)P^M#n<(Ol-reYZacaclhalIwngk^UF1wBP9ld96$7_R0GaW z20}Gksk8N}#qn;N+2tm_FUh)EiS6_BsL#<}o6)H%6SFneKRx7N^HP$DeL2Wl7fU%P zc(!|f54s#~wM1@I3YeIy5trrv?2Mz@jPXOw;Z{p5 zp@q}P(_#ts0!_IR5XT-zdmUyL>asjj6xm-sI7@RhCQoy=H!iq-Z$zL(N@l)+4@oy? zcD~H|7ky5TdQ8uhNP5zB+uTs8X^svO21&-koX zJf~WQQXtoTU&(BD{YA>nB~2xgLLB;qrq@al%$4P*FC2k(EKI<{xaIn^jK0oWj-3GnY2?~#3-D0V_wbyf+jTsBskpzQhyw~~niyv=2CTyO9T?4LkE8+l z;GSl*srdP43D*`wW@iGFg*-R-S`!D37ccuH1I5i7W%A6>@8vX_0m@3KU0a}q|7B3WRX&h-hMIo6KW6aThhxb33;@(G-G)GH}PF92wtRz9$ zSeb1*6x~+J9U)gh6Ejl^s{KPQRtqCQln(hM<~{GIjTh&(r( z?zfp*6jY`5H72v1A9fj?suIS2p|p|MqT#WS{^bo$kAKd{nEhJnd%sreKc!(XP<${~ z=J!7a4@0A5sD_40Xz`q5sA9RdWO%tH@hy$AVfRRU?yEC7y}oReot4e=^pIs{#Pazw z3&x(x7!Sl#WFewHAlN`+7}56t3!;>RPlVpYstaFxGM{082gOP zirFD4AUHxh^HC_;=Ly>zXSB}~MyDkneDTI8lM4;XwMY<>#nLSZJ;rBhl&c}9`(6A% z6|7%TL&UML8OqgwvB?TMuP+NQyXbBGP>dobHB8P{2tvj2UWd4>$p;3L%B<4!MA(1p zZj+p(7Wbn?dZ01_IG;RyI(8DF>>8b2Zll4P>vnjn|(shvNSKr38Ci*{lbJ| zErGUt`sIMdDQH$in_GypTMgfOP(7_fk8P#np=*~Eze#%ZZBA>p;%{Cp$`r``FFLmco@EXo-^8X zTwfIP#L^tRcgN@OFyqCGgg^`RZF)lU>Sdp_Z@6|%(llpbK4NAz zVtcd8cj>g{1}+#8{HIpFj_(wXx#m$_{b z1wZIzoa}d*oUauKPw+j>+-j57Szi<=frr)_Pb*IL+SHm+k%S^Dop)ok;js#y@6l^# z#FY?GT%PtBpRH4>g=kN7#BnL0TnPz6kA<6)c(qm1tYAfd&0b%dj@LQa8bA8HN;Dnv zr+;fHM~-SNo7!^Zhy&3_mP1P^RQ#L&qg`%*{DUvCrXNpTpfgH*VEAKJ3$IhE(ez{ehqYYAb}Ya5k-_)G`s*nTwoo|KmBhO% z#~160(Wd6wl;VflQi(N#o}m&dKD_Vo#k%3gKTml1Ca2qXjE@D}T8qh3i)8s4Y-T8x z04EQ#a^!J*)aU3R;pXic2fIB2UqVCsiN*Ik27NJBXeFHKgFQ*{xVF|HOJ(%1u-ah# zvlHTSKveP>3`~)jl5@P*VP>(0_O%37df*I%p~vKWorAZROfEKvNQ|*SGfOvn>_n^ zb-iDU!t06=!}*2Jhl@VGHjGpqLp9MGwtH}%IC_c9b(4YSvIB3AH2><~`#fAReE)Mz zk}66e1c4*)B$zS|9hH(|V#ttX9{48^98Uu<@eJ`MKft{RV^7 zv9eZWXQ#`Ab<~>?gUk|_1YxKVC4;eY=$3Cb`LloZf>+PZdH>g^iOKke6JWl6LYGcg{JrBX1l4vfR(hNA<~ z5+{`|)Q-~Ynn_dm+0MTS8pwsmJ6 z&M1uW2(-g<@a1zD8&b?oK$^f%%@GH3t0ET&)cqSit)Ak4{XY_JUbp;@|FX<^+W^8J zQPyIerBYHjD}0Hwvy8p%l$F&IS!Q|gUY##KYjJUrvba)5DJ$^thEE(zpk}w7vAou} zlA<{y^2WL4I)_^=W>+A&h95uE^aqOH{iflv1N{`@*cIY)OQr0HW6MxOETaGV zuTp;PeV=wuabwA6YEscpEum5v44D(R&)r)QUpyYL`KC|3>XD@)bbtD!hwpoQ@L^pd zw3Vgb%ej50&X=EGf>JbwBJvCbl5O#nk|4<3vhnzo(a92rdm`I<2PP3+ zx*12?E#_8-$Wj@HCepZGK@Ia5P9ot~yy0^jEJGcB?v;Lcpm>4jr;#^dzD@z+1s z%uP5JCS-AH4OpWXuRDJB#G_fUT$@mI5=YgO5Y|8mB2MASlhhd6ZN+dyF*~97>Cbws ztj1#Sv5=>Lbp)Oz3Or8EQr>Q++`V68e@~*V$|c1&zS-o>>ppKbTHLtXB+GJYHIMxr zkr=MtY?2!Ye1#u~G}AgodA1@@rTq?J$>+tRQ|4Ejn9PWVJh2QCSybkQfyEC5j=u55 z5q_wdSsJ3(P6=c0Dkm_kc=$mm$kNcm=CZI|yfum+Xr>n%A}tggoupa6+cS8I!>u+G z-<+h{D6#&d9)tb{VJvg#ufywWQFy^&IuXD3k-`|mP{q;dzz-iODZT|47vx$O`j+i8 zO}A(H_T7xrmg4!Y&%MQ**_YZFzg_u{`7Gr?sEE&#QL-~rP?PPG=&Pb^y-E$YJ&L!-lF zsa&Ow_S#I&)<_b$QU`&;X0jyni>U6g=_;G+r}R1*CU>NXq1zTavgc{07i1KXbTi7e zkb})j#%HUdPH;s*4|LIqT1KZU9BsF`Jnk_(DI<+Ml~^RtE7S^}V(wa#gY6cjN+3`c zPmqFIE4)G|KR#9F7yohh%HG>;4J5JFI?{elmKyeVgw^niAC~F1CAB#89a(DWv@=eQ z6NZKY_IDG${~yk1G&J!$U=5CuA|L(8al&(frjz+~XF(j~>H(QSHzAxsC zdTeplfOYgzOP<62v7^;>++UJT*krPVschXLH|Ue!?=|6#ehYnJQUoudKi_W{?|En&ceqv>BVJQm%%) zeSSvgVnA&u7U!E1QH|0nlIWo^>(=|;ev`HV`* zktC`>$qAtRqNUh9vOHMMsZ}KK^3}G_`)fJc^Kiez9(; zl`M;Mnv1TZ-!~kcTGGvo)M(HGi|HqdAN{n)?taRD|0h$du0(XZk`Cc%OQ|fK63!9^ zaN}l`_4N+39t;nMcpmh68Jinzre~`Rjg>e#>Qk)+EMBkkYW;%4y$<8kRq|Yb;ikxZ z(;g@*1!(2YD9=7SV&jV=w35j8srkCteG3?ORPvdat#Q29;bgzd_)P7JW)=j(cklz* zAWs+hXO|~^nqx6pCVE^?7hhwo@MF!w>JZO9J*3yoXr1;M^gKG3sW_5yLs-~MAOHNA z$(b_OR_la;Dmv_lJj+Q389(})L&6Xqd}j=2ETvd(MxL^?E>iyN|J>&v|C2FBM+!5z zlZRI1TOL2^(rFn!d{AO#K~oB3ywL7glD_3Hzs&j3XF1>dmgYbHJi{7C7&w|`%S2Ox zEDugJU%qtw;kO08G)Uj+NG(|gy~Gh}!{(mHc?%v~OUY7*1539rOE9d#8AT~_Jl+h@ z%5q~m=f#ePvW8{}KDlW)zSKP5^Le(V`OBaAl%kA(_)$tH@rq0}jmsQq=HV-Y%N-@( z@$#*s*H^rE$75?>iv9e&PdSD!A0^yai_l6lHl*pcGv2<=xqYjG_5o`!nW0kF_}ZeC zBTsXdmdZT-vdzE!(;dbpOFaBwgyX}6USHcbI@A(15Ry}6`YFr{tou4;oWitgcdi}9ISp~=?Tp050 z+Zmm%d-tfLpE>47EzW2@+wi!5EtRLdZ~5t~kf}z_a5*DM#X(;yId0Dyp1cjE_{NUZ z$aU6NicdEp?kr@K14p;3nH?4Z@K2xmJY3CjN@H;-?J&+!DJwo*7c25NZo};*kH>Eu z6GM*G1L+DluExw#lU^si!tDixmNx07OfA$n+-h^O-)4NeT2Rt_oR#I5HNxhbUTko% z-R5k+2TrV;aXG*kOPb`gj|OB(#^#GNHlLp}HCLrE98scaK`hKgz4!}l8uc;`(hCf1F?WRV+7QWr4l*z_fm%In(uwL z%*vw2M-KwJ?F>(OD5ua4YzE)`z~hg8Td_RjI6Ss=yOvhR@n+X?c;@)obA`2vwHZaT z3?ns5H4dwP~E^QZ(l))-<>@#JlQ!g6;$<@mx!V~IRN zR!AEgCCB&f=RA7r^S@ohbi0l>`!F?Pq~kLVgThyeP%9$OvA*T#4IB^FJlgFXn>#9@ zq1SShufFTuMCl;(k$$6 zwW!uZhR4g8Oyai`kY^c7H^+H$u}r`Bf-sh3mS5)UmnXDvay7`?0pGjjsF!kLFQ*#j zR6|2G5;@I{sg$W^#`A5>P@Hmn;n2=-XEq_vL~f%oqytAaG~AdP@aT1V|FNGW+>(J4UMt}4^x0iayECRi@G&$IlmMc(DJn7%k_+-;~baf z^tu`SZidSQEjcqTVS*pN7xORwWQ5D}jP0$ykgAHX%}Oj-J*@B~Y!SeD`)-Ymr!7tn zdwlTmD76Cc;%V9F8{;Is*jW}=C2e7Ut4)3AU4nt5Tn*^=GG0D8p>^74cDc^na+8ab z9v8ggFuSxhE!q%6rr zt`=yPmdk9t?$GUI#GyFQG?u`(;#@0?21*GjtlQ3bxsh;v$-~zUZAA{44lGGON12>Y zAEgXcEVJWImXy{oR=2E7Ti#za{O$)CH)ajjXDom4$$&r^o^L7s?n}*I{4C(7&wO@{ zHP5y^(t+i}l|If$lsi^3)jC~A?B|5!tZ#WZW4SdwAWa>E)MAXqb9pgqHhAQ`-c!8U z*L?GO%6m&GJBRSMpKDIe9o0y-^jYQ@tLHp_?dWwK_m*THoh1SQ3bny=hJ29Is5pM} z~HsJoelVB|6+lM-xy-h&l#TxC4;aS zg$?={%2_(+32$FqFf}jw@uZV7d#y$gXwHthlu902Dal{+HG7*anxioz<0Wi?D|OaV zZA1)@l{wmJOEO8J$35C@GdWYER0^)_#P81S^n9Jb*Yr9mwMNA0p&%yZ9LtieRQ4%V zed5@oR`Zy@u|lg|$I}+)ez`60FRkO%9`w4Jr%%fKd2aX*pKFFHmRe--eKAc`LPI%# zvASXNAY}b*h3-JHJdv?=qzSYm4n@!&_!i&6MAZ?_5G7eD~3{JdAsj(cy4*`x+TxNBD7NIXLnaLk6z{6Sb|y&21b@g zfp$E3nxcH4*(pWR&AEFcmk?HhB!Isp>R~2 z5m{=l(u2jc;*qC0Q}Z=mJvpU))~D8piUe5&MOU5lb58aJrgMJW<#fNz?6n57OLeNv zut+slv@cSo7it87;`OsL7MALmBKu3Bi3)w_wdERHuP)iyY_qsrB~J~Wa+J%OsEB93 zdArKn*B$QMsp4sonE4)*VpZTlEq?L9+}KFCche`*hB$CkVtGg_n^OubFJ2qsz;b8F z@#D{(7$|ayjL)5Db3c0~HgRGFqU>-u{@TueXKdYP<;1Rk6vF9g^oN`gv#PMLz-*i&~kL{ zvwaE=7ZYCYd5qUHR;DrzE@G2m;4zCmO$KM*@aNL?t@suO> z9sShN>x%~W>{79L5YX+z-#m@E?0J0eZin;MJ9!jjR<@df=jaVI-GSoGalrrn{W@dy zobTQ1@!3nCAdtf!_~Hl(0+FXJPiCS(*z~zRYk9p3-+hqb`64evJFF6_Q#I7wz2@=d z%bc4lP^~)fe4cEi7^As&UDF*{lm?f>-J2ng)>F2Dg@qEOlB8Ei$LnFN;pvwh8qJ6g zJ|4pNefGAy42{M#ni2g(_`gA@WSOOfKVWjh@>-pZCl@^W$q`y9=9U}GUaNzW2pPXv zYQ!av`IS1ao}A%_nz$6;6-gJWz)dsKmDXp`FZYw1&dyGw& z86K-psfElfH?W0U$z%qs##0hAGrwGC>*Xa!dmR>*YXx#rw9=)LhqZ=!0 znPPP^WqCB=@Km$08!}q8OgA%TheR#2eT2lG7!soZw7ab&4SsHHOwaGbY1*0+3q z?M8xeie_1EUcH`Tq~iGay5;qu&*vKffAJHa`LUF5-OcC^Jd_8Xb>x{NP#&SmNpg=; ztT?$a>>L{&-qfrv_~fbK)6Wwg-j4}9kwLy&4u*kabF0tgh2{3`Drughl*Z<;yi#WU zX@}PvEtXd6 z+bitpyHLwKlhNN#{^~95%K?>o$kAShDE7q;Y%JEkOC^yS((7cr_~Mwj?6G=pjNR84 z#ATl-_K2fUU^}6QF>)i^-)b>6w?^me4Pm$q>X#Q&{7Wgkp656__4$oS#~*#%=O-^b zDuHErBBh^*?N-0b{cx7hv+SLDTpLXospRxh&BKL0$^S>(o9)<{rRjOkTK~A`nCF2p zkP!@ynORwtnKg80x1^FGSwb0t4OnUeKJkfRz=u9)!}10A0(=3Ifo?!*v|F;=ttwS@ z4OyL8naSi3K{Don368&ed6 ziC4hpR>J&3#O!>P&CM?DmgdG<{iNi%&oToC&6vJaN%j-k5 zt}?J+he#kQxgT*5cuX(UI6LWZZEg7NHP5kCK@V`5m3ly2YVcQo`kZz%r7;p=lx29l z#O%_jYY@&26EhWRjgZ6VSIjQf2nHY>-vbj$qLORQU0SPi@T^JeB4v0i8d#egn>g?t z-23LO2KzfLYE{X|NI;P(hdA`yn`>z~VrMJo_#k0%(eZt=Ok)Z~r3^=hIe|1>zvf6| zrHbP-q^TwL1Q%_^(TUu!5r@(ktB$reUwV$bmE9GY#*yDK?)ZmEQZK)4nYVVqkc z$qk<$hcqI^!brjVaK`$Sp_>TyUI#on4A?sH`T16bN5>KW@}Hg(1<=b~Cfj>k1U_X2*mX_y!l++Xw9J%PthQf}Xh5z;-J>s2^DN@!ggHa4nnS-n!a|1W4ZZdLi} zi#A23KuC`E+ict(!Vf(<-GV%aJa=DPmKu6Jg^+@yohCo~zYiE4FR^fah+uHTLO5oH z9M~XL;igz?9D`wKG~%7_&%VW-`o45t^Z`^q2pwYdc(=*w?GgIjg0ZPG!(*jEDFJV> zt6wvQU!V4vS*WqPG0f+`G+Z3LVr0yq_20z__;+yd3Lw`|DLg)0$+&14ZcHj39rz@D zkL!~eY0g{Et~Hk2Gkm^V;?7*c{7Avm(}-U`i+N|EPbh>-8ToGdwLm#EJbqE)Uwm-M z{7Av)M`i9UWHibK&0slTBnnBcos}#tBt~0)coR}3QMsX)!&OJ3v?Vj{Cn}vb_|R3w-&l8GovB%vm@YYqAyat562+2st6+Pp#mqvLcR!pY?dQBaXfZnJvh&vC zZ^H?NhRCBa>Okc$_S>v%j0~Dy6}~4Bk!vEpeBGnl%q73tJ4^Z-DY}VfR}?J z&WWiq(wDqAXmRa&!$Ew6B@7(^#}B|0u(ICZaJz-?S;i(~nio#9^rU0gmdb+F8#Q*H zwWz;S$LN73YYo11M(K@PWxn{lMJY0j4oi}*tLAxqrZ|0>@!@-+t75{{zW4fuk&45H zK7OXSyKDx1X&NCkS?=KG(Xi(99QIxa-dW0##(>pSBcDJj7hg3FNBM9+WMv`+3!jJ( ztu!6w7#-_Vid)k?&RRbIN)0g-D?Z;ZFqx2$A>F@q_wP1 z^m(vfVq-3)92vBAQ@1Y+z9$*2z~P&Kwdsr>-Y(cX3pi^9{K1_ZJP&O>6cVK+x%Eg3 ziMEo}Imu^Rf~|ecZy&(*YZjzNSr_6kIJBhjB$bNK$XLiPf7RyfOp_Ou55M1_(eOxf zjqp7x6&DpX#t?>ZW4+3=P1ng*uX`x%mP#*=6JDMqtgh7=9xHLM-D3UTsDtOc=rT25 zB}*M*F^n7|HSh&_t{I&y0hW`!7FnXP1G?Lrmt9(y=^zZzATB%BLh~{uEO|tcD-->C z>WE8@M?5?dVpNHPXIHG<9dpe913zsL2r$lHyt-Cr>){3Ux{IM^iKE7Np2a9jttyzA ziFo#;jU05HxrnQq+lRM>wLFjX(OF`1wWOS3Ead_QKaoG~|)lcXL|Xh<_B zLkO!d+N0zfwqHi11$=lt;TM}Fu21HaBg6BbH~i>FRsQCa4&9#fz!!y!+)Gd5jxWiLlpoeefWYcW3FL+fwf+xx8^ywZbSUosyE?#^ZOQwOLq z+LBwt?b$vL4-pemr+)xi9Jo4IoOg?Zb6pkhS9iS z^CTjcius|GUIKy8lmmsdid;DoUgT?jb696>B4MnOQ52T3QqB*S3SM^uw$DnuX;(P7 zjClGg;wSgd8LAkPL?Wa{7)VklA)qypFzmdH>13AoSNrUoMN}hAmTN}Jf_IlKzkL?c z>?LE ze&`R_93G`gK(A*R84J07vxe4!hY#8;E>{r3HFP^7nRdlURyySAXw1l1MAFV#Sg!H- z^K&Y-fH3q>#@$Z+P?Bbvmq#6Dm+F+tflGXb9t%r#P7YeE-5o;>;`vevcj(qb#;41J zC9zu$E-ck~_VAqHv4|-4@O{DANtY}wSh~?bYxQ<;P?_f1YJz>q+5bmqxs%a&ZDD<(@V+fc*4VjD(}s;srUt{ay$cLaffds z0Tc1)DCW*gkCJEj>P3~|s9?ODk!BuJx(13$pjaF4@zqh8+p{T^NTKl12p%28+?(qY zNlT$Exsl9|xa;9pdm;B%l$%7IU6jCcE{LgyCJ>fF`P`TjeDSzoebsfiNda*vsCh6x zB9VcImLBD@8Nxuaal6WY`m5Lc?zdO` zvwyL~op**YR-lw7jD5mDkoMjG@!It|``c}I2(C1UB1tij6O^!ovBVh2(t=Ja#{$3q zj~DSgIaqdR@Z7ZE2^gDj7{=4XHgn7M!Qtx;!Z48dp4&LDtT#B^Y4hf^N44hs$6r^9 zgT*M#+vVmY{afwhLS(~MRt=eNIUA%&qam^lIJV^NI z&%6BIM(Xhr5D*a4%z|qUfiC zoq}=NX_A6(75isCoxbJ%e4jLR4}KrvFpIDhyUY$8{)hvxVau- zr6f1f^%4$Z@WQuTU1V%OPgz~7B8(>RJjN$Nwx71yxZR*o1OK?^bnNF_EygEeMkiyk z!E)C3BrEF;PWIX?uMZ(`*03y9ob0ukU93~8_)dQET@PGiB%*y4@$#_E;_47u8IJc{ z5_D|3Op$AXz;U$!qR?Y?W0Cm89x8( zBP!J{T6+lb?M=Pk+QBO%WQk;Jv&8?K2)0h#b*&OOVpJR$VqcS_f_@HP9M-6YHPS*5 zO3hVQQVBJIbj!BT(-Z|PH2S1z%$G+cu8pKzbR<7oZ6Xa+Jo8p%w^lG&EhqzI&`B!Zct0%PHe?SOYyoEbcbEDv`As*&NwEKU;fG?m!n z-m2x%u3~LBUn zOa~1ZP%2BTaV-z$uliVHX;R5m10ug1qoJJ@@&mFG7Cu zfu`MqZci{$8cea$(aZ9}viTyU5-4s@_b76=ZxF&z6q0@_C~`~LS8Tp4Bhg$R>67Iy z9N}4oQSNG+0IQ3z8F_mIeQw>T8uAoXP(SSR!$kP4-JN--Rq6g1m{+v_1-;C^nO ze%|Nytr+QfgZ+gi2z}aJ!~Sl@&5bfqEXWIk(Qs`sV&7PHo^@EhUL!9IR!E+2wiz9b z7@LYnQ{@(P7PQigjz)Bv887zRtlb@@*DJVq)#v)gkehT1Ll}B*{k6uz(v1dN56o_T?6&k@>P~Rldc(n!5^!T4YZjvbYaJfgTFKG7!{Y;RgmR8}cVC}x7>?{7{ z^D*9?>+pJ1I-OO!WSFy&IX$Y`_vz;z2bVEN&6tm_wcg?tea~h5OMyWOK{xj?7GAU? ze!gAjyNg|X&vI+3PhLo3&myGjb8-Q2j~kPka-`XQ5%QhuisMV4PS^6oyE#efzm1?2 zDa0Y%T9!Q8QLL?4YE>BUoO$w0acwqWd|c2^HAu^yn-Pz;GER{aQ#MwJNIgX)(OYR9UAhe)daq@ z{NVdFt}O)ADo#QW*6FXUs{&IP{`pTL#u{J?XV3D4px3n=90L~KyJ7h8`--ckM&*Vq zw^*(CV%y`dz6_8UwqFQT;gJLe7xEr$sl+62qZ3X*3ZDR1)HZO ztTn7p^yp`TN@R$n!p9xFTDi34i>sI@D||6r%dfB4fKMkmWmOqY57=$vXTzz^hGe#_Tw$I=rt&l7ewulVQ>XSsTl zQmOhB6~~K+B0(GnRH`x6TEMeMSKPk4!OqideD4K9etY(^Z{^_iJh6r%Y3Y`oVPvx_|ND0;cA;Njw;k*L%r-E&S3y? z1X18}_C|O-I1KptqnIeP{G;y{^!nfju3%7j1FWQQO}8Ixcs${ZU;LB{PnHPRHcvaH{%^7vsJgrHUr z07EI3G%sC(OG>whs?~j}wJM+g`V~cP7#WM1U#c=Z7CT8nYswW@uXBB)!Lvt~1c6{= z%(V<#>+<`a=ZYka(kv`jd3n_3c(3h3AjVQIc_?K_`vvExDM_Mu^Rmy?c}lyPF~3k| zb}pt`^9Tb$wdS$E-J#RY86NQ+M10goWy<+xd+vZ8ANQG?_4)MEHXpqoJ4=_*r~!aH z@ZE&h?^$f_3Nj^zU;a+<{o97o8elY?j;6@n>#I>xoL|9cMe~PuQa-+waBm@@-Ek9c zt0!o71-oYf=N+HZrq3^*Rj5Xa>1s+nQUe>8AT1;hPs&t6#oBnEBy)>Ip{^Zt#D^R~x#uPaKi;PbtZ>+>)(u1WfW$P?6Jc(m_x*@b&+Zu+yr zX{K2MlOrB^F8JzU!VkY+rPb4%zEFJUUWuqI$O^{+Q~rzQwRriDpvzu9d{Xk~zNm6?(ctz}2X9d3=VQUMRQw#J1zMN+qx;9aXh)oNBHo>8 zVg{>F`87sgNDL4KmS67;^G|NQ;dM7+buweTu0VQZ+9N4Ea^uk}JlZ{vcIv!_U+qWC zj2Qmomw<3B#bG$;Z;J#`WQj|LD29UEfED&;x0}6BsG5Li3$_ zuD$r=C;{V4<(*c+!G6NVM%5wyysxiSnwz(3Jl*Ud7AlO4$M~L$A&Wshkmn05mdo>; ze!IYrBx|>aP|A`InjNIDlq){HUV#*_e51kPP75Jma>fBhRPJm_a_|CIx#rqRjoqhB zPWC%kV>sDw^ZHfa)z(Ckv5Ah&_up0vS) zjE^~gurHxf7S4J$ESR12*xpXLw-Hbz208F`S7J-(Sv;dL!cYnfUp>{#jTy%4ZfdVa zF6wQKCGs?97qItI@ZPnQPqsXCq3QG-6h~UacttZ+F?9MRR>u?GUua{r<;7*d-dT-6 z8s>-kgwpWjRfUh{FW4As(@s3(paEGaLy`;9%o50)qh^_tcF3K{7S?FmeL*G6F@;8H zfhu6Ck}%&$_zzDK8@_kTVkLvu9T>Fpn-?%U;c@!f@|QpD^5|*7;$n!DkmiDZ z23ZD4W-(Tf=WY>bt>E>ml#7dk+jr|+zDcRn0)oJ!I^w3%F!Jz2cg$Q}<{TgP_~7>@ z(b{tBov{It%*hL1yB#df3c0h@WO}a5o%hCg^x13bLxGE&zg>hmUWm1ptuN2KL;sNxmkTMAWt;|H(jS(=wV z-ycmGtz>i(fwpjcywCH~kVnTccc!|yaE~GK6pvoln5`xRDAH7LXQIW^vkG4vSGhOU z!j~E~pdFQb#gkVJM&cBs3{$0qybyeHSm*9k8;uw&_FP0U3M|`aWt2Aj@LHRzB;@&d zg}H{J6e%<=9xJ85^Cd_ZU;Xl^%s+mwPaFw8-7Rr%MNx_bT6pw}!GWE7^mDkpgxI%e zCHX)9#IUjK+GFcAhsldd65sbIl|7=eM-=<4Tnl);-J0mPCRTvoyi9*+1cl9P?dbY&y zNWj*^D^}O4gabX%moDxbg{}$s*6lKzk2-{Y$Z*4RA%F;KRe{bF*Oz?u_7vOC6V{hK zicAxFhFY1yqD&KchOHe<3J{ zygT2eRw_`1B+H@V=bX0$+pj|IE%seFr00lTB~MZ09+7Xkzi8P!2synHoL&hU6~oPI zirr&Zj@i!@y-ZSQL%&cITF~kW_D(dL+lqJZM3f@S)up0T_84t=PId}?qOyZSr71jl z(&tBiFhfx|@c-JaI#~`_mpau}3<3(0G;`dHd+&`AO?_q%kEZ_O4Vm!xrWv*={Y$a^XjC>+N}mf z?zp{CAlcvU5XF+kB?oE(%jk$?<;EO4&(4{cbdHd3nqKye9=rm_G6;Ku_t$##Gbj2O zqv_?aGTLYRRmj7Wm|K%wjIlIR$$8h~2MaB-48Un~8{e)`i66B7Y{{KxZXT%C^S z0F_={Z*aKRq2JD(O)3<4LU47S@a8NbO%!1$nO~|gG!nA9R>$`pNvg;dRyk?O_XSha z5sijq?^&C*jViw9ex6YX)v6q{ZCF-TBDOYreDFa9-?Of{R$4q^NHfLFRgcfV$l2T1 ztX&iIyRPcRXsE`9?E_7_qxk5Sq2Dt^C512Do83dBjNz-jfP3?a!zyY+EmB0%d3rtL z+9Dnt#Vm~^48;xr0zv)01u2ZCmq4LG7|TMv%XA5L-o$K7wCN;*PYxSY0?ll#$7DIf zw~C^G!^;xARC0Ut3Y0||NrWLU1R({ca3z|`2p*hPxi{TL8@CL*JK1J0RD60+Wqu@M zWh|o>78Hfy;5_Eee3wuPR3XW8Nhl4G)bx}<0ig%)T+8^^KaV+j<57++R~6+v7Q)axFn7lM%?!T@#xDdM#m#p!~V5bR|@u? zwW&7(re;fInF~ZLELC{==!#A=qf&Kxuu+En?G|&3Wk$wg7ci2}A3VEI;_>GfB;A5I zc0kGn$NaR%;#|POe8}>(fbsEwvGIVFm6#|N3^lw#Do7B7f)^(lVJI0L z4JZoh;*~=Ir!Nvd|C>v?9XFw@-D*&&`sl*-guQx^u)1ES-&LHyPMDf4qX*p6^RtBc zYZbS#$9b(ALjju)F6ne~>O&z1J8jynjCvzr>3WUD6}Mcw_ni?AcRQ5Il5*KOAf)G} zg;ytit}T_Q*L}iJaJb)PY%CxOq2DPuf0J?JMogY-YBlF(I66#OnDaP3%(%KJxOqKr zrI%VWF$_EV1;bSreEIC5;_j+*acm!I-dP=#oN7%dH4ky$_QwN4e}_3Skgdpvfp8H#zlQS z&uOo~uKUZ?mvmqt`VK*fXG| zdY&uO6rliNdGf_Mx9<%} zkzkb@W@kK%mTW%mQDn-o7?cZ>XdF50-VMQ%X9df% zptPag5$vC6?k{UX>An`n=QSj$CC@Bh?gR{%3KmCmr-csEX`O_D%fayAsLbL}pNVo# zKLcMVV(DZEV+@|qbP|uPvkG@7uDD79VyQ@TkSK1BHn}kjZ+bDutrCCpVvOHkI3=LK zT7fnaWd%k!8NwJtC<>mvaqo%MMu%=6@?7Afu*Ohm7r*}A>?MDFFv`Q1Q~dYeJ*6HL zbh7~I0fW#*HB^{^hF%H{2WJs)x`H3yPso(yi~ShivkccX-JYwBvI2q#T0MAjVA#0s z6Z@L9XQ{+K_cwf=JI)@>s*8&6J7pkm;F#eyWhd!Hxpo=h`**I(+y2p|>=< z-Dh2vR;pC0lDu$->(>=mv$HX;U-oEUWz5W#dA`|ZVk%;Ku1uaeR`vh?Jegf6)9vJ( z9rt+kqR;qLOdL5hr0+|&+t3zmEZw%EG32xPpvy1*GGS)6#N5pgcUqK zAL5tCW6ah1+!*O`+4Yg0n;4`wpnc_%kuc@%lxFw5!o9g3yJr=ahx=R~%gBsR;8~22 zART3DVK_%hcybVOcUcpK@bf1=Q)8O(I`lIS=|ho0DHPmZmOS27tgk?|CPG&sCQmGPZbdxa%s2+-=3=yU5cPJaz!wf46qkHX4*MJ(Wh^b1>9le#-=vf( zz5}sX>q<0n7A~zVE7xo6KJRdP(j$spJA~DmIF{s@=HPjUPN!geGG_H=1F%d?Iopp> zu3s(i-LFn7XKtay%8eQaI~|r*D%2Z3ou(cHBn%7=*75OxJT2IK)Mj+lr{8xkc7a<6 z>RhwB;L&Ot9z5t{wV@Fk(!s(IWf&Q;m?e1pT%i?g?P}g#)l3f?(o|6zgd-}xB29fB zAA0<^KS&rZ7o>?}AQ+`l*3j)stk(SQpv-tFW2&6e%bYfA2U={BSxO~EEAe>xy29FU zi>jZq(<|c%$MUt>qhGk2)@0n}MJr-$xXDzh$1e}Z8H#gOhB_`#kxQFssLf2lL)FM_jSj<;@~Xi zya(?tC!~pc{oP&6`06lXZ4riRnp8Wlbf+uWIuhJok(49H3ihOP)r<}KbbIjNVZ!%6 zD3dD9qIl5QVyt0lDMDa*ah$Mlt<2s|pY@F@rAk1S83IqZl$&wO z>O5DBPsZ$QHu?3>UeRe6tghABdDH*@e> zkiMmJ=JUV*7cW>GPB=ObxHr>r8F=j`4WkU&xE6tnUO>gmn6LHdWIngXo6aXHoYv<) z&JoC@HS9ENyy#ZgZPxKo?#gH_(pW-I;afv!Jrd=!F?`8i>@D*1gDJi@^9J8@@O$B-!)E-B7h9>01LFjBWf zo?&BFQ&^vR40cd8Us!0A;qI!(=Dz0UbxExTZ(5co+lu?QLdR28##zF0!R>+17YoZP zWvW%l#YKS-hEfD4$9>vO%?BUU$y3G6J9Unadd$t2oqtieE0tR-x@()(nw1+>jt_bq z969+X3;Yo5O0?3Q;ZzR&P|;+wO4v zMio!urU;`6Jg^w@)G{|0VwB?KC`AZ}BX=l&T|;wvq3}J!<)vbGzu-@XT-8sb3cfJ3 zI}YCc<(B3@eP(%c-;(yhm(VB+jP_`DBt}U-c^a@XS&(FwURP2N3j(Q-))2`8Yc1Qa zBCZW5EDR-dGdlnX7z$-+rxJ`Kk8QrHaC4+d>?w-EQYed$9ym}061Q)7_-crD=5b@_ zijQYbNVUgqtIlsvMp+$hGh6MG6q1K$L(JE@+#J3l&m~BM9@OFlqM#@Qfv;$10lUpI zwq229)u5me<+O^3I}0 z8I%00e!|(!9#p-fHpS({tjo$DR8_lqw!Y zZqT{AvM*e#5XF++XDx1Q)E%fqSjr`*-}#=UNDbwZ)6Wj~yVM6-p4Eo9JSc0_mLk_o zP5AuzpS|JaIOoo-h~{OE%AIr~uuP8$<|ZYde5z=+JZ8pS^Fb-LP&Ooe!}_A-^*P+W zW{7-4CDO#cp_>^Z&vM!noVO*vceCK=OmceZV~wjC52RtDlJlFrDtpy{|K$&_NOMal zG@eixVaW#7KIdJZb{exb+@j7cs<5y{fhO*CA~a!vXO;U`GY2H_c@i4eDPw44;L=D%wkHO!$sbm zYV!E3&aREPH`}M1fRBqdzv)QcUG8DD9Q4y!r0=-}aK&n-?mz!&k0=t{-H3SfIHNJ-BYlaGk~nq{sJP@)EknEIJlLJK zW_Z|RV%%qLHbVNYg(3)Du%alOeDHL$!}q>FM!QvT_uUbKP`Y|5_wL0QM@CcHva{9U zqu-w(DtUbV$vHs)ejxceawZVqK^XY#Z+93U54gTwC5i;+XBiXY0eR*ubix`uX(@!^ z>1L0~NuO#(a_eS^FFzlr-9DsR{pMPU|MMTb7KCTXuLK`Ww~-innP8@#fL1(uQQ_`n z%aNe8#j}P^E;;W8d~c@7Ro~}Ywav~|jfZCqZVq3ew4;w{<19qaFGd&+6Q{pf%ShPc zw=c)JHF}9JE!v6!B2p4b#b>X_n5%VI9qzE(u5)lz=GIsfWjw5Ki8U!5{JC0khVMUm zC*#IM!lSb~w`clPVkii(-XK#fJ&f?scyx20)u}S8Gls8@BIiYoES{94nJdTC82Xt< zVKm*;vj0->um8Q`=8DJn?pZdsHI?cB;#?a1DqFk|?rg*yy-*w;rDU1maKBHlquIDs zAuF7g8%2Vv%baV=B^DMV_O`pM-K=A*({GDRQ!Y#LL4qvLToUEYSxS*=)osOc& zv@@lLZkb_>VQQv~Dm1%KTU=kSxmq1*-!?`#FuS2tlB}&)`09%$SC_fFzV!^RU#0YW znqE&)s|en`U*XYLJzl-c`1nT^gfVa1A{u4OuZ89x{(i)V_XDOz3=_kGB2!2!2n4iR zhO;;DPrk1isT6~$*?C;gTkz`K!NFH2GCp4K(&~ZLnqJ>cwLjac(d>ErSGSvddRV2C zdenlPvR^P$?Gs7OSvO+;qQnp8Un2))mly}xNpnfnFI<{VTOM5wGaUAri977H>V(2g z*2)O_THvAiVEmN7JXz!-iO?E)nZTC?h4PTTCCLLf*=bh^_2_kjxmuTckn!xiMkt(| zkQ3w0k^Jc zT3xqb^8-t{WRSjFHbpViO3+Q6O!dG1PZf5K4DZ~Hsn&diFA<&xo_qgTA@Kr_B!e(a z`SCv-W&a>U2*Ju~Ot)*_mS1XP5mpdZB+s9AnVE^1U#f6?(C5(?m)v=G*x48d{#@w^ zvefc?tHaD(iEwa(8yych+V8S{t4@}hw+@BSm+U-i6NZ9?YbCnvg4wx-pQ->@htPFg+EJC5o_Q`S80V{Mo;ML#>uLG5i~tdjGQ@yiz(4`IsuWG1?=^ zz_Xepb4GEKD;~V4a%Zv$%HRpb&czUu^cSbBxz zO+VuO@mCZD7zCqXf+!od&WG3-xx^D1Z6%?vc-@OBv|zf_;WF`=Ep^cv9-a+xd%TGe z7G?jIRQB>J;P5Ku{kaxO31({ve{)dd_H3U@WKcp5Y-0|wR4G{=9!K1rOIe%O43!P% zy?}SFI|;)`A3Ps}YcSTr!%BF(@A1QTU6XB+7^WvAxi(x~S<=^pEa)d1T^Q!)OPm}hY(HzWal1~X?2}g{2C4?mU%&=j4Pibcf#bOoS&5J6kR8y*EUbXu6#O2AX{w zyQx+iizngB-!&O(c-*;LrdE~AOh*hiN(?nTc6R&x!N)b$u19p+irFbip15E|CR`At zT85=r_}OoAesJGaHkrbO3bNF})U(vk0d(OW;O!iK`N-$*-|6vb;Pwao#FFO@W>bq4 zCl@|9#(MmC{gSouE;q+JTy;IJdjB77Z}MAbmZtgr&N<(BN6xcIQKSZHj*KDatnREr zSGg+73mZl?;El_$0o#B9uf6j>;Eh*?S6;Lmc6GPgFsj_$)iq@05SbB*2t{ZhDN>@S zne*kHzUd5JoSRXwmz~i9gxCZqiTC6Co%6iU^Lr!*y^#IWl>6`6{QC7IKU#W+HQthz z3QJ}s#yQUO01^4lvp{|4&_28#>=dVR~|&4Np7DLBKze8?A{``b^W8TcfhkfXXQ z!RBU{W+Px>DQ3_snOlf?^KwY%BxiCeqO9Dgd(H85yT^s)l<|p(azw~mSxLG7*%|q; z^7v8bh$6}ElO9PdxOl1N_YA_3B$Bzgi2c0*H*fjnu8^?#sL$MNz`|@mS!hD#D09Qr zwUDv;82!PJdhOrOsrQ>5ybh#tltaPIu>ti+bDjy`w%`m!<(O*>Fh=vm>lSyWPZ?H{ z!+ykf=g$}x{w;@f46S6Pan93Di$_OeTyCGCuxy=8FdhtuTuEU91cnS~hZ&2hU;!32+D!rFr@;#adVzFE~99m~EGoR`QES9w}+1!%6=^TOp{`1Y0lt z2Kx`cr})8pibwl!^`fBOkmOqVWd#zAVps}>xuDR3AAP^hpzb*D{QQyjd>n4S(fJScd*-)H$^-E(V& zU&w_4sL_IKVIcwM*xBk)a$3kE129*@%wG8U3P!$N*t>0^!knoFE2&E9#N!U*PTeV*GU zS6jzqI%M;Fl4so(-DEGt$UeeyCSl%7V`j>}Q?xwkqdfhHU|f^N(Y zSZohjo6f1Ff;533@DhNKia3$8%HdYP8!iN@YDG-4tjeW7> zK|~8vj!s8^oosvdTyt?bWT;1FEe1yd<`>)njQXWo*(TBLm@sI7uRznhbgQ ze89CEO{{V3KIsvKf|b>jvd|+wmS>+VUx>N)X@@e`#1TAr&|_gfWN|*ED*ezEzPyNf z0(Y)A`S}+C&4$66Z~oN#&H8u+7$NAtQhYesr7(iB^xJf+J@!#+m`-wHQSq{q^5Q&U zvDRm?Ht-)Lnm}m6k*#Jf?$Iv;I(bA(W$bm^+#NsgRx@W&{w#^H&CjDSZke88LxK=0i_X4BsrN5c+qPxon}PR^5nFIMR0kdN2UXBV{?);v@{dLrBQ(}(>7#oa4-9Z(ADso={e zmNXWG5#*Kl&7KFP1Y={8ZqL$g2mIs@TfBN*k{8zdd9_FE4F{IP!-|!a1ZTk*$Jls? zHI85Y-3c#W=A?;aelcO~a($$MJNBOq86OW>y;SGmP0nyoF*z0EfG3Z;OwUHNS|JV} zhn<`Vh$F$z{^ppI6Cbj8u{R_L;lhQOn>XvUT8fk7imTUBPL4_@CndTxzMVpO2>RPM z6?d*jv>Nd2S;5StAe7$g+U;Aip8`O_!qPCOSR3dg7vk8R!dQg;<>tVjEx7J zoodd{4YRW$SlHei&}b+wEGLwu=P0O=S9g3oWYE)8+CSSnTRoOnYD`SUSZ#518GoE zSEWZvDov~m#zr{&Cih=Fzk+s>Z%w`9T|XfTd|WkDjzIaYrE9Gd_WLdN&gxv9=yEa$ z`C$H(07E^nNGU-YtW!+Hmh01wCx;Dg&JP%`8-Bh&&ieF_R;c};R^H~7Ww11^aYFF< zPRQMLiwrEL65QKVe0bduNl7)L@HZ2iHL;ixL_UycGr690X5{N-zP zcAxZlxj*32dYwG;)+RBkRZmk%o*TN|l0je7>uFXmCA3;~qQIX-wDI^vr5snUCcJ)` zv-@PowX4b3T5J?TqwdQ)$6JE+i;4%23vORggrP+jo)Mw23^K#og5%)O@%)uzZNbv( zS&GtIl3KB5@2#RJ9qShh217?H@;0@ia7aAV=F1l~)+PpwCk484G=qu|gRy>@6`|QY zY7$^r8SC=#t4XZ&ILVo$&s^N4)Pimv@PFqQ352DShXhecs!DP#vC>d#!LU>)Q}MJv z!B8u%whpN@R7Ma|p)lkoz*xa_)Mu&I8$ z8l2_4wpMX84m{v`2Wks^No%8)~r=0gK&z@;EuEez3g336WHQ}8+ zNDz)2*AqVbe25f|moIW=X9F&*qzwArQJ{^b(&B5YSey#(eSFI2N^tQ~9bFktk21p0 zKYL~2i!z5pLpCrx{Hn`e{i{Q24awSCorhm`h+|2T`0rnt8;ZiidODqozx>yyeDC`$ zKKii1gWOk88RH0~Ls&e7zu&0TASCopCI8*`_UV<9 zwXr_!s6-q8%_<5gE67SgKbKr=MyN$^q@Rw5q^d&Vh-HOzmNJl(Mo?-=OAYvoH|wmV zB`uXq*KOJR`IAiLtz6>i-hqwXDlj_(qWNAYGjEDESU*;bT&zM zD<)Kyw}X^gWN9V-bWn>NX>6&*mUimNX@CBBiiNR~vpisJy5OuYND`mg3WOyH6$rRG zXGufH_KS%3t{5KdE3REIOf@0X%6m73@YV5&;QA%O!zUHjEJb3LIP zb$@~5=Jmu|&2TI)rzEkr=~(TpG;tz0Ij-1y-eYbq!aCS{I$&WjK}mtJmO!bmLF7t$ z#_yGD4R*Ksyx1FHt*4UJQs`BVXS;n4-sa3N#=Q4Ii|x%mz4MB8)8A~w$l4P}g0v)jOnp&*aIYR8u^Yg`;3GF2-X9?P{3MJ4#;e4e?a$5P^9{gw7msHfdA z23m2obxdUx@hD2HFr#3GLJ3d%+U>VluAh^ckY69naH-W}x|UO#(0kJLZw9vJ<$05n zJmk(?2W!;V&%^DRbG|xk^Ng5_Qzgy`xQD*|EI?>4yJKK5GhsA&T0E1hFev3)+lpI*Gr zWHe-NFviW+0d-YUIXSurc=(QX3W?*Fr^~F=>ohtF2SgP*b|m<7)#l7g9Mz=>j6D z+3Sr_3pKISEH?&3funFCSryPNBl1o_VFP+)$bP5B|MIIvF3)(5ZyXDR5@@GJAa8*a zlJhK}G?J~i5&!&S!4Ge0uGK9s4kSt9kby%5mLLMOWx6f+=$7QmCx%-al1`_h(}53e z#}wM4z-Qo%#aOs;HRj=FfpdP@;EcssLp=?6^)lz(LB)ITHL2Hp^f*lfyW0buYLI|#nopQf3$500> zH~Zu!LK{IlEO>s}qHG4*-6+&8q(0|XZm3*+!;oh4unu%hnY1loe@!@ihW=$~A zAy)Vxk{-bTkIq3#$J=B0v!D4T^tBa7{H37X1feX2@vSUD=*eV-7W~a8h9}R4eE0o` z!O-#imFIUPHSfQz)fD4niivT--hRp2rGzZEtgI%?%|#@!B8)t_EDR-Ks0b5DmRYtp zhy3n8n&Rbt#z)_s@HW!G4_rT?eY?hBV0rYQ%kTdO(|qvJ7)c_zx{*?3zF`{S%W~t; z->fzt4Y+%E5^Ej1PX^rBNXUkIWZ(PEfyGN)yH5+Qt}3S5g5}Q|oc1yrjc+zk@r?{# zHwsJ)&J=$zevWnC`+8-v%cFO7R$7j!IHRxvXS|)`por;YAz@P!p&1Ku{^r#p>&;W9 zqrqtS`ZsflW53_#QtgDPpodH=9-d8ev35!`$f>OQ`Wg_5iqo=2LcwZs%u&@~^L&zP ztrOzF(}>cbVoYWrCG}8q|7?ckMxX1GXWT!TVX-!3vRJ-6qyOgjbd)xaBnZ+&p!$IYR@q_24hW7f#*8}k;91*V;0Hw zbNI7=U9mK;_`!z}Z{BHC=sl1@px_YuT;QZWh>voec zgjz%J`en)8yG@F0z|MA$^(%F7p7)UFzS3Ka0ObO>a-~Kf;h+6)Z}`vt%O!5V*Pz`B zC<{;jYNV1Zkt|(^C^F5~;{h8tYJQoKkK_j7S)WyIxw00r^CaiVlN==++0YL_+^FZQ zG_1^lDd6w!dEGu%1`$~TXK~h`u-v|A`PC!ISq~oXOMZBDNGs8p!vDWjWxVyuTE2Rn z@_XxNTxbs&WFV}?7)RwC!$RS#Ve7atI_dhMi}fsGYdsGkkOqw7ac6?DFk>-2=PNNu zDk`!nAVhP$@s4g8ag^8iKVILYp-Qf#hg5pR+7P~hBCFJB`Q|Z>+ubQ*S#lxi@Vvjm zLamR&aJ_lNgYy~sRmf6fKvqd!b`yG);)9t3gittT(FAC%(0b(k9tMQc@Mrg@d3l~N z+teKPB7(pl3WO9?P7#L!jifUSIO!{1o&?N{S-yYW(r)_hzcls3Rz->+bOa$xO!$iU z3AIXuYeoE1z?MWcQ`KWD;7aMIB{dz!I+Ib~uZ#8}Jj_JHLJz64cB|1ydr zc>TI$_esY3dP1!x(50i>GaMb2)KmP@-8$mPaeAzIzF)C%DWF;NFt3lU*ZAN6Hl*Dy zztKR&H!^sI@cLD~tXLk)M(G}?hZWZ*&-vm_o7uW#y?M^i2x2q`gC@-7 zb91abMLx>!YI#aARI*dg*r45i$_&OpTaWJfLcj}0Kp}5#MXY*u|6*FMEUXp1)d=Zi` zbes$W&hvmDFP$O+$-{#-+wT%K7II2Lg1{gHHQFd^l2q{V(>nk8kNY4cd&dzUT(zh` zQ8`Iv6{S&R#>0JvCCtxAe)hR#bGM>Du&geJ)M^rAK?VwK1z{xpX(5u#%thS0*XNhN z7%(*%a$z~<>a~WigQ+a_RFY+yJl9-YO?dG)sE%xD&urEZ(dhy z?Ua<2Aql;PSmc(fu)OUU0%_TMW!Zl27h<7=@rED}l1|S{8k_r)pFWB>?ZR;fB54^* zD=O_c>q~Uy_&1N+T%H;dE5qwfL?SCGRdD5FE4N6v$bFxY?tU^*zQB(qi<->_Lyco85d^*lA-^~H=(cBTgcs)z$0yK&W z<-;jRQ~;R{d45*sMK|Tz%#a_hb*U$iCXmE}WWT9TuKlJT{Ovh>8ZXL}`Y z-;{jox*xjL2+p*=1dTAEC`(2%_&4(F8yUPxIy%FUW!YyuF6bBD9#U42D9!g54|#mp zWc#GSYO{;8me;)+tBnq2Cog@36K%q6CJqfwH?r_qfq@^B98i5D9C#hrWh2tN6Pw`*>_YKh=vpn3FQNLgC$zSpFdN=}bUx@Q&nzz^-b@ETzlFp6?I%EGX;5F(sq zb92DlOh8#$Y-JFE4_E{NC;{s$iu+$0KKrudpZ|rVky!tCv;KrJ(Qw>cbL_l;$);m< z*29$Qv0sv8xn+66+YW#KPBx;+d5Nf>36`3cSEm7yvRs`R@a!b!q^JHrEhoc5@cG*@ zCRQ_68|ReT5lN^j@4%@v6h>l=V{!pCpB?r-EF=tt*luGXycLE=hKuSA6$< zi7vf7n51xUqIvm3bNhOViX5djv|Eaa3B{|I1(&a+3^PZZ2;RId*xSpwcD>Hnn4&B- zQc4fB*~`cV=4&!pr&IC#S;p0?zK+OL7A5?%I6k3x^Ezi^qmC1fckglz4@&OdsgJ@w z9vP`C%i?^%?rzTIO95f%*xfCu3d0XSios}4MZ-5$PqZ9M6EXWe!PK~?6MiEz^S8E> zIq&<^XO5rD9xz?Yan@UY(fiKQIFTd z2Fe-6yL=W0f7+Nx8doV*^M=XSAJRM9DOU+!=rE;Ebq^%-Rn#H8c z>#Rj#0w$x3+yrd*ybK{mcWmo?-`8ZCv)gG?*nqLPL<%^`BHj*a+@3k7!Z!(9Cz)$k z9CTyO^MLtwg>hnJ*AjgBBH_+TNf?Z5Y%T9N*nOv1obvT6+IkC+6oQj3JbDJVuXtED$&8A{vGGKNlWO*qf2qi!IQImQq84ewjlL2M~be4f&?^(g( zLP8h{bmf?w4#P5J*3O6so*|}q^?zpq=m>Dx%yP#>rzFFeJq-Lt2dGbo}$M5%9pD7qmHSI*R z*e+>A6m}RFMW|1c!2L9=F*!ZE|a_OQ@ig8XmlD`VP3j^MIWb1j>7MzkHE0(>5$mX$tLa zXRSIsei^Vl#zmOD_;MThEb@mdB5sbGbPhWUFzh3j5XZtTTuit5IY$Sw% zKpP*+H`dW?1nlhO%*}?>Qpw9#1)Vd^o%b3fv6lga6j=LcXE_upxeJ+#dQ64`N<#da zP9mHnRhIXr4taPs#WP#y?%WxVPTE`^?-B@uu|DnQtR=4$8?$}3j+%V&qQ=HTK|L{S zzKdxlhOx9FuL4Bi$O^~Oqy{1Q^=8QRi_mOXN+S`W<>9X2)|w-fj-vA3-tXR)JbGr? z+O4>{7Lr%eFVcWG5o|rlIX<;~=Q|CG5*|J-K)}*cOqP2cH;(WGuQbFtN0B+MUP(E4 zTk!EOJKVWj=k9xT;zUsv9@LZ81&yY}8q2k7HJ)q_c=0^r@|Bbz^rt4z@%5IovT$5l zji^e^U;lNN2M=-vJ?(#xLdU|aWOXs(^@8B_YhNnaszW38eo$XwhfVNPV z1qlU}kyJ)9r@D-%1NO2h?sb>BG&-B=gN4O%t!*|7rIGgd2-TbXe1xbpAbnwX#x^yxiQ=0(c329ztqDCM-bQ% z-ZEurvSfMOk`)0m@SSt*)X+{1PhU%Jt{DcU;PY*XRF)g-zW!&VH6gKtQgZE*u+pv>0-DSdylSUPp81P90;t<{QUigx~hh*4kRa zuYPsTy-y5jD*5Q!O)rrci;=$3!x+bDPg9nbw{LU)&wo+U>uPRXPuboYpp<`k2pmOj zC<})ami-qc&-Zg`vEbI#kgp!)M1dm=JP)QSJwCLmET(j1=Lxm(+}kF<0lne38@wa$ zuIIQ85?D<`<>V&B;A_nTYrVW+A}Xi&w11Jxg}lkfP||*lluV?dLQz=nWEh%= z7x@^e()@#&=iEP?AqYG`Itm;@NGbxXlq6E~@OYBXkEX~?$d6YKI2#5;5ro1LN*`av zN$$+|czDp@v*&*J9(5HzxH>>ONi8%u9|yx)!R2{Py#|k;N8Gps3p0j$+y3f3I}XEK zAObO37QlNOibv19?t67TA}_7yGn{EUXPWnJrQ}166OvmuVjesy09ag%u+9-hf;`ix zDMh6nX)1a4bja~h$@FwYnks6kBF_y{2wx2pLYhdVfTFTo+eq2k8uIMvkooxtCBT&C zYYR`A8y-H$I6c#}nvzdG9q_0BX^S|3dSbDaw~!g_n4OlauSmYytk_tER^3rmp1oX) z{P(m~bKJRP`SPjcy;be;kk%1NOC$CbKsfI)wifTzog6Y8L=oSwWP9M3m%s}_WI-W zb;#xPfKn@z&_u36jTUImItmmanz|^M33?nBO`i29n2URqA|Mo&VHKc+F9rye<@K<| znMt|cKEfEukbqlbhdl1iaGb@ArzP5iB+9ULJdRL;yECVhE~L~F8CbGXF`X8?i4wLC zQ$AQ3a4<-Dd=PVWF=KJUklT=2U?K2UP$A&kR|?s~2M)JsuK; zk|dR=&}+qc;m9-3a{2ks&Itp-_kJ+OgRlBD8y?J~jl*b%Qhs0$28N&h%{i@>WOX%R zYja2xiLXIbd2YxvKT!L9!(aV$NUI_E(RUI)`NB|3Ac-7l3*XtdRJp`f z0V32m``ahketV5q!k{DhZ$H>$Pzkhl+@3l^kCJK_<4gBOCjFumET%m!*3amd0c(v@ z5?7!{hJR;#)2Fe3wS3ySz+})vTghsCOm0FdD@V=&L1`7a4ZX9%8A4%5rRHLC>?_`- zf0&hU7!lwpv64F`=C4mL^KTC?aiwwMuWX^GT!qR}+JKUP+=f^r4^Ad2tYWb_LDy*RQ2)ZVq|- zD*rm-+wU2k?&kD*nz6Rz`jv>IgP13~1^u33Y);be`=KjB->DWVN2>-mFAE;+Xs%y$ zG!wtviULa`@q>7}Z8jqZ=6I{T$${lZRi(w$|9BYED`5{ zI=_BB!QVb<^TnGMcbA8}>nIMoA@$TR<_a57SYPlemE_Mqjrbq`Wx$OU!}2VAx+Q2f z1WDq3$Hp2oo=|78-1|xs27+(h3iHVz+uN07%k|~|D)XoqXo*gILdo#xM$uo4N&{}wJrFO)^@S@kG5fp5+j(OFu z^XPPn_4+Zfs3tJLE+^!K1-E*OIqH!eWsA1SCAL#yP=BRpJV z_gYy)2-cON>)!CmB?VK`AMX ze|!HA|7*nhqT|U+N18guS`HN$lcY2SmlUNa_-aYb*FDjnw8OGX* zwdH{Erk8Sve$yr4`{LfelW_k*&f7O7QuwPD&hg2wdo-H?H*cooxg&}Nix(nZy)4+? z8gO-^=5>1IsI);F-^(WO1(>&QrEESP^6|$#nhjr_GCLh`<7!H+=HV=10Po+4I6wDI zze_WcB6r~YGN@ViI$at&Zmz+@Cytw|j>)Da&-t3eJjflF7Ytu!f+w#OmuEG-fn!+s zN}5)r*?AWcNyC+yjA1Tlg#Lw)mjdN1!&372u)(#74yn>;;~h8gC?V;b$2`96*ElaC zE;ml;l>rmckhGaGtO5?QI@^P3gf)EDy}-OWV23hjiqwzTc~*))l$ zm{T2|GsT!3Fdue!Qq1vLZNLr;51QdW*nA*@aa8IY$u(6|40QJDo8; zKZ$rdZ1L^+BestH^Io`+!UmKsz@j)WBQhQE@UY3&VT0eh+F|=$LKr|Janw@?LO=L~ z6r_m{3Efz(SeUeY=Z2+G6GWjTP8>n#Noqm~f>B6j=LP)t|5d{NTgOLtV_*BjC{HZ? z;Rq=)R`U6SobP;jkDdyu}_E^81AQfNN zC|T?Myw1Xdulh_*1gx(o92^w9epRrr5R#3SWX||SWL8)p%pK;ko2ay-%nt-AuAN z*5{c?d34z3=EMm?I4bKG7uq=94N}${C!CiNtsrN$Zg|q0U@bkNCUOcRJq`}dQBk8M zGb*E)4!Q_ydC*^AB|4@da|)*r)^mE_>Nd{!*y@z(@v55O(77T(z_qvbYpe6plc7veVgV#oAiT?oP(`)_@x~>fVVU`MQq{;YbrW?`Zlx z!}I-|Dt+^?&u0J*LGix$Q|aL_<;|eZ`{Qru8sqK)U|hEB5_pK>WW zh3nV^eCf^eq-ylZuGUlS{~4h(<9mF+&sai=!p9Q~d7I3${+%w9|?xfO>2giwbIS zPCfC(tGlO7CL0xhxN*Y9T*2CGF|s{MWa#mxP6mXLB)0*dJx}?MzL#^_4|sd-3th9y z`P-MU7$FEE=ofJBp<#SXas86yxMSFRso7W;WTo&{G#n!EM7IZUBg#j4VjsZn49-Hy%3Iw@ zF;lT8@mnovsFJnXDGxd`%!OSp#HZv|p)K^Qn2XV|mlTX-N_7!|;Yl{f#qf|x*(bLF zkuV&VEoP)|t*8)O2##sUjA!{YtI09-phP=GDm43Li@MB7M9DxWOoe@etM{ZjIS8x_rlnl0^YwJVVs~lfUJPtz|!kiWCa-KPx(LlS(n?lYy9LVz7NY+w|j6;AO%(BeY2~p z3D2MBJbpCf`t{VO&vFm7E(^!*Zo%e0fw?AqyIT7$|uV8Ub`Cx$XLpq5e3Vg!s z_D0CV%>u08;=JH>?#PB-ev;CWmyU%g-(c`y$1_{A!vEJv!cib`TFJUVPLlV;2}GV;p9Y^;G{C zF?r5ZtpueI%6rFA3Zx>5;O($ZJE{1c^$tT5^69H_CYlBn3NQkpB~A)o<(?@Xy^gth zp(2uk>9*nVtB_Ymg0ZHDE;-?dV#i6x@#U`J;)Q^fMM1A`xw0bp^+Ut@MemWfqk>9< z0g)EbI*OLA~fvbN?=y-_6S_YF^;%uT?hc^`RJcm~PF68v;Gz`EaFZuoZ|yizzX;OmSF?IDF0 zBS@zsvx=qq0H+Q24=1?XK4m`c@v=X`RP5V&tpS{)G=i9tyUjQ3^e5QU<1EL=oL4c0 zQMBcN%6N}pVHIO?z^!P=PCkoPf+^W$U?T=PVm=9OCFz&gUFa_ zY6>HXBFoNE!t!`dG)gLs*EAdRIrsMJtj-$N=MA})IQ*vn*E@=Z2}><@3^UkRG2Gh@ zcyZ{syWs;6RtTK*L^KsT?tN8pdn00TKH$NQ;k@U#x*jlX{FTvDp(WaSO4YFN^tLDx zoOcXUQ=?b4^D;pkLshs@Po8CUHDT{*&hCyUIqAx>|6H@bpVMwjK6t;5lJH4Oa{Fe? z;X%dA%5ZTxq{#di{!KlS9i3Y5Yy^Dys3Z-%uH742w2@!i4U58YecAHv$no(*uPrBm z#YMi`%o>Z+mfOoYpYFu$9|wHCm-78fT>@$SwLCBwymspY5)J-ft;h02Mqc{o(^-dh z&@Tgovm9j!ulfycv=2v+AJ4@tgx6^82%z(-Xfdb)*5X5+W|OQ&N7%rzGo0h|a)kwX zN{yVM33*;j5ujNLPAE)3EJx3W(@1OZ-V8uEy0*s6^c5S)TkfVWsfF4n#gsruIaF;m=xJSD1&xGChy)U;Rb)iC`UDSO0L|leFLw`d zD6>FRM!5U?-uu75_BpQ^U#vEKY|YQRM^vTb7=4 zQ;wOs;xrf3<9{)@;kV=QdXO4=XNv3cl=CA!i~)^B3yT&8Zyl3K#!S7>>(d6xTeb&v zK5Fk1i?I0(`3=FXKk|mT_=LkE#ThuO5)x5zE;_d{V0-0=OCS47$~Uaxp^*d~b_qjkfDH$t3Ir=zHiL*+3n7tK;u#wiDB;<7QK2QAn+e^umN3=q3cT78TUX~0^+!^2UUvE{~em*EYL^O8=}@@&7(Si=%W0f&FS zpKv_Te70PW)`HcklwnCY)`F*7idH>H-1kov&)y1dTogpH2-BMkpD$&A3O2VrYb%<~ zZO7e56_-{bCMUvuIs8+w7DmSuFJG5*#x!Xv*?3uS{aVV%h{6w>geVG@l%u1X!-I-u zBRo^PyCt_it`o-sL68Q=ks#90YDfl|#gt)MDhtbJA17!X7L>^l;!2{xoEdEj-fUO2 zQ+T&y`Q~-W>^Qh8EP3_Nna`TAb2vN}ygG5zn=aTN{FZRTZ`JX7LQ}QB8}XyPF<$H^ zNbhOK#gIZ4gcHhJM&k_O9skvXPlqx~2R7hpIt*P@CeY1FE3g)R)Vsib)!=gSj-E*n zKE%4jm=6+L<7F71@)aDC336z!-w{&pg65#~DvZ`5sVR^byap^)rUU@v8dQI}HyE!9m#n^}5m@0oD+ZTSaa((pd@{^ClbNLb8V&(x?(D)R0zHI8BX`oB9?1 zxcCkyu8y%1g9t_~1PWp3e1qOU5{BKf&9QHCskTk&6fK?8av9IEDQ+~kD13tOAq(zB zZvrG-Y#mV!qk;;fSZbc~_0cRly_D%@XbkS}kJ71^ERSWBCPwIxz2{~Wk|rje%`Qsq#0?#y93X+K5|5{z<5uj!!+iEqpAdx zV}ciN9Y6d@i2eEGT1=w>W$8#Fi5FmoxVpEViH_ozU-o(Vs$_01CL1^qf?6ukT96mP z+S6Lk-mc-NKRqLg;lhO)y)%PWP^*Owzbpg&%Q?^fUd6Az&X}3fe0)9OV80@Xf?-aq zLiS%(g=fcE&;Rw;761GHQ}XZs8=AY19fwB_V}|BA)|2Iele3`s+jt{6OC6I_=0m>Y zzp}y`%)}+KXSq6k#@bYu`FbDk9Ku<$QjnK|vIfYR78mKyq2@n8Jt5>mqNoIl~kaU+CWMuJ)brPtxW@CxS@U;ZlP(t@Sk z@LXQ7^mB=fe8_>49-%DOX)Z51UhN7t-Z(C=3O2VK-?*k}q@KcfoCuCl)(ng9hT-{( zg4NX|7_q+yio4b2m@FUWSXsxltD*RM4=XD*(z@W}B#d851#aYn2Lq%MeE<6`=I0~s z-tBW?H5t+-!X{dX;MqFb6g2CCD{C@+WS@q}u?}*p1I5cZyjL((TdtS$EXy6DC}6#3c7}^;8z`zXRX$>05!<-rCV^$VBjdqAnv$*d%)9Y8GrW=M>*?S z^30OfBxM<-z1bi@V!giOmtPJ5Si2Chw^xxQf;5IS@x%MlQ51oSc>7_=AcJ-TPJ52A zR*0O6B-A2Eb#N}jSvGe(6HUpFpDXf0{0n(E{8oimNzZ9t@y)3d{$zEVFWzrI9T&(Yb zltennE|C%|B~}DJ?o#6vi(;YG=fX%Ap#$5YB%<^YRw&M@80Q4jjhvsp9j9`NkLS;b zG}K~9li--2TSZ|NnNiGl4FBC-n$$XT#MC z5(gxSBuy1juO1j4Jt^9-Ny;i@tQEOqv@Ka) zjClCC2)tbhXFbQ$jf#Uqi!+Y7NmyHw{QVy&zI{`0Zragl1SOrb{=-6WtmV16Z28$E z&9wzbyB5-Y-7p3{jlz9URN;Y+@Ei>k54P%jHh0XE{S-G$@0G%nDnq-Sagu31b&hTs zvDEBRIl=woDe#t#9&42i=} zU&BO4q9ehl*JGrXA2_-~256#m!P@lElZson>YQ{f-}**_&RCdAkfDcs?~^B_;Nimo z-}|D?lP5WAYc=NQB8(X>a)(hsT0xmR9z4qU2Y;{4tJlGO?CM%fk(-d1;cZ~bct@-} z_a9gM&Mn1sNAUC8C4ca3iK#69y>F%sd48$(yxE0*F8Jf`mf<(=OGZaRpu)eB!s~sw zo_SAjdE|^VwtQp$nEUUVWF;)Oy9{#qerEzsaoDdhs5FuEOeK8=Wt%%EGhC|gVJyKF ze;8*TS;3p4!}(~BRFq80E)TK=R-;`KUsAeg$m0{#T*<3yf{r+2ic<;_?w5;PjCO*e z&Pt>LZv{0Bo7Dv4>Wo{BO`eu>^lZX~+5tvJI2oLtgc2lC&ar9Gj!J$oyUG32X|@Lq z*2cRCC6UsiqvAtkwblV&`uA>a1@B%TbA5h*6B?oQkd+WJPLx*kDov*yc$7zd&1aWN z>Zw3#h0;UV#f7QD33zuH%sKXt9q;xeGP7qLqncfcD75NKFwKPj+vg0$Od7o+}uZYfwxX3fHeOq%Cj?iP z1%LGm&*xV{{ERo@oNU%SkrJe_0v00`%+O;Uil3IAK`wc)UFYg- zmqrva*BWtvkh}}|aVJI0S9{}pduoe2`yFP}9xII_R#L@L9`mNx;=$=O56-69%0~Fz z(Wi{c9%oe?x_sP_MPtHZ(i=9)DKv&9xyNn0jBG+7sMdZX(Qd1JKZ<_p3b5M6!Jjq#F(3Hh+o#{f-M5N&B`xUJ^%uOqVvkY?2>ut~ED7Z3sFbnT# z#IW&3aCj>C{EDF-d#=q{?md)`6QxbOxGNJ%@dSe(tsjlx>XwW$*x?6kSP z+u_RSad55jo*2tX(PShph@|DL)GXCcc-wDt_jH!kWS>+Nln6AIz71&!9n~Xq5p6YK zDY85*W|&dOOma$T^^g}Fy3e*4kolMyafDQk=hY0WVwXr6j8ljq7xlk7IzCK&zQgff0bVIIh;I(e{M;MDUN-J4yp76Zi;m-a9*C&rr0*sMJ6tRHKZk=8g z(TXdYiRZ;>%r9P#aASUeF%pzSDuGvudJXQptg$*{xV2odv7hkvIOayj62-wQww`*V z4j6R35yraz^iLJ7w&d-;e(`m|=37InrLa~8+{zmA zGHmJ*VImkA)%>%+I^(Oa2ejLYAAG+J1k5Z=gIUSZASCs!EXTZhRj|IE@#(FUMqM%( zxc5T^X)1X3vgGi;RCZKa}hO4B5!zF%n?&D zuaBsVrt+E=10oobNqoW~zaB^I+?!v^? ztP7lRB(b31cYOV%U}jRXvLMI@mR21)ZNc%0W4;5q4}q;%_|@Zp{olF}6rouT=cf!~ z>k(yTervelH!i$Vc>0y1yFE+#vSssYw3G9TkTG(}EuAyh0ShrDxRtoNt6+}fueSsaSe2~JJI zN^6(O21?Jhu|xLCCJ&FsxG{MeQc#Bri|t;@LTi8*g2GBJP7HW)(&XVzgPV&vRtPK* zE6+)$Im;EdCUOpY!6aQrhOeH-+`QmO;&5XN0?&8%2;S}szE}{%si5A4AAfDRc|~Ih z<|9IeB!PBIv3uwlX({VfqW}OP07*naR4e}T|7?OsPlG+#+Qo!H9vt1?Gaaf5di@|v zzHzNaT9b@-^f34%jBw5ciRRvJC|pJ1SzV5KzEQCLq@Wt&Wwiv3jw}x!mDtL2^P`Bt zz;kq5aqmgR`FTk_{`J8f>+soUeOQWWB&}g5oRuNqR7tqMJH~W9V>a#6uOc8^y8ucBf7r7s z;Z3i}x!MVrY6X|-yF5CZ=A@`Gr;nIc83PlMcz9V(5@9)~4#{0aN`di;nlJGpn8=h) zkx((iF^gi4WpWL>PIY&6}&!9IT420+S&Y92^)PuIF615MYI(2uruoQB75O zdOb^{9^Sk8x?p>!;_BrZ&8DCl%Gl#5uz+@UD=uG%@CZ)2mi5Oa%L|%?89`B6lnN$G z3)6z9uN)t(gnQIkxcwL!30zz87y}UKhGQ*HL&0$=XeR!*GR={{(YuE*gBif(c8^F8 zW59Wr!Z zZYUuHD7~Ua#r0^Dfs5HR6VzPEv1^j}3XQ`Jze;X3v|4NDq_RxGbzyzRI&Z@BkDQ5uMb(#Rx& zXPaX#J3lObv0!F4 zBCQFQmlOVz|7e=|xrqDs`@u?bn7$N8g0c)r0z!u3yRsaUCW5>7GTv=he0?|P>w5*A zQN=euNf>QQ(o}HuQpCzR&BLc5Z%hxrR}={%6&}*cgzq;s=DGbW><{u%aFz{WEfKsF z*5-nn*~6^_DLki{L`u*4b_(9JHkDCUB0vis`h}t}5-ok$^w$dJn*%DVsGJ^)AcxV-jU(>4F=Lw~VNa$N3x&2Xh?T2KV!GXbk7{A*I&{@5AyIMK}%v z7M*y*o*!kGQT|=|BhIr&&6iAwE|Ir{poFl*a~{_7IR-9aChBr#Ys@C6Yz)SK{a|}P z^lflFJ{@N)$vD?IrF4p#vMe-vyy&)wlns(v;i;VD{$87v&VccH2;~G%Ee;gOm-}(Z z8dIJ@F8JHWDUHN&akeBcLw8*n&+NG8v>XN? zSaQ~LJbY4cwcAi#HZ%7Ug z4fVQYW22zkwS4|rowO!`sm*YYVXdb#rZ_qd!iu9K%d?G&Th}7yXJlB`4u4i-J+qU6 zQI+L^V)@`Dtj@!yYk^gP_ee3EHnivZoW*4FL)yi^)WZ9oM%F!3*b)v0F=vHlQ0dS` zS;2l*BbJs#IexM|%afzAP-v~DbfMr00$&oKrE)%QZgFfeQv1NoSKx(NAz9HdA&!1`Ss_j0*Rxe z`&?^m^Db|rgyXcTaV|Zjp(`3uMO}v%c;*@d7Mgw5kH)A+mV-gebTelxEyE8g!UZag z;KF3a>UhS(t(3fyVJSI~T$nDYD)C_i&Py0=I96vJx1THW5*jtn@tNSL3(IpsktPIW zx#QfdWPDU`_lX^%P}cK0rv3W!OqJ-Sf3n$JJ01XEHRj>I3FJ9tc1(+C5LBcMA+$ z4EW*S3$ZtBmg68`CE3IJVB|C&_Zd++uksF&utU#g$NJd>qjAoB{fyj(c|SLbbFCgH zdBjPcP}hdS3hwTXaDH^aSgj1cyTf~~tOTo*Io(X51much2?p;w~Q z^304mc8>*()N}uNxMt^q!z+!H5Eb7Lv>L(i{`fT5LcZQIe0n`$Wy+8Y%o5qh+|KyDQPq$jb=E^FJ7q8>sfYoDgeImS)C{nB&nd) zkTe^Tc2g2Zf{UwR%H2P(>>V0D|0HH?B$T{34$mq+z-W093j4zi$6tQwh*VgP?;d)} zp=sBk5On*3gRY<~B;9V{75^)N8ias%TQPs0P4eupj_|>LFBKI+1VfTR89KL}UdoGZ zo0cwleb%BTN*byRr!gVLHNqgAWw&VYKXpH$AqtMFItd2t&4>4tF3`bBr!iLY$Sjb% zm^Ja1rzS%yM}i^3P?efWYK)ike9GTcSLyj0t9Fl0H9%`eq7A9E7@^6C5K^*Nw)pGg zix>i<;cYQWGd9$;BaS@H#E~YBPFiqg68`Mj0?$rH_=DA5_WKD!55xP0u_l9lM6+gD z7%TY6^ClxrN57P4#en6u2WcVPMEtr}J32~Gw}vuLtc0~ zqXLQK{*#L97bT<3U~p2Dd{|6mIV??kj=P?pKG5JT&00_n3Fokt$6NSpIpfc7*ZJyo zopw_3Z{9dW2~RDuNFA6H35MKA9`3jKleJSuqMWP@DZvbRFx z3YFJ%bPqqYAFaGX3WE@^673Rs%e``mIdMorMTNwo5RSl4_m(|B!U+v7$Zfn77!l;^ z=iDKiZjwuW8{;JjmRDvHClxEvKBbR>@DNYsB^T=Z+#4(~YkRcgiuK+MV@b|Z;|$|9 z^{7H=iPVxb@?0A2vfZyERnCiUo0~JIbXtbeMa0_Tq`(gw1FeF9b!iBhd84+&^OD-6MBhNg) zxNqqXJS+1sJK_1M^3)SWJqcNn{R{?~$6C$fP0gNjtgIHlMcMrg3$GL~C?pGM&hMT- z;Og`#BH>U&^NqSH(86K7W}$XM!&E%#&(N)EEY#0XB8;O)MZ%F$l)aF5byg)jJnV4) zpu^6f&dOLHtp)WsM8Rt<$c+x(!cK9TX@0!XVr{nMco2~$;na;IiC2<(0#XIuiB8U@DqaGrHrp6_^N1ng>c}YL>L)uq3fg>#tI;irHf=_PN zSbtXXcB|r}D=A;y8Bj|E%jXmN1NWf-=DBBTD#CfVdw0OCTaD0_=Z@Bd;`q?;-eEF`!$5Tg) zBo$>DlxtoG`Eh0x0*`k=BEHx>VpQhjMiFBvTnLSPKa9rG@-&;GLB@^rEiK)#PLYl%cKHB!Q1D~mCXSUL`l9gkib{^F6Q zpNZef9Q~ia@cNJ>+&j|z;nD%$Uq0fe8!ZNP!Scu%ML{qqSD>9Ei4DhDL_03{y_whC zIhf$hpv_|K7^N)@St68y*oA22)KFN>C!??ERtaae#)W7njLh#f{Wj3ZVpH+7oZ+&3 z%e*|~rJG_^?NC#OQVwnU1mOazil@~q*OE6(M_rC+ajCwGmmzgk>JV9il%(47pg+gW zv0du1r4kWqqsNp)fkrl@gdr7DOKx?K>6$I-QCKjoP7W|W8p<6dPAHtzc&W&YW^vLm zH)i={rDST%v)_-0Dya~BSz3u31gEaE!gJCS^!lE;Nl7gUL4t>;p8XRSItF7o=?d3?D_T&3{nbSzpi-sGUw*?l!*z&_IAbdjgrqli6~0T!zTq-*AlF;q-lUP-qR0@ zQZP0uSzT1ze`a{Q>uIMj-GP^H;G`?)XA)BhuAH;{>|t;s`}Spn7M{tLAyt;~dc`-E zgWt!W{>~u{U9o=}I;cSoiGY_!Eq2dpoV%Fu!Md&#kH((^U0 z>P>(lY#@TutB{Kai|jGVTD;Aso1_^PI1~jDV%Q~H6o;n4k55*auXVXP zvd3=OBGHao6g*=aNr3hchV4O<*=9zhJWC@3v=TI8LoF6Wu_28DQ)Ozzu|G(dYFn9ULzZXJ=1$$wN?S%c=Rae=G7YGV}c+5Y`_n`NU^0wc#pS3?+-7~!twI8 zqc?zm`1dq_{x=nQ>6vJQDTA4ia{-!brLeIj+1i)EH*_oejXGW- zpvnXjH&S1az9&St+6}wXwWDZijA=mTg3<;*LRqxgnl&q^rnjl|8_#Nq1f3qjEpFfL?T4kK1&&7m|6>(jS%?w^I!A; z&o@48@a=Ckk-{?=1pZ`E1>3v}%P|`-3m!c#xPB%208cnCh9i3@XtR@oUQh5hUpY=r z1J}DA!_o{)v^=evMS9C$-m%P2SgtM_Mp8qOhv<55Jb59gMM2t}#GZw*5}YL#6~{fv zK~M9|g(H4%c^_{r-CT0mi`ehSJUATZ_Fjjt_a^!7^jl`relXA(s=E*}7=q)8gynHI zNhA!5wL=OMQwc?)426$LRmCUCOWu|p?p5cxZI(GzH9DftnXQMwS0BVUcIXRjQ1q*W zXLgPg-{24G_h_k{R92+Y1iMV>NVKJ{E1I$4@nD9F%_F1|-0JM0Rq)Z3N`^yIE9!}7 zv)^XAS#W8x$B(vV`C{piBnFfY3N{s9kybq3ZE`S(`J-!H?rk?X=tnG0mBV{1m@5et zHux|16?rB2=0}e0W68aj;odGP5ME$yD8O+d`0Am>ILWmulEV|h&+k;MEC<#EQeeGD zMFAVXe>-DjOfx>FC`-@ndpXO?!LIcE^@wA^>o*0jUze<{)xts2P&``CSX_*;CKPF0 zfWnSX0-twgS~D@OFvd~Y;KMN53`;ryErLnVFCG{o2_LTo>RYQJ*gb-Yk+3reGLArT zTz{!JIrH3FEs3>fvgs*btKX!A{uYH-5R5Zy#r#MS#9oG~9g3&^IyX;$spjUY66GSG%-C zPAMc>I5MHB(2VIp;PEnGO~2!nn*s!L`k2CNlnA^?DP4#S5(#t3DcZuF!6Fyy`;6)w zBQ#oiG8Yz6BT-4=Bi2TacsUs7%YzxNj~@lK6q-mmPRoSKOUBZY+-j~)pYdRSl)bFZ z&4vE2L3bahcJEFjZk{i(Uh<9Aocmif?!8X9dOrB=3MX+wkkkYlI})V?*2Chg;K2() zuYi?BL0$yQXapw++8=^xRy|F0z!RoD{~%db;ZN=g8%p*O#=b{ zy>X+?pzp|YH`K=eT7r4jbL<}kxo)0&R#pBPzaeyP}-2dG1`ESmK=}XM$EKfy6vcp3{rFL zsV8>G{t#4FqP^pFx6Zp`&B}Pj#$ih7B{)y29ZMs9&bPW?E$@0Mi>)*E@&;SI21|_- zW}+^UwB$z7H8q?NY-E!}(y|mEQ5Y2zg+3%_;{?tH|ACcgm#$6OuSU2mw-}da2njV& zp|K>QBF2!2iW(Kq+$=Y0uMr|pxGvUqDO7?~fE+r^X^E8Zq(948l5wH=j-Q^K=df%r z+vrny9XRJ!QP-YF$0H1EjVlvfoDXb{jpG&(LhkxfjGLe1|(5ibz_1=c=VB1X(4RA2&>BHC)#IW=pnzZdQXN z0PiS(S(prtZmZG$VllBBBSTKtAS30tNU+^7`v zs3Sxe9fe@{xo51@4tQBkaBS-V^Oc^%s!1y<(JB}ymtL{jK4G>#VEtsA+=T+IWH59e ztyLsCV89-@IeSJucHG-;1umx)C=Evgg%EPkedCb{#VWRL}M#nz7FZ@(;gyW{xig68+WrMbAMn3)uO z^;mGy6GMtuIN_BN#6w%jo6Cj=uS39Rqyud(($G#rhvNwJrqU@M>@>MH*Bgo_!e%;1 zuLG{xt0L|mj5CquTpBsyi`gyKMvvIZn*8!;j(0^nc(S^f2WPXy(r~^WT*j32R0J`O zmTnl|EQqDyogZgJ5BLun|C9^S4maahtf_aLmwU|1L&jB)hAK$4;Wbml%Ca0Eun-@! z@7rv<4n`<)VoD+^p>YVF3}zUKbLMJi^j*wy^MuW8B*17xdO|(2yy>+Vn3!wh#~=h2 z$y(=(?OqzD4H?u`iE=#JZ4hhE=gU2m4C=^pwHQQ?1Z`$gDAd~(qSnwAgI zRh>4xJ75S+39iNy{k zClp7g!B;to1cTgj`;lROT5)bp2gVSAA~({KWM$YBL{Ttx|J!?#Si?t4KA61wz=jxubL!Gzrl6GvUoWv6%&odV> zo@C6|yWH!}vRkx>mF2|L8IK1Tp+88Cav!0jV>R95m6_yuIYS~0N3KOj^@30B@BuJV zQwq&$yhkPzHtZ}4OXed|Sp~-}5ul9HM~p@pR~y^BE5{J!zWu3Yq9dtHz>*i|B&!R8 z2OD9ul`{OTY8Z5>Raih?U9voU6Azu)}45WbEhok~Igs~E3 z+4m!y&}1$?VI|tb3&C?Yi+G&vJ3dv+GM+whP(H<(@9IwvWbWO}ho#Wv6Ai^Qmsh333@upiRR^bqO zu+t*eo=eji{YnKo8{yDj8n1Y=6YdS?;OmWunU3Syc|&Q!_3xwE&vXtZCnNR_47F6U{3SZ(LjYaxxZ5j&cRqm>w>fZ0~T&FK?1&zfxY8gyy}W3_^s4z_-cs2X;Zp852Q zFD717_=tPGIhv|qA|4P+OR6gxx}>E`5@l(rf?M@XB4v4G&e0=fAwEJ$sO$fiwKw^( zGfU6>erNcmJH@>*4`h%*2InA|nUz^pSt(UXt!l|-$g*WsH{5Rb#xP_r?1c^3TYJ+R zulxttfDK4(^uldh=x)n`=By!y%1kmjGdKhpBqJDe-0>UF@#4K??Nr%lCy<-OMI;&b zyXU^=d4JFI5_Kcap##K3KTm>nzKt1Bp!y6nQF&$!uxBM zyo9Y?;TxZCIaW^#L+uevXgKnmSPW=S7{0!ny){d`dRLL~B=FqW=`dBxn5hd8U9%O&cq#-@ z>_izKPH$2vP3EMDx>pI4?vO;^nv^b?$X&mut)T9v< z?4)%HZ+K^VUnl`B8~Vsfj>Sr6$j%@p4m|gEnoJ}WYYRh4r-_W05T{T++ZUH|(n3)> z#lx+TGYgLMi}E}-YtX1ko<>X5m@NP`KAwfFLmZ4rZ)avruGb<6#o@d;+F+yv_yYDrmDY&L-HZ8T9p;j|! ztvP)`iM9<#h;u}0Bq z3j15H$@4Zjp_%Gvo^HX$mg2qhurw?7`esAXs0m}Agi=fUr*2nceP}2p8Ehv;F^&FfwGvQm(mm zX!xi9%uqSa@BO;x?uJ+*gGk7WwD6S96NQRTZ1N5JCk0ooBy7LVxO%lVuH5$HazW8ZuUt)7Ur%}QBInH6gu$TV=GQ|mUaDaOX^z%f zP_wzY01w={J>rA+Ycv~%Zm&Y?fH=|Y?&LgJ&sdtX{G;D*aOIrkvzrBL=M0q=9#Uyd zEs@B~K?bK66#aqX{-);qQbn0-`l;xKx~3Rqiqmr?`#sB@&4}~!Dc#f%Sh%~Dpp|1~ zI-@_-1jbP~O}~&3@gyjCwA-K-I!?ETq*Xu^IO<_38+i?kQ^LMJT;M`;pWk1)$4oTf z>;4ie@gCE*2Neu_M5HC_c_W|XpsI1cwvDUw+mcbM9B0GVJjfTh5^mBoIh*AafpM&a zJ8vu9m6oMYU_2LV+dMC(SyIP5&S#j8hAh{PC<$oT9Ayk%Ydo5nWW=pr#GgDrhtrz1 zsY9OjT7*_&4}EFKy_F(Xt@&iL!>2E%xVki8vN>eqAR&%Ka?2_^ey!k+e|n?F|NTXS zcHMJ+sX`lhpORPt{Rg>Wm`P3hjYpn8{?m#xCpCAUfHIz1O)#)DFBy)+^iq_HfBlz3 zf8@71{bppdA@nkE<{hl7#BImOOy!C(AEm-pXqaQ=ME-FqofBtO%PpT8^ag1Lw_k^3t%4ILif?}Ee$#_j0ePjE z@D(eIQb>7uzK{0O^bo6(qLiG?QLb3+bcu{qX9w1Cw%J8{sQ~go4ZmjzDez8;9kW7Q zQFW8E-k&1(mNT_|LQ0gch<*Mxt2C<&-g){y;ewCp`O6A7X{N(hCKy$)=SpT8?sd7DTnB|D0#N7t}1S=D;~YjoLltt zQ$<>iB_AZ$`O3+Hub?*|0dvw0v@OjnkM3iu?3SsO4xU-wvJdzy4*XS;dR#Fo%$x352%@(? zv2j#mqULBO9&6ud^qQHrLm9>K$ne3rocGR_c%=y=PaKQRk`|u4@;I$of1y}e(u{J& zZ+u|zXu?>JU#s6fqgkPNv{CZC4-)DP!#mev!9gQ=t@F|u=uvEKiP`2ielWqw<%p9f z!*Q#HB8sE{H_c?KJU*&;@_58Y-)mtkoL&(VPZY_Q1VB2JX7fCE+`2vD^r?^ws{yA^ z$etz&JaHgmX_{8JQsFAk!zU$6vxZaij`uG?RaGQ`A|8{ZX)2k%Rq43(RC9f$5 z^A>B9`(QLq2k7w<0d1(qj$svXb-qhlS)4Xpnjez85O0L<)!KkHBr%LC%kNy<;&2o& z*@BNQ<)qHabgGRUz}^zZnvZY8Oh*L#6AOx|Nkvf^OgQdP^M*?mR5HylSYt zvD&cOnMAM{9nI2!}XNYu3-QKm~ zFi;%j68Q7uwQaVCHNL;vrNk113KK{Sq}PTd(QF<@><=~n^glk}{#MLKR|=_|w+279 zB`Pbos=Lo&c3Mb*FV_`6__k$`N(!1&Vs#DzIi+siFZp+WyTQ)BNKYSqr%rE(L_Z?B zY8V?{zAPB@;WvJ>&7Hd=noYxni#4)TVg+QeCq{{W-|^tVi2v}%(;Oa@ynL1M(MJ;u z2Ibh^EMJ0A2(EJ6y*uI$e!opUfuH_t$oIZmBTq~8_=^%(5m-Z>Rou8;@N4f|7N+3m zUln|C4X8Y-a!`S<i7AA5a0=xW-BHL<8eyzru8~nW#aH{YoNw)u=<%EC4IW3o3}ix8 zhDMmvb{U@>uW)*N#mjvtMUUQ7`Who5x!&7~WqrVUHqVLhfQ}gocrG6=l+tWh9p<7Q z#we~fU-2lLBg-OA){e*s#{#zkXXv|xN!z6z=N$Wrzj}R&wW&iUYXzyZ7$rY5%R~dz z8kQOv_YNlb`Q{Xt7e-jEaHSloT4@FYBPNns#^glFSI=vVoagksXPC*usjNgszVU&7 zXAN?vx%pUe-YQxx#V{3JRB$uRiATf$IR@=}i)hog%od++X$?d^imsN(zuAwmXyxrQAcm6WCQPi2{7 zV#4t3Sx&EC@q549W_nVS4uw*QBTW>_#y2e#t1AJIH{i~C#kZ~)(p(ysJz`1KT4Sx} z+n3@0_)E>t?`YBtesWvWPQ<;IW?+<%AA}pTK71YY)f~Sek(hJk_pLb$Ai&4-|sx)a^p3% zpyXU*pG<{gbAoj7C86U*+6FV=-RV7ky0gS~+F&*5Q+R`O3SSxG0FJVV_2U*-7Y4*3 zJU(tQDviV~ItzscXQ(BL2ip^bNaRPZ(*umu72YHQp({SXby!v9_u> z9*WI;=TM|DH`eCENU^o&`1*dq@^V1CZ8+?~QMcfzC%FeGx$#7i=HbJPqhrVQcj{;( zU+6DhT0zGE+Yc(1W;FA&puFR_2d@tl?V1+$w=#qpdPB>d$DY}C z$(dQlsMM@XIqv5Q;%^?9^Q#YDKlb6LnuS(L5I}ceIX#_Yl;szj6Rgd3nT}J2sU|QL z{W7E(m4p`hrD1tuKr704u-D;S^N@O&GR%eFJH|(R`ZVK;jX?)xd(1X+sZz0UR0M#c9T#Li>LNwV_9MpUi03Wf}5K$BM0Y~pd8Z>L7>=tt!dQcYUQ2c>N(BVj}_-v z6zvI3S_+Y&wBqIKic=>;dP6vOHstn$f%4ebP^(24qopcEE27wtG))Fx$~kdva%H|R#g2iY8CPueVpivJ(lG{T z19-3<)5|UIoyqYSqEOLDJo`P(sip+y1ffKoe*Qp~PM6PWMun!;lB;EJ2vd`av=sSZ z@5r;h;ka@sVsg?l9KqzI<>uX-%B!)39pcFHbR(nJbzE7iQI?84_p~Q1j~+?ns2NYj zL8Mta`kGRC{~O{o^~f7FC@pImMB~)=AYNwIWJxmT)S4I)zqX}H7)@#9QQnn z^O`*K)DuImTk_yh#idnCrwOA`MKe}3o0{W+XSyYlR}w4s4-_{a${u2Q8ipf7Gjc36 z;l@i%Yofw^!vf4-Ni_&=f>ip%a#hnBvdVCxlk?HpF3*l?Z1rPmksv^Oqliu-+h1d3 z;nfH$E>0bD>u83j{Wh_6C=JJDOl0IrrL>~d0ga&G+Qe%P$_Cr{1c?<`{>V3I*o@GQ z3mKInuoc%DuW-t+kyJ?LilApHIypk0^T28ZA{ z@0=;j^`}+@$C7Y0vx=%(Oid4RLHK zCE$L$1~aXSg-*q##gw^;k~sAI#_A#e-r64TEcMY!@#)Jc{$_KQ=f`zMrRC{ylh`;` z+dT>|&xbLJkqZfp8ygukv8~uGnrs&nTy4GPH>Mx6RdhfrautxNkW`0cIz$=8qkNu} zm=nn{J?fl}4>+ir6a)lXqBUb%(f0{o4VRgUMx0EJ8Tp90Sd2IOWu3^%vzXY5m!k;= zF6K(-VC;f3%+^v0r|FeKdW3$!NPPEm?WtaQ+*2NJKD3* zuEvcH;}23LNXGT0KF^M8e6=+}6ngqaKr0r3{tXIKI7<>ZzBRYYpbB}??~sI!VHGl) zjHG^K%xIR%O6^H&mxHp-*Zn18Q_*z^^&pq@c`Mg+rwm>zE;e6dt>;lbM-r3_iKy9v z(7JKHom`trWx3eeWhNeRe>jUa(63^ef!H-}kJp<_RdX(#0` z9Y$I)ECV{Vii`6jZg1B~D?=?pY?#vpc_kBfHD-OkbD>~i%5md~=*Oj3^is{-lp-5X zwpk^x`r0|m{imM&t~hyK?l_Xf5Xa+#7e!tuE?tZ{?t7kW6qrB`jm;MY?N0FKZp$e3 z%q>K`_pK(+pXKcCme^3Ejpo_2lvX>S(KJ*J^1`!vp+@E4@uQS5k`JRtrsJm@8F>M7 z^C3saj)ldLxw(*AcQW4GsiR0y7ILi=hFUbhQ%eDXg`a*^@?uAL-d}s)^3Fv~XF`!y zq9d=Z!0o4&qk+87xfANcTA9p@MV3y^;FRJx3%Ijg=iFRI6hP@L?OMt8r9L069CErd zVrx+2v#n|BVa2I-U*1Rc=DidhJq{dB8RDQ~CvUP})Vb2$rP7v}c!<}E=h+lBQ@%C6 z#J1vDF@@8b)%q?@8n2VhQoRXjElq8YWgNp4@je6ub&LSQjwzxdoBMyFPJ1?AOZlYw6TS|nW zx%r~Te7oYq)s)g}nMAcrw#&1gy`CY7<ymA25fH^T)I-Hs*po>>^CSY#q@N*VC0Dt&Et)d8VnV z#rlAqQNq@s!M)=tF1PoIZG~2zKsf>}A>ZJckNc!mz>Boaz(*{_T^cq=Yq48~rjmSD zWta~8^sAUh=`2su87?(;sRiZR@ZuLC$Yh-IYS?5qt8=-v z2jd${VhA+(;*I*ftIIAuF+u~hGKRMyCR#MP-i;dHHV-H~M+gXnmj)|qc+Jnl|#eZEU8 zaVTTnMkQLSX(gWLM+vPOJl>0$nQ)w$t0=r7iWFfev63iZTA%I&Y#kc*dYbdgA~BR` zlGvaFc`i`~uQacAJqJf%1H(IO5jK=BhcJ?11EsN%Ve?f*w=aohGqVAwPA8NV<2oZ@ zbCnV-&sfDTKI?LLSkh<)oV!q?EFlQY+nb*@YP`>Z*E=}}2PKWV9OTaZRpoRJ_`eTh@CQB!EZy?)=*V2s23XfVz5QJb^1 zJ(lAm6rNa>L`E>O%vn-rsk~w{ZF6U^#FKP}6Up(|E?H7Dl@xV4OX{TZ{ne<&i&2Yu zkn^B7gVB(L6^*dOXvLrk$SMgs`Fgj*?l9t`g9GZ3WCk>1PZS`~ePOB4ygZ8dc)iKo zM9Jfw7;P1`Si+*M)o(M4E3bLHr8($o!VtC&1<;OTXf!-w=&98_+Bya!#sBm_4^UdV z);3>f7^{h6(Nl*hp z7G551BlRa$=~z8i=l;C`Po894xLD)<{UH}GiH$SQE8Z*uvfME{AL4O9&9WqKi z#%l7+apP`EzgO|Ct1*X%C4c?%l#MNDHDRhLx|<(Y;WX+7 zT|WeN{uQxe; zI^oM-^oYlilHkcw$rh<9&*o;z!}~*)PsLogP~-E@r1`j3lbd!rk}CMJ@*M1!eEgFh ze={HO!F$QL2v$CqftDJp(a=#j&#Uc{pMP0$azXLoHON1DV~tTT8Y+e(jq{#Y zyP7*Yjt>^Uc|7E=Jb0CYB2&DxP%z)9Se?l^(aESP37pncC}*SpL{eP*Jeu)nIpj01FvN|9HZ_u5)gx zMm^5d515bpGQFvaKvz^wQ948672onNIp5!>^oGTx%X0l#bRFXejA&n_HP%x4EXg+ zL;m_flXHs&=TC^Pr0tkrREEMqUU_~e@civ9(T^^iQk+^c91S(YOiTp5L(d?EQ*ks1SU*ho_Q^y3 zp9ixzWvEAvk526IaKFKqdowK8yY!2YXM+jyQgdy37wtvYESx5DnzWF`Tu~jggSh|z zAOJ~3K~yPTWNrTX;4CehGGSAmjHWTlV^xI$hE>3*l5FG6w8O35JU?Ez#bMQ8=p?7a zYN?P)UBJ)QS);l+k2BdJFfHXr9-xd2}2*! zh#X-E&Db&D&S=+Do*l+KJxEyWr2N*E0Tr4k(gdMKTQMkA$fUgfD&W;uS$UQ|NlEwB`CRX{(^9TQ6jyV2h z9&i}S&`=Z}t6^`iV0$a0*)l9GTGlSb_^Kiv-)^h2A{$9g_s*^ib88no|M+(Unh97_ z5h+J#E2>hFrwW5(^R*|oj)|6Mm}$aT2#bHagV%$xp2MNxx6kJM+JzxMe-IK_#rZi2 z-}cp*;Vs3T_G~}k53X+W>!%L*{CSI3?3kMzGDwvKSw{|6d194Oc}*+G`QF?se!e}A zSDLdEM~n*n7T$BtVX4^95`J^~3E!J~&h73Tu`OAQyE2Wwg~;U4-Y;s*ltVt6dd|(> z0!|rLn}_6BS@`KU1(CvZZe@r3@Z=`zy(v-`aAC3wM&p$kXN^ki-m`9lAFsXQ%6y-@ z`xBh4=S($nQWu~DgE1a&JoOl!A13^lzkN*MHOFbd+KTjA6^sMQwSO2@#DWQ zV0z&tXe2A8ZW|+qei&Om{ygV*f7C=9;djqpj48_TLO_X(;1JAbZa!jWE&>m0*BThB z$Jm&#yG1G2v0FF${Ad5gG9G9)4GT*#-g%-}7Fb2$DRPG~iu-r_+_(_~{bRJzW*_ZVN% zFG8M)9=ewQfw8NCE6Wch<`06SLuQpI& zxP3gw#fd|n)Az^Yv&5?zX-T+8U}?PKVOPUY2w&$ z&{I5r?f9J^#H^fh%r96@oeUTi;;yS0V{pds@KMIxT*$9~zs{fk#WAbr5`sVmfH!=u zM-hdF$B#!uiQ&ip(E>mF$swJokm(r-*N0zr@I|p^`&CB0QSndy(SXh*9eKogYo|$tPXrXAI}gMWmw&b<0jZS`Wb@i?V9KQrLVmo1(jCtRI5qAb)nV8Wq%z|e(6 zfoQ4MXAW3DYH`08aJF$sQH`}_CEr*(c~j^BV>#12;%;}At-Q@z>-Ae;9zbi&VJf<& zwQ#+&!_(m;cY5<&Xv-JK>Yu3(`frJj}6cxNz9bDUa&z_HkI+$1kT)5PbMP4PrG7Oah$F=)x9krBCYp-M8N4^xP$Y&g9*1-$6sPB5zi&9~OY~u03U4kU z=bFvelFzVqDPpo?dGw;-<+fvCNsn`lL0L^zYQFwzNDx`hU#L-3LgsA0E}362+!3)!Vc)rNuq=i_g1MrRVZmlcEsvVQVXAq7#tkj7up+ zPP>0^$Z%M3WlcEYFfjB7;+QLP(DF$nG@j3Hj2QGQzI7#}bRxOE+;yColbenjADGG; zKDi6Ngl}K2XvDH~PBY$;4Zlk2{X40Kw?>c>nl;G1XqeYmaq zxVlnt<#ff(XCaw0#IeF-2tv8Cby~87P+IfOMZ>Foc)15j&Ek~ChMK`hCe%j5(jO|$ zos%S{`|CMTEYRtjNpx?oVrn{MG<2LinXt56P=~LJ+;!{ z@#7I&TY?zng=~hi5{|nSySq7!R>0hR!eHpQ@$~@jHO`5Q62^vlJz!=gq&*o>YZ(6U zKc8c6KH{sdN0O9g3~v1YFPvmNS6&gumMa%S9zKWtBQN3FR`kLoR>X)caEWpS!@iLh;j~!I(?tul%X8|Ypr6pY_X9} zb9UmGLJR3r_<+8P<#S*pZV;n+(3@tt)n}#EBl98i^^}7mK^u)VqPf>%&-!tjz`~^& zSvuEaNgf-P0YNB}QZ0tc1IT!{6flwxKEL-`T8zGlYd#p!R78QK{X^$+2E7uwrYshm&qh%S4JSZs>(1Au7&8-JHL1_5)`w2Rb{Y#^61QWC3 z7`0YROux7o{%lPQkueB-d)K!J6CaI zvrbxB;t)!t;-;Pm>*2Mb)RxP01KPEck2h!O<`H24-e~$oNF%CXjNTMjE>0bDrrqOy zcZ%Ex#DS+!mfQ!lq5^L%+G;9oInz33HW_i_c!8cv2txU`?Ye|!RDv}at0)LKGtuQj z=aBXO6hjwMi#%Rw235plP5kg$D^dbx8yU;(5nt|1v6sd~ArxNnB9dtQcT++We6-pp z3gGLP(spXCrZ?6ZgHYa>L2l@@6c?90U#?qT?1~LnSbdcJ}8GF_X% zP*sYm(&QDO3}4?IGCLQ6GE7g0%r3;-x+5iQUQ3OV^Mc@D#v$3EX6-`2lb4Fk*Pc&r zd%m~_pWM~_)mNH-`E$cR|Eqvc?n%)07mow}_m6A*%P;Hv)twrjK2G>zBjK~BH8%D` z9_=PvKbaB7P$`QIBqPHsF|BxIi6ht=*4a&K!oNnIxkkawgJ}t)S4KAY+7O4HjX?*e zG#4iiDF~=Xj=B1XmsyKAa42m^LdQ{+@G_m?^2FX4X%tLtGD&$|GzkL9vvt~VuQ$VT zv(HSDQ7EyVPu27B6l+mND2Dq-9gJ37nC??x@mkY}MLIdmBf;!q*y=^R=tjJADizzi zlHsM1ICclYc=FS{JP7#WalnOT&(wrskjd}n4S~}g2|W-5np^7*9caG$tq5Zcg&R95 zYto9HfNFm|fa%yz`Zqpfhf{oFF&ajY(ueEOu$b}y3U3QCZc@${#R zCUqgFCo|qZdCW$)K{t=6g`QFw+O_iSYqixB1S~d2oS*D*zdOxdUMI8?NdA~&&2#HzP58&sVyvQ`h(2tsBCiY+ z4Y+;|HeMT^?Z^}{%r%|1JeY3$COR}%FNC~&?YVhhxZIt6PiHEia>6iHXhtJAb0$F< z&E2~r;>2*UUlB)!AQEx}6lp3G#Qaji-8+4XLf*@r*Ev%&F?k_Z-Mo;AY4v=Q&F3R_ zcXMoD7^RL^FEf@-*2r_l*DBA-xdvqkj~|aPp&4H%Ezh23I26mLVzNR)*cav_X69mU zjUy#(Bxq1ps<+8o+6Zi4IK};^j@?7C0BfUIn$x^@N%O;R!;ik}SX*)Y&Ic90{eH=} z&Xt^)5xnnc6tL3`xxW=lYFi}NPXC6}b%wwQ0~`gOt$xDJFyZ<_7p*m^3pg`1z#7Fy ze}W{GV3;`YJn6Nml;zUoF%<#Y3KxE=*<(9vk*Sa<^z0XPHb)&Ubq+9rqEb@eSZT|A zJ!Ll+DXdh6JIAw}Yz~;N7vw4!Tf@ybcC}(ZPiRDrdxw)~4dCf;Ao@hUjl33>1I*g`qxCLe z!xpETy|-_UR+3Yj6Ofpa$tY#LH_4sj8HQEJ*;bcISwW}9JZ^!J49>XZ{?QcuBIL!O z$zn5=q$Xp~N^H9&0b%HwZrp!$?-Mri;Wt+%&^zD ztjvq1sEo)8B?e;*i}RWXFEl%ciq}V)cP?3MAndLU4JI@Mk!5KqVD~^uFZT~U=guXx zCM+s2SZig{Wyx2@>wE_+g3T&WQS#6B7naBCC6->`Y?CloxdL^^-F~gDL$s@tdloIV9 zC7f@2Lc+HnJPB2!9I$biu-%Qg zHs2qIw#aknyrL85JUVJIo#Zsbf+xollo&2`j>giMaK%eZP-Gy_}%6Y}nh^c4JRan(eBCQ{u3^ zyf{P|LlOnzNRh^(C`lrCvD?962+HuuiJUkQw^$O(O+pz%mMLz%Oc@o1&2hv>=N#4w zWIeK)S{X_&CX(w9#XxcY8FadalS>hKDIu6>*^`vDj2Q1es2NRQb4%>MacbN6c=HZ0 zUez$31RmU<(A2Q9QgG_rlys=I0DgRs0xdIL#nZL;uF8%i%ZzmFv6M_7?Mmdoki}1#jscNlOMgIsyxS* zI!wlnPFKP)vyOQCv&?Y(WS3iC@8RxG7!4i0sfb=b!quKA2^b}tc@;cMOPRn?9#`z_ zdIACmx^c54jo{;}DT7Yn^BXm%mJDCqb(}b$nCZziE+BbxolLd3M5K!aUhQfguS6VQ z^sH<-K3J+4E(C7Ahj4Q*-QICf^GbE;AslUfo-N7nPY8+O3ipG*V(X2ih4)_<# zC%HVk$wocmZG=y1y+md?iwl~aD&>!#9OC@^9v>gv=GkzHGzxSQan=>iw&y?M=g$Wm znyI*aIOqSlpU};a<)t$ewZTM+jd8?3{b`3Rf%C^aUq6F1QS`dVH&4}!=R z&lwIa!Y^)mIvr6paelWsDB8iM*MOk?ANkh{F zwl^!DJREZKTEdZ|8EY#!#wt3QJbbFE)$%r;s`PyM#V%zLxcXs_Cr?V^NQ47%EYh@m z+)&q^-Cf6**9!K{Yfc?E+<&Cxp_mD4W0D8PlYn=MXDgbgTkx&p>bKJJ{@TK;6jY_+ z%pv$>$@AV)!~B$^uB1>}9ChtQO4K-ZM~eUP&t~}GSk9G$W2TatruHPdA$Wlj*EK{m zd~0osKfbq*v-2ZP&FnFomf}v)4Jt^WUfn2E@T`whzI?O5LN?*dV4FcKnPQO^jYQ)W zjn^m@`2C~L`6o|Kae01=v(r0tVkZkgBicWSBoepKPglqM^3^<-_U&+bZp>`A!C^>Z zdEmI#x*X6*iNdXYn=_r@@5tL$M%W?Zo$;neGNvfFSvV3!1OcQzG zIe4VQo6UyXH%A;gk})$EGoA!GU6IZ;4NNAE?o^Dnn%g&anVw6?I)TVAhHsuOc)nq|`>M;zw&Bn2^|`j(=hEVkt+A!kHW4Cu z4CJ+@suUZOh(CR@$aGS3X?~mM!#@3}76O)bXyu8u!z(C!%&nb$eDBapA`2xkN;|xU zafrx+%;s}v`Fd*~`@1=FS;g3;bRtQc9=V7~WAPX^ij)_7T@FnZoSK_3axs|+B+64b z!?=;AAg>J%H#>|f3%X&uh)ENLae>Up!f`Mqn)Kxz!~7ud-~8R2C=ofIjT9!fG(k}Z zQ7}AORwNm`SPT3Ye=if-UL*<#jGRqnM2&OfP6^uZM?ajU(~}voF>-VAD5^@9h`YOv zr%!T5W5=0ueLntlmZ}m(ld+--s4CIB7rEovlQDb4h9CUF0p|Cm5Q1objVMN%S|pC+ zQNxpmBaWZ!ar#`J`Gr{AjFC9e2!W`s#DEZ} zDrvw*dky#R<&;(6Km6N0rh8z#BQhRqJfU_pl_RoZ%(!{qkvx(GUL61CG>YF)cmqvk z`0Rq=uYctD#chMpfu;SPve4k^ry*eCq8qbr=7+2QN0c`nawv(PCiyhZDPQVz7l^&A=G%yeG!(ZMZlZ_Y5& zo3PMpD19U_pcYipO&V^!&iKR2JDgc8`Fgd-xq~(P243FRDpC!~$TjHHA;)L$IfkWS zbxU*klx&Zk(nM{VfK3c)TVj zcv*AyT({-!27+plfJ$b$bNdpmT%G30qY1}Pbm?>>>RJx8~bjvVW7 z@lp@(J)>bwQ#o8Cud5qL2I%%I#wZ>Q4VneT|8RnvHFjiC57Vi~D<{D1Sm;BQ&20Yo!`0&^SZDdC8 z2_&(j6E`Hv(T^)4)o^RAhvzkidJ{f9^oHQY(ykCSeTK2*L|}h zTSSWrA+~ZRZ#{t|HGKb5!;ijj?AvE)g2gFOEi^$h+cUh`4m^2L^YJHBEbOnC6maxJ z%48xeg%AXkG}Sfi>^R=Msd@jS8REo}q=uQ#l>SaRS|GCt#DrRdT5Cv#ca>> z>FJz1%L#d@S(?j*K-6dgjs}l!H?ju@HIW%|^VNXqNyh1!J*q}aG0_l=7h$-8ZW1^* zH{|ZtfHFj!7z`<$k(liucGIn@LmCAZdKFirEgtO-C@48Hm*!mJ{GwB zLi5W9noFl;F%0 zc=BY-`3pVf7h-}FMuyhn;7Ag9@;K*@{z!5De9Dd66E0r42LJ#7AOJ~3K~$ZWZMkp2 zx1)(s0ac?VHMR`gc<6cWv|+dx*cprTX{HM|9#|G<9Y^*lDsLE7(%~zkK`5bU6L`K6 zaq&>WfBpNfSenZ@H9w&&0tAnDo~Dr-)TB^+^>V<$>6~vLea@dg+$R#m&_*VCAy`E; zJQ>cgGR$~yeuJr`;l{=+OVbl3-b%=3kaXWi!w$>C9%p8ES?uQA+L>pw>C%gxNb;Oq zV|R*(`&$FfEeK+?43_0_j}u8w=_A09MuAs52{&F%aqd9D!oZQnV%QkhlB|Lg4#TLB zqI>dC;MgMESy8;+HSAk}#)-7hMq;@5@*Z?MnoFl6*0vP=KKND_jcz4qndQZ*lJ-F#MVi&+f;X>A zPG6j6FcT9cIon$`i-&0whGn-CCx(~L#;mUwoH*Sl$sz)pqVUwU6hPhD$s?6Wh*HI! z2PNCPaQU<)NgbX*Rr3!0`RgXV|3+2ATc|`?3!x`ykyQN772&J?_>O2&<3tgZ!A6pE z6R=^-Hdah3!q+I=Y zn&s7s^$kayigQmHfjy@kD}3F|a^lPsPalsNjXiN{@j>Q(!@Y)XKccRo(~r1xb&lQL zhP73>f_jlTQsfQ~#F_jZr_K*pTP?VMXAf;;%+Yw!a4s*Gbb2v$qnH{*99`;h=hldw zT~FC4hGPMwOmf&8!i(n>r_Xhmo{5;>mvHNDiPyT_C~K0;P*kldrq-M|9uX&++mGe^ zO$w33-F_zOkTb`Gu4SzJTXowRa8QOMRjlsDtnJ2}Jm9!;tmOWBhutD(+(e9>r#4YU;& zEzE|>8TwsX1f#)W`S?`9(FMoPo(@93Cqc89qQr3H z5fqi;+CznnHK&hBk~3PQhU4mOLm+I7m7SQ?-Ixzf)OZZjy};o)$DLOlIvHT(^>wh^ zS?_ahf6jDYngX=p@opPf48 z%Hkf*SkV((MK5XCDO0SGaK@*5Q{35_;o{<$ZW?e{l-BgJz{o`eZRn)1K2CYL*WrU> z6FQ0L%at*7Q`jrz|C2=VbR*{3M$G%C95VxfNabTPdeHJ=M6qD3CeIyJ z112_%N1m@f-y%*87vGx^B}OA7jWn|qMWA+~O4`_H_~kE0>|ac{@_wJ%LF45i+v!?) zs3^I0ZtVuH-L09Qk2!NHCa*LO`T2CRHrD>%rtrRXt>NVwTYI^Vc&#Za!_q;xaw>5B zSPF&21xq_<) zhdkJtVlD5qg<6v(;w%%6n-t&Eb7M};j``*5d6vgLtkD!MB96doi_#)|FNrxZm$T4o z_{s7DTkU}_oTZxy2uJS1QjE_ZEVy{6lhDl}U^o+1|pTYG99vxXmg~CLV66}>&E|b*q(MLUY_5zQd)WnHl zIPzp2OVfxWtEwfB?9{nFt1BfhUgT(NnB<;rKc*_>;FhJ}`c9r3u(et7?9m8gHKUOu zNiELF>)t|hj-48?yIryRJjceC?ahkbRE+oPT~vFXdk!A$5oebBclXe-VP~hoHPG$F z!f6O{?MpkBBgchoHX3_u+|K(p8;%^!C<=KsyjW)xPV|pErJ$q z#l^D`Nox4=o+nN;m(R%gQO4kddDkI#GlA?ZZ$+%^M7)2pX|1oC%3DtCuX!_$+0J9q zSd=L@*7}@TEE#k~(kP}LVJ!z`*se0N6mD%y)6G0*7A92fLs(2ehPiITMv;-m@O(JM zR+({Wafnlvz_0ALy)-atBCR|#Z=KK0qN(BC5;u&wmLlD&A4(T zmm6D%grk6@mkg_jG*vu!ov<~D_}0Z*ShLQy4ltSdPD&{_Hy#`AJXc&iZRvJ3<4V8N zk{jDfAcJOOJMgnF3g#DM&RytI)gqztL6&Dp$F|mPLtX^#-WhZJgqR}oT#%hUD5^S0 zDoHM*q@A6HYoBk?n~FJbxJ#aUIpba=XxeJZ(gT|HR|U7PZ?kx)!{MbqW!WlGTDh8y z<)){N=FNJ^lgA@Yo*!`VaF@|Yf_Ht(uI}_AMk7a*Sk~4mo<1p9I@w`if6646_jO+M z%8k?P>;-IWc<`j=>$?r-&ZZnY8ZoKlXYZA!4sz?q>)*<~_HUl?%0dvM6mxTiv?CB2 zgABJr4GXjIho3rbJ=Q!~j~JEG$@Y3R+6J_DD6jC1;mBOW;h7O%K27*~wa?ZhqLV@| zQ`AlSjPL>HGzXHJ+3p@+E>AJ4BF4^gbhgAQMH*xvj{@&Chm(rw&Ng>9rg%A0^i$7V z*Gcdkz74c=_@Ftrf5OqZntN~hpbfiaOdKovnJ2WM5@p0%dVF8a>;Uepb+A?h=KE)Y zq!L@&>y*M_ICUg2Jrj8L#92q&9UXpNb&L6lHd$ZDI(**DH0X<@I=YWt(57W=jm3$)ujo8w4tsvY3v9doC_o- zaALk-W0EqdBlb@Gd_Ad|;`Ap+OTFF$~n+(CtUWspH0-iiL%k zEAMxinTshZMW-h-Zr`$wv!0oY z=P%EYq_T|7x-#fj1dLTgsbh1a=I*T_1kWemp2KP(lyzc_#uI`k%@lb#VLS;uebJyJ z&G)}Ih4PNz8hVjJc?Hgq#ERKDi&5>@^&2X$`gi~CfBFB}8HWHi3Ov5oaOe0Hhg{iPb$c+$v|MGoyf<3iAHWd*-{*5Sr-#vfeV z;qY`p@PRCHq_)9(#kiEz*~Y`qo=x*~tHbY}S!Xt@FglP~M`j(3SFL_lk{do>o&n&} zzCC6-%{#VkVgi-ZcaQIU zf06E#*g~_+Vj>Bk%yUNoZhf`M=6b=mzIRYidsc}pSu4uiQI(>3TzxTOXS3kY@jm+w zNI^_HmN?Q>rK8Ln0`TnN9*-+u(46{XMeWK{EXpm{9c#)_jB@zrQd zwZ>6Yig78j#_fsa=g+4&JSe!de~2c~i5fENDV<_eN+QVWUdrv)efITA&dd$p#jbZF zhYv8SB5E%f&;Rq@B8&Zs-#NC0QqYM5-PBWi&8V_Cuh=eP{@K^_d~kHkN5{r!Ei8sC z2~>??Sc(DS$$HHH{dLBrV-4RpSCK@TG?USS3z}gro$Tvf&CN$J=xeTCkfNNVf)@2b zG0bJ@RMd*U_-W2?&l@=rF1BF)F2&N4L}p_C@hM6y=o zPL{w9c6V$3{Qp{IW+CPMPv*(G5k@P4|3{j-_LPOgc^L22Jh{I^0M1{TC2o1rNh154 zs*>~S8qauG^Z8%CX5WE~%OB1OBr6h~xzUQUY^Vzd3O3&q{PG(Ujf}@k;NIOazxeqc?_KF|No&C&6zg4_ge5*eE&!MbkLSTvJx?hjS90^Z1qJ!coV;S&s&i*10oP1vBwIkv?@uO@iNB1xYp z8c$wpe1P}-kS|xK88$J~%CpcH1X3D#;z;1lWuuw%j>EI-{PCT6UhZ}{JU3*f>rh(J zO~6`D(Lmu0^8?4s)R_PEFQ<6A8T0X}ie9E#Yo+{JG^!=IDZYC(@TZ>}RyP&zpVxFc z0>9~WEj^^DmW}4>dzK&lv|u<^%rKUx<5L)! z#L&rv=i4b8%F=OWHf7^Y#nwi}#zsR`HlmDBf#AKQ9M_Jz@F`eTbn{F#a~(4X09iC&`#U}Z)!z1bBrp(t=B1w zgPQN28wXUXXb?M(B?UK~c8*HPr;?wUR(CgM$~uWvm@LW5w;2lz;!j4ZeJy^ZOUK%_fd?Gn}o;HC)mb_b=6)&ES`P={TX&&6(;l#OVre_n8 zpV4x8Lm*BJ>#Gv5`oXsr`O80j$=NG&oH#p8*`i8mQ4LY7S$RGpP7D`5nCH*`a8HA<0t!&Fak`~V~! z`00a`Bm3a|u|VD!d?U-mrW8A)v5LXKa_o@e`a?LD!=Z!HNjPPomZI9}8BDA>csS$Q z*99}Hp3`T$l$FS|yoV^2jqTKQ%%P)QZrvENHwqj)BFhNx!4ulTs+pck>GUEV-Q8v3 zfMd25lzZR0*J@d~4Q4a4uH*jAZT21PGMG(iYDWmFh2{wGDDA{_`i`%Dw$8z0J?0iN zn!0(*D8adawwnEiy6kQh+`F~I(GxuegNUMbZK`cxGI8t;8_r#t!Zn_oUk^EUJY#lF z=6j|E)Z55ntmrm>_($_>Z&iGLt>nFnvBVJtu!*JLlP<|CVKzsR;?Zi&>vhfF`#r@k zZ@>M0`JmPgyi=scv9hgsu$*w=P)TY7_t#?HjAIO5x^L%+jb~*q=FUpYiTQ%Xe#6%* zn!PF^X+h`S2NL6Xx)X7Ky~DYEV`iqLV^>Bq_Ay0}&Ofo9=X)7Xw>n%{9Mg>(qDZm= z$4yKVr0`}bJl&3YzMXRQSkADplG1?1)v_E^T9R*Xt;VcuM|^yy;qhyOeWRH)RvHbh z(Z&)dn$PbUUhir?x@fV9rrYr}O0%0w_v*DK?HC@ta6DP|oLEZf&qVF@->^4?Nzoc3 z6xc}f@Xnakm5MVLrkGnui8C2}MI%q$w2S$+fw_Nohw-rC#Mx;&y@;~(Y;Bdq?E^mq z-UaABd$dEDdybu%#zbvMtXGVN4NWaiJ8gxNuyS_?R|k%rp29hg)|$ErjE4;Ykr%|V zMuotmYny}+xb*%ETN?#&YAEV}ubp^U@FcOK89RRY^F4Zf!^Mj|wzn$QR!cUvJj%Ch z9-xzG*47>O?&cg?G@LyXv9sx5`(j)l}A+AkFEs*7LW$9%SY2WWEesERha6i5sYKoqw;d*unX5-YI5yIZ3r(C_zWM1C+8S=(%5lh6*|#MBUO&QENujv( z!3?93(cN9N)_`hdIfhOz7JGJLIecQk%CjLW z&xdGh@F7USPvrgTCeRxs96K|^o3)%buX0ReaZdQdlW~JhM9wytOF4CZhSld2c6Vx` zERyutmLlaEKpC=b#IaL-9^N1G;(38h+J4lFT4c z5o8%Do!asStZpbSpR-I)i&lDdM~ZXcEgxC&_;tjM7cm!)dj@^6t9n|1QLB~hbrsur z#N&;WPfivbniX_uFAI#Dh$xojRyS3wjWS;DcKGn5yytBF&^jny76b}~L(D#UIbDQ5dl&Z7~SQk)oWuO#f25#PSp z(CY{jduB?CBFYfQ0&=?cNbJ6U^%G0h)#Rnb=vc`{!o-#+v0S@dv-~>n;ngnFvk|q^ zOihV=FDO~0X)E~8uYS2lQNTx^&e7>c6eVPxh|ySd%r3~ets8i7cMs>_^u<}x!`Fc* zH8>|V#s@HwxG(SD+9uCEM^8_SlE%sV#;FlhV-TrWk$djl*uqAZ6BlO0)Pkndj|EX0 zF|)S^k9pR;^$IbwNTy16JZ z7;9yNsui770`n>_lCw)E;pTG8gIBQ(x~-;YBx*W(t9A93L-UUJj+Z>$%6PolA&KQf z(I|s4A`KGlt>w&tiVu%ZxVzqCZIqFv8r8;~pr!DL!7)GQgLvf;@TqtMkj5S+PE~t z?e|r+4yX4orzDx-tJ^h`LSqsU_8Vi!3)#2kC7d|fCFw+b`NfdYB%rLJuBBkw*izO) z<6k;GMOg)IUE9GqF-6q1T-i({o_8MkFF6 z*rSY+2Xh%nI}smzV~$DgdG;j7MiGry1Z{b>*08WYK^sk8!2W|N3;SZ>0<`Sj-I2^x zlhm-X4y)_%-i4T;EFR6lMa}Alh~u3$q^aZ;LNQ?g03ZNKL_t)EjY`9JKk)Q=s)c^b z5@yl}=Q&CYHR_mm@6V%XkVar!Ykqvwkaf(vC@GYHeYBMawuvoyrTFSrjg2i=u5=`Lvw52i zEV~Bh6;Wa-3b=D;%*=umrm7OAN>Bp2nM^z`NMRoi9k;G+)9J>XI6EUuktVe1%bK$A zQp_XE#(Kfs8=EXFc3C<*Oav|2pb}=1#K#_sDJB@SDKEhhEdthmXxM+VvhLqYDBMR`204MPOO@> z*O*w06Bxs!F?2J{ci;CE&hn!>sYL0#jcAUH=xvRmauG9q_~dlSn{mt+&->U&3f*>Y zTOhP(IdgC6cLJA>7ChYSaO+i{G!qT)ZV};ByWufnzSuu-e7IDwvX^oDRhKBz3@gi| zj^rt3WK=M2B985IeDhq*!`BIq*OPa)%PbR3@LLFa*=UvyYtAkiesNdva7BxYrjhQu zY2n!pL*)(U&Zg{NjQQev$=bRj?M8IEhT%B8>nJ7#99`;g?&1^=?@!p~59Zzp;t1eq9SW5u5kBqJMsd z$^{-j7^00~GIm6j@J{+Kt0<3|kJBhAiONLlxmE#t~?Z0DN2gsopB4S^ zq}J?=<)Obj(cFA$c>lcN%#xAiGn!y5d$}YlbbAr6HUhu6UbC=2=G?hV)D}Uvk}~;> ziV?^1?0L!cYa@;<^*MB;EAF#aQs$f@N-d+2!&t-W%bXWaN1VPm%f5qM#uEXWdoM1e7wh-S2;&cPScxC$R`fxXtlh7@lejRHij2Z_gH;C;=s`zgH&tEDrU1Uj9V#(M&qy3zCo5$7*O+`ctrQYsoJ zMKn$=wR5N-hhT1h2b)-)J{&T)KclGw&WUc<2brB!m1p1K9@=W2KiZ|!kEtvFZdT{p zbav+g2bTsU>l0qDjHn7vRfz=6Sl!NQ%X{X&&C)<<+YS?*hGkOn;D26*X}bFiPgGN0&0P zOmpkrgsO(MH-VyntM6x6a0|Z~?}p z;lb;KUN>;*a7kGyR8ZjL1DHgCacyaW=I-k*^MkZvAxIj64_GZJ#N*oXWUI^B z12xBHOA2R5j4Xq-mQ;h%iM6JSoKXUR*4O*9XmJJz@1JHOMD>w6_llWA?g z##;96PkHdL;Nhc!@i_4QM>E(q;lV^!Huqj(6EPW$Ms~(Iqpky|FU{c`G>te}3DP$yBMaC?|8PI9kqCBeWqz)WqH>P1 zkSMF|jUm$u8T$`)s7sFz@>;E=D0ZeaCel26I3!9m3kSO#IF#WUhgKRJf!4xLMtde> z$JTbk=y}cl#f)P|W9qWOn6`<;lf?46x?Sr1|EH4$d4sYF+`Ln=L z2O%Z>Z~v-c^>yH@Gg`pU#tLghsk z*GXY@$MVmGv9P$0D9&Ljp{w87xHdax# zp`5+0;V0KU|MF)w|JmP-7!?i`fw2x7LokY>u5n&KBe(D5{OHeic<<^ICbBe65hu1K zYPGQCG~&x&Z1MFkw}{h7Iw~)gVQn;J3xV$RBCh{@oyYffIB=}b?oN$D?6g`ds#4@y zIx>9qlQlNh#=Lm6OPt8HIEv%|*DW9?pETU~`78Fe3w#^;mu8kE6Y+YH*LV+Gug9#f zjG3BA*j&$vtRn4Nv3iz{d?I@8H>(rgyqa*}aF@GZZxO{3!IC7JV$x6)4Rz^w`FzZ1 z*l_e%#-sZql33B{iZrUs8z#9ZV;()qxqT<+*^7!Zry{<-spupy)dk;ph9gH=c;0M! z9>4GmdT{!P;)^@~FKKVqV_BA-=RIq!J)HT(oRN{4k@Gy&)H7R6niNH;ZRx_Y;0wWq z;S0n6!oR?-E=^|qW~oW1W(hsZAd!<%R)|i0X}``t{pc9aQ@q^sB+0@_aBOZBNuhbR zS!a+Ke*E5$C^x*?mMEgaYLY@)2fKZb&)$Uif#!#IGj@B1gGf^gG+8OHqqO1GhURBq zi-hXo4a3Tg!UVz_NeV@rIkZ>u=y}1fzR38KKWuX4N{!{U0*u8AMFy2-imZUVNa^<- zfBENoeCPWUJp6Est?d+eXWtdX>pLs?;;R9l|8kf758?c!7Mts%Djiub=8$_I&0;1s>u>w`f#4yFToTKz zbtG}Y=1QN@AmiqPDT2VT_NKbl)7V1pfg&#ne9h{cK40#{{Lw$TNS-;?mPZ7E!WdaY zwzQSX#`5yTkiFfMAN}DJN#a;oh^g1W)AD*{VZoK`?H0ccy!?ip_dmGtRzpeB%<;wJ zgz0t3eQMMcjhZ7%EKwvswBIjTToa-BFTR$EUp;U%LPgEj#IYqxB$@W84=>j|l3B&y zJ*|l$BCs?=hi3%-9VKE>UEMP*?gn_;@$s7$?YgBN$al?mM5*W!tyLTh4J$_hp@E+- zO8!+n;4}NF`9)u;ehDYfNMzLs_3#-^zPdPd+Sa=l?Cj#%O zH+{m;FpA`}Eeer{jfN%5ivxNmIi4?}fyUR2h6QO-lBJf7)d5Ld@aFk3jdp+^Xle}~ zr63v=6nRNJD%e>Yl4T`}PY>}!Ll}D08lG@yqnxsE#KWBZ?GY2x4d$;)6Wx)U|7+@63+4ittO>l}G1I^C(6I=#P3xp1|^#VhS9qFc0+wy@+`iB{0= z`aJpagj;vJOwaiEo;*BjHH9rovb4Zx$MlTP@=C^yn>D`wZ2^vlzN6+l%1Tsk3(MX? z!S;dWTlY2ht|^qY)O}0fNh>9Z9g32%Rma*M{ODoH#Tj{$)&q;DCC4jHCE9(E2)p2q z?!`=ZN}O}leZdJP8Is809BW547I#B_zSv>BDaFEAy+j)rB!*F{i8IY0F}&Wb(_GNB z>z2TSPP2l;#}W(G8%bjF;}u2e47HjVPC6|`Rw@ROCdn1sNAl-K3lQa!&eCW=v+0O4 zOMe7uW?9`VIX-bbdXjN)BI*l2G}P+_XiZ${$K%w|J1N=OPWkG~9&sWSsP9V_8A=mJ zC2?ZOQ_Jpl%y3xn;_(rO2MJm$Jl_aA#6cPrRjbQ!up2Wt$$0hTfbK-?^xCjyB&E7q z(?wn~>}8~B$=g>)G`j)1GFt?pN0F6enef5WxFCrNw)z9Ch25EYH5-yPp|y~u1zB3+ zO2_8vkb|9=$Di%d=?0bINCF0myd+Hu@>I+e{a(&!Q1IDrj%jy1JR=mhT1}BA1z95R zzm<}va+K8kR!Cp-O5W}mc8@hPoq~V$ zaf|=vM?E1sRWb7KYI)B%UTg&PB7@TK$zp^5{*R7M5r{@h^Iug*7gVNNsOEY)ztX+C-3ab{BSa$R#~QuF->il~s`g!Tk{t~}|XJzKOin})?z%k^tD zu3inK8Zk0mF04j*9$5~LA4jx10SAW#${61NXpE@xua~YGg2a{=PfnPaZt&>S11??f za_hmQxMZ}Zv~qp_BxiZygz=dMkAA()`#+dt@=Svwcaq;_9a^2wJe<84RHw+sg*_pU*f$eJ|H z;z~<1DEaEOq$7+qY$K%S5Z-(o{j=#ByBPjc(g4F|$ z|La$E{_*!RHjaGWyJndhSEoJL+(~lCC(kvXzl1;jfegMsyysDG$QpIVke8aUVfge> z&M;M+ITLVrVtMdhOOF4ALMf4M<)y6em6e3o3o-MTnv9~7%h%iZfxv1|THrT@!}uPr zo}RF`6LaB8hoggpYj-AuBT@BK%hFZX8b0~kb;6p**i@aes8kG2V#Pq6R z;o2BV3*6@HdB=F_RXo!Fz}N2_t~n>(X6<<-nb-)2iDDEhN^N-c*0QnVcz7>lYRaS4QX*>4 zHA$)IrxLYemB*tu9&dI$Zq6${yy-}CO)vH-lt)r}3^P$06c~Q-vccL>$a_}{S`D%0 zn!u1cpUfIYxlihR2AR)aKkpC~KHs~U(yj|>A1$wyT908agO20a<5vq!w6A&pT0y-o z*2_{!dT?Sr2B}Ah#~?9$y5KW4skw7i(`iZHSYlZWQSQ-?h1Pb^Q~c_YMB?1NQ)gzz zXZOfbI_aB5DGVZ^tgUZk{PLFrCZ}p#xzQrap)=+ar;w%+r;?Y7qX zg|3tuX=bY^m4dQ_{hfrB#U5wo+l)=tMK-3SFP5ey@klDz?TsP(TQPH&yVP2u7Lfk0 z*n>w=PM$k9mwRll4Vav564ZRO*3vhNOVYR`&7=xndU3?TZp6fFlUmaUt%yg(X^$<- z<@@!sBTf!eCeJkS1H-{?Oca%;7Sc480pF`d%tDSa~hQ+L@^7e2U}vvL%&up6R`tl6Y`Ek6*P>V;Xw z-OG-rs~&3y9!_}-Gmo?s45n0pn(LQ5u3t8M`O>l9m!y+nEWO@1*L223J#zhKo#`_n zzxdUNwe=k5G{cc#JCg)Tt2x*&n3xQ>cB@0J?(@~>CmbCX6s2M~D2ZcBno7GtdzyOF zWA0*`)>z2v=f{kOvaX_GK@!XFyC|%vI6}j@%N>+fEIvD8*pq>8G%85aQrc)%lC}NN zWB%GWX;Sj?t35_TX-&n$oV2>uIjNex(BtgI4u`ujuOA+t!5Ot%3-QVGvWVw zMu~>_8@_($#%n79a!?Z*mqjS`c!tluN;w+9`wwgQp-fhrO|L?vc{n^84UeSM{QN7S zaQ)~5RS}O&rJa=O(rGF2N4dx6OCe(&#kX%1lumk{6Kx6ib6TF>^}3M7o@~~+GFx*0 zQbFQG{x#lqn2Mu|F*KTr|rZJq0(Z(T;EZ=eCv4sevPY_Lq=(plw1gQ@}0}b^F3ZKC2VZw+BFP`=}f4N1g9gt;?Mq5BSWhuWC?HN`U`)sZan7=+w zqZyKyP;dD{JFDD4XwAmTfI%~07==hE$oD#cmsn2ySv zQk@_+-u4LVK9_IHK*aclEGa2Ys}z}BFTFgbEaCi>uGoM>k0f;xXlN@4jAvM06v^3z zD;=WP(r5*AIsqFS2_}@@w-*|AcXM`kGj85(;{_gJO?vic=ju$K33&1<6Sq$VgIU>f zjCT#)t{m-eUiI;79?zD*uXz~1QmObNlWaCLx%GH>1Mn1|E(&$*UEB>?Hm-Uo(!(F# z$(iiJ*K2kBKsFL<%=r$jZpiBEV}`v<2EG=ldYz-z zkigm`DVRCmW^Ag#)^d*|E=2!ZN()nIMXlxIfFgICzcxnL@L7I!OcWKTy=Lnac`pA? zQAi5%t%p-6PxJK4Ls97jUPV3=2#{a%DmJ*`=KXQ{{gSUA^(28f@F**_QCJgZw6ov1 z?|!q6S68~bqMBYF^&F3$q)g3(Jh)pYwSq_Vd=WX1GL7@Z*S)p_Pu?hQUh%kjSt^XY z%B%N0k*r`e^}1sF#N*N1fQz$=TNj;Vk{NkjVe5)EuTeL=*$eq>smARKCG)e6)K&~! zUtkwh8)Oh_zFMyFYOBWg?-X1-<4#>YwNUVtC7w(?ea+()kKLZfcke4E#^n84ZD=(m zq|#PkaxXMIUvjMOz`Z*mjfNqrw0!l39NS7Nz_Kwsc^WeqI_^E_P;biV!BXMuLNQx- zp~uSG5xri?o%hD6HH7YDk&V8{MO3XlkJUGQN(WbNPl8gUS=9=t(tI7#_g+~zAxlcm z&UYztM^@M>{s)T6@|R~NOV9Qx3&+&CR%P)Pn{iP{o}N;QB+6NNbxc_I8JlSk$HH3h ze0{3AP)0WW)x{Gg&NMiGwM&{gib4j0MJ`Y!?HQ7&XTMWD$po_vvW13rUM?o$SRwxVPnTKGg~>rv;;n0zw8mz zH9z~@F-m2#OmczSG+I(zx%0a6kosfDV_8lb0<9EW>bE*qr&6LoMmbZK6z6Y z25=y>y21&eu26D9x_3!rfq(b1Nm7btw?tSPeqbn&liqt*OEPEp>`jQ%;%Y3NfMGme zla*qI`0hg)7(HE*hl~zHwx~Ug3Ov%%quKKK&ii$GBgLx~0p?pJMUpcGpNzy1rFDfBwN*Px@Qi-VaQQ};-R+p=*L{?cthCZXG%5)~f#au1Nv+{?>GmYO zqmlWcW@%E=o(P$oYq9qF zn7vKGoR(HLQK>dWU6N;(skt`YsRnC{J&yK88||#z2TCi9XGG7Nl$<%&=Inf%<;4Lz zTY_12DA5U*PTGYPKK0t|E)&x=o;?|Gcvu;TtQ0!$qO<;^HeRhojugcZ1RiVaIWJzO zT)bH0!hDUmsC0ZzgJ%e8hP+VJYK9kY9dEbc{!O3hX^*HdSS3$qr!>P7*s{AH;mMK|ln(~@C7qbMW@aCPy7_E^ZdD`R9? zDR$t}ktGGuKtMxjQnLBBM|Zl(#MvfUQc49;N>4T#W;hgse#Y9H6Pn$S&P0tgF0iE& zsgQ3fOR}SPl=1e}G2_#9n(dHiB>%lA<)#yXyCWKvEHCz%oo_LFzDZo^F~zLm=uXwD z{vjM3+`3@7ao+NHt;Q(#P@d*!_*?LJsWh4M_~@o({*2cn(P->*U;(E=s}Ha!;U17NS8$9E;`MI!Q(Ge8c%`BTV)q432~aoVGP_poSpLoQtFvb#BA zWvP$xCDp>Of&ubUH0WvKICHMSxr;4cFN|1UP4NStD0ZY-#fbQZuWyWZ&r6}NFT9R$ zrQ?UcKaRmtsap2=j5fLw1zO0UUZ|fREm+q@a0>H z`Mx%1i8Fb6Y4a}MNij37SU*qMf6~C`eL8Zve~7Dc5c^nVP8)#o&h;L*;7gmyAXwxm9eg$IM@CGkK;? znpkmA8HILWd~uugPjZT4$mDF3so7?ABr+%~6>Oe6vdnUFl(N4QF?qI0s~eJ~r8t$G zOr<6HwV;2J5)CrWTi!wt{V6outr zJ0gy9<}P(aLSxeBTFfwk;TQ1G!JbvrZ zZE9i~+mAlY7#kKQ}=?TlrHJ_O=ClNfpq0@Gx`ETvt*DgT24UgYSODrqFtE~H_ z)AG z)4oPKTjc>tJMrB0arQR{>~0JgpKgdg9dV+$QrZvi7$#TlOmVn7VtZ{+o#2GgU}_$f zgdeLMVcqA!cV^jI8L+WB#Fmbr=F{qiq;Za?slqWGlQT8W%!a&v(c|^&h%+48V-&M z0^d>h9CmcMg`e4Ud;S{-?iaa(UL``IhwqMXja?e94bXb45`oqD=AUAA9_p z&)^3SphWR%Q%N7rQ^dI@Eu_!1e+)nQdBNfueE-9M63gp#34?UX%HT0mSe3D`nDRG& zGhlNo=fQhz-Y%!SUCF7{JmCk&qG{}%6fC|PaCor7+=V97qms4Nh_L2^l7*b6rAXRd z_jvX6h;RS?IpV0~V5iDPvvN$zGfSRZ)|XB=+KagUa2mVm*xwxDh0+Jhl6TzFjP=E1 zhP{;e8xvJ4LF8g(DU~xg4t7Q?KG|c~OPRYeMwT2&>`f?|-y*k^xo90ekJgg;rV!?Bo|X8X=GE8x^o|mK@W=DKdK^=px_l})O;xQ2fns}O$m7os_|O0O z6@oxBH676D_-JK`qmn4HWI41u9wxBF!<=W&5{84E$4?Xf>fiNv@~lN8gjx+cO+`I$ z7$pjX(09}W#sB%28DmvXw#*gv0O5)_M-(dw!OR_h`qu%A>oC@K)B{K0LnD;e8^&^c z9z=@2_`JqfZzL{#kckCfIYaK7Y zKEN38gK9YGD=}x}7Nucpwa<%32b`H}V2l(HK`6cZz*ACP7ovPwS?cqPqhreQ-NS+3 ziEH@Air4cBJYRZ2TRS=R5bAZs(XrgjSz6+(Wnm%V)6WyW`>l{h)3CZFu;6-4VNgV| zB})~qR4go8mNwuYd|%@fENwd)fukPEFC>cHX)oyW1;xoo^W8fIX`xx&Q`AGK1@iQb z5=9~EHojc)aN5yn$y0poKnxRME~4-#Rpf;x$>3*SYnHba|MU-}qF&w=eQvET{p=_e z9&nb!FTN-!3b=C72jyQqb%C*1wctoRVn4AtdI4be_t^$oaMv;}C zkyE@~9FnGvur6VJJKG6iU8<2J7I1l4I+hoDtiI`S_k$UF#~HojjIb_DfHbwFi5$ar z*8B9266P*<8TK-weuiHYAbOS-q_OmLx0ibqxn+E&Nj%C);{rdF$}~^KQe5OECkHWM zT^<6Xenvb}1T}FG7P&lZopT)TMku3bkJUKZ8)1Ay7#e~|7G<7^-gVSV84Ysk4WD{b zZj2xlP<$8~jD|8V(VimerR?t}{Qf^Y&)xSYSzYS0vlY{78P1)n;dv0n;`QI#%h}$H ziH14#n&#TI1|NNtQsfQh&U#$C>=XK8`tgmd**ukRSC%vy!kYf_1x$~N{IF3o)B{VJ zI7YFwgk~olOIwPMU-;a-ASl6B-O}(SF?SfrP|-8;kYCyN@qJBLWv{hrVxSmA0vf+L zZ&}zh{OpO(_wGog)~d_qn-_|HEIRTFv+!sEe)g5--Zf!j)ax>ki!;SAlJtu+(;h$l zb&B>A9^MNv#t}9|(pQu)j7rifhcAvZ9)C6B+D)m>{jk#8mM|Py^32kmkT%`dpC1s^ zgkzz!!VhHNEo-j;P(iQ0q{uB(vrSePPx$)dZEilC61k<8*Huc9rlP^N7RILPy!c{= zc#tuFbD|386n?KU)!NEr?TfS0va{MlDd`IvBg59yYts^E9i7Pr2iqf-o*i)RN*ALw zCeVb{>leAD$V$*KKHcEumpd$cwa@IuwwSE~`3z8%7Cf^Ap~u8bgQs7JI^xo`4xR^L zSTR1Tdn>P))sUieQQ=kH@5JQ%P985PYW0FY`jZ)M-l~(OC7uzNnX?vO3#I+_!ievD zyTOg?0axZde)PQ>X+`1mHv~Kxl|F}g`D3m9CYNtf+YXTWM zuC5nM&4gI1_@jR?MStMr_=q^+oRjdz<)w(5cgNY=O*wZ_S_f%b=^Y(HZqk~S#XdJ4 zO!557eXiV|WbRUjG_87;yF8H2YgaCT1FRr|LNCPC+Cfj;ND^n7K>c(;?g3YJ-Cw*?-YSC;!EpUvD`&_*oFg<11SdV#dr-my^ zoGt0L720WPo?&l4=b!z!#{KJ>7YiA;E-SiCDn_uXZ0us#dHl-pox7HHT`Jyd=fr4W zv^%ZfeB)T#RlHa&dGBh;=7Hve8}?MYtB~Ha(QrIeoS7(?pA|#Iohy(Q0!%^+OF(JG zDA6>VaPPWE1wXti^N+Gp%vdYosV|mF=H>!^`27Zh2yWkLkd?xJ21#i#o?&w<=gnfu z^lT_Vqbn`4O#0;xO<|!Z6hXshdbUAcz~pqD$ukWa?LY>(|K2(+3mK{!Uo$b?0IfK4 zzAg6lOoqAE{&pS4k)*v`xi?K3=S-e$2{65o59!@!36P~Fn@cB*P1Q-_oT;;IIq6l^ z>u=YrY;ny_z{G45tmEwEu0XgPRl7?*f8!~lz7#K)Z%v?$V*YAZZ0^cov=(bIP-_@o zeYMZI`6l;1nxe=pm#?*}xGIZhoY>x-rCwL8z8UaWf4&U-?(_)&bNk+R{)hjszi^db zx__dWoIcCci~uZ(+=*3KD+Ys-Pd^>t`a46}OpY7I#(kp1krjxOLn#iAEuTLr z7$1{>!nJM7)VNH4<4lGDNh*u&XrOqspqQP~+_~gf-;<57Sr^AoUTV@@jwrh)iqBtp z%uFb5%)_%4&3H$usW>-eg&{2r%F`_GXg+yixHPAjpVO@FDlX2+CYqEoHBNJx>h2uD z(?z&;$>+j(pVckL_=L!?l3bG%@~wT3&8?EB&r{BwuQ5AYV|^oIa=J!ZxtZcb7HJea zzWnT%yo9T_##mb!VNo<%0a0X0GwE@bPVwed4^Yfq?6AKb(P#&Fp;yK8Sn^!#ifgZr z@k7Iz`8I=-RBW1+#7kmPq{`cTdqP>1%v|Vja*$A#may(g%t|gw25TKVt9^{8XiwCL zh8aneQ*Q-iX-QEX!%%RvGh)2@VxE=w$)uQ)i!@I1xk%Qd3N@pd_7dd3%?LMasLD&y8wpL$)>s41Q-SZbkE zGIHV(+Erl{U%pb@yrj4=qgYs1^diMXS2o715SzKunpf+Fnh&=w!O>9jX3H=&rbu#4 zR;@8@G;g;JQL6djd$6?a@p?nkZ3`zM&J9^95B9ACu?GLWk9iq~r}HYO3{NiILT zaGH}L3?s#NzSU%VPaJ9!lR>2=cVxLh);BgXdi|0IAB?fQlJI6BqTLNCog#|FuAk+Q zB#zCsi0gMIFrH@d<%#ekYCdsPt-;KamoOUSoE#)vxif|58`j_UP)ektNnDU;vTwYr zItRznzA6jH`r--Bi7h>ii_^7JT1Pz0I5~)zz0@U7O7=H}o@YFL8u?S?GF%=UCuB*% z`Rij8xnqB8i0@0anyl2ZTM+HQMzjVB0#CMhIWme>a^>DU_138!e4`r$o@awVCtc zWz4l34X)p8kmj0B*GKyTkU?pbGSnI#yGM@aizSyX_{^X8h;l=-Exjq@S1eo4&}|~B^u{)bamxhK4ieTa}E* zBOb{l*j9-X&cVjpKFw~8i8D>|Ok6>uK?aJ-*`_G+lI_(K{LnCQrd37jDAFj$Svk2l zEJ``{Hv0IXp*ztaPfBWapLmdCOL1}G(t@Ba?>`#mIL)c>J&j9t z*9WH+&^wt?qaConHNtoT08*aja6jQ-H)j5tP@hHvnUa^K0(6!9>R4VJ5=WNnx7x&s z<<0AnB*I#S({i#20*_H7Hr~1OAyYE}PhX^`3BP{m@pi*9KISn#?n{7U+vDynpI0l6 zL863zs|;Sva59o8jfpWsTpHfHEq328UrTS&__8Lo)*SW?)02ic_qcXmGttpJUG@k9 zgEn3T6A}({t0~5YJ69EBUCo!TWpfS!QCFD2a6FQ^LtZMbUh+@t$R5PA0a!2KR z3?pc?L{)S7YMo}w*PIV1yyXi;`+@F=Pou`d_5wLMQd%VQ{p?Bl?B@4 zAvYgRvcHqCy3`l#eZ_YMPC@%cAqs#q7dmXN^w`}H27_~|a+^^N;WT9~Db(k#b{Y0k zjt^oP?pk>;IxCyBF~V7Bc0jD!abSrtnryE0=^Z6_o{{(9R290Zs5M2}dHzzH3s*Y4eJ!mo z&zEFli%jS8%%W8xC&O>}`rSHS!1LY(+R2*;LXYL;gw3sto3~m_OoSvAQ`QeOgOQWt zjggJ=(es?;b<4LttTTJYlj*IIe##(L)g~r@;V)jm@ksH54>X;Qu2ciEab^`qQ+YyV zdbXlD7#QBaEqdL!&?v8J5hSv3b=9>0__=1kXZYZbG|{tCuC3SQ22zzq*!YHLZyaf% z`N6jWYIQ?eN@$-Sno|Uv_63^#^hLrbQQW@Ql7Uz%^00Rr-O`F+esewM$=7|(U1%{i zQzuSEa^v}iI4-MPDor#jSbEu`J5gimY>O-vDOOnbND@m~f>P4kT7P>&s~gfD4@r{} z>l|JnRfDaLwpmiJv({&Prp4HFLwaXpc(<*`-D0Vl7c)p=MUXu!?v|^mGmLw`b ziS2Xa%`wq1W%6uOst7ApYj>i?(asQ8g4UX7l(DnkXL7E6TA^4cTFf&SI-DG&40<_U zU^v=OINXi7aJ4Ivu|jO+L1-u|S&{J#8*4F9Y`Jv3Lr^o^xIIP`IaXI<*@T=(e(DWV z!CMS*3UhNcCZ_|QJWtWSrZ<9(osyfkYDAf+SJGTls~K+J2zc=pdXcbxwbs1ZR9rkK z4{>QP8SdYZ-|d&LMGEEznqDGW_K7h?ft;c)pI3A{im#XC8ske<+fOv(W1{uVtl`#W z!`+9EP!?*%H&zDAk;u^_iRX`TAu+TF3<7q8KHLR$EATNv^nXvBu17 z$g}4W{l3_G^HLEk5xljo0nY^+BzWVNEVeK$}`5{tE(`RiS>#IpRl zhpYNS@;Vl6^eIhD8^y(&GPvDY>*JL4w?z(?qm5Y9^GYK=b*{~*pR&1hjCG>NbymPg z@-rM+RsxF2vu&bb&i>}0YLSU_tjH|J$jm591VK7?b&PnFv9ToFYDtY2?Xan!|5;kn z8Vk61V}kvinB~_eRbk^OtvKmCqbu2)qcs+C@p_m2-Gud(kpSf@EpwVV%r{QWzG354 z)j!w|j95Dn&EHp#dSp3#@U5|GGZI%#VI?pz%Rp%nkw1Qs(QJBr>!Su%$%Zj=ruam}dL{DScbh}e^yg-r0 zIo68$!4C{cl;f}@NzTU7F`lnzjfbR3L1`=FL=~};#5tw4?5_7|bONU4+CpV2Ww4s( zC9Uxqqk+8U@j=Ay+JKq!?aKXDr5<>4oD1q6V>1o5R{D(kIY)aDb5~^3Eeq*&$B}5S zi$bVso9hwLsN~|c4$jGdqi}HLMu#}ItgR-JK2S-tqWIl-Lyp>K&xTA)1+1*)ynLN; z?P`s&F`uyMQLnzW@6jFecz8G9`I2L08??nG*_FDLURH zvDBMB_dlFu(979a8R3UMX;u;KjHa|ul!6?+baR|$H(>GUA;W$y57}Xk@f7x58>f)( zne%O|gOwLYWQoK;C8JDaUe@7CX_pmQ$;|l<^;W>{TAwT}K*?q+ry^-56h(=1mYMlB z+EZ-4Jt0kHbIwu;tF?v2RTMI3Vd`89?ZMXaiAW}m5b?Y~SK4vNQZY%)UmGW=d91xT z5km%wJhym(SGhr@xYC~C*24*k!twm;6N$>I3@5%XfT(XOdVhE3ng!1nct)N%UcVYK zH5D>{sZN}h7$w$Hr5z5(#ALw1K~8_@c=Tn=wJQM^&xycZBfS}1iS`8W5~Yg0W5v@~ zjyqR;W+r4>t(8I>i&G9fO|4!s7+RuK@$9W*{w&PTij+(t;CFB+52hwy>i`Z1icg=z z{p*_9DMg$ql#!SqPnkYLFNXGOpd9k}5K@(tfEHP^%koyf5hyCkGMJ=UN1Hk0P^@wBbY^=hwyT z(m#laM>*ZeI<0O)e;n|S zf86E8f}v4^Rs#YL0#68MV=cwqTLDjA^c}0ji^Y9G8quHUKS}SR<_6uiaMNrp~siS;Glu<~yWGL9-K7%Upg(Whpa>>A4ms2QhD69C7vb z1Z6H&ZfQZGP{;!)O)TfHwAtGn@pfUr-S@^MwZs4aXBqy6uuFySm%MtqNs?G@-fc2I z70^48pg!MMxKeJEXjGD<@bSk3Mv>*=y*ll#;_$>0R*N;wO3GY-FuO-WGXur#s~%pc z*zZ{aPh*s$EJRb6qynl~-c}q9WFsBxD2|2@_%abM3X$@RQb$%g{_wAh%zb-f)YVO_ksns<{1DV)6D+H*bRPq#FwVJ)4SK!ubaT#gM_!o$$`T%Zyvy-n#??C$ z>}(9lssUS;TB1=-o?4C%VzyTLtiL&7=3I;3K@3V{HLi3b*Ga@pw!PA0`S~H8i5i2W zL<}Q=klXUCl2HNs8v|Y(BwV~bK|IXZ-x%OmhKC}zltqcP5RWoeUL11q_9PQ$njG&& zRaGi#6o98|7iF^RDPF87bQN4#ugUrx#j+XnMvDLOf49s|A+0t01J1%|1)7H^*Iv$fLa z!T09qpQNWsgLl^SB+AfQ(ddLMKR;l1W5CqeCY=c(lS#oMYKAP4qHAor&hA>D-PHkC z?oSa7<#n|Y5RJo;r&7T;Isxmik4T0&)8|@@1}O?v@qHDRlB_Si;%2wT`s-shmW~Mm zLo|`$oWt`BzNfL;k@Yfab&u(@EfyXhu=e_hi8FNueT}DO&+~lYKBQ?*XCg#t#jk(5 z$J){+Gt&jmeRGfZ8&igZ(6Y92$l+1I!G46%!lJF$G|q|Uw8*7zvc4L#wV9$6>}+Qh zw^9rYMOG2oGs|dH^2rx5zEMn17OZWS_#UFU4WvmQ#WJ~1Q^(si%f_zd<|WP2rl263 z6DHy7RSvxS1qU56hQtZX|xPtj<~ z&@Ic6Ycok$U0%)D*vN?!SX~$BMx!Aqu1Vq;j-+pUe3bG0X^-xBD3RY^oeqrQ~D`aJ1;GZEUTv9X~A$%kfj!{Aw!K?-DCbrn}t_H+ATwWAOV$mYI*s5 zL>!mgzgK7Gj8CJk`0jUGY_7*VxK|U(%ey9^wb)!(yss8hZe8{0wiUgB<-C6e?*2%RHNq1lA*zNaLuq^CGDDSF-93WcnpAxRW- zvzk^1{_<}V#=3?FcYO+{NJ~X6&@`HgD2Aqno3{+lo+XqP!kTw_s>*UmQ%jPHtygQs z;X%f~_@5U!f2oP*n^O(1b&7aYlEe}t_4d^XM+XVkLaQrJm!N_RWfifmC`tw=85?ho zIoyeun5mzt1AO10JVl-g*S09ECqh*7BzGS(2!4M^mfAsfc0m_XpIcQlS`qC(YuU-`V;KPvTiv>UWUX5l;R1L|*GQ7FRl-%!o?&$*W`8f|{`*oZc?7Ma{P2Sj&>r> zUG0)aIeBK8KGzb!iBc6|UtzT7WM7F!T>&2FD2( zZ%%M>5DR~~;c@lu6urZU#ixf%&eS1Pr5@78cuVr(=DPYDk5um>O9 z3F)@r<(q<~4a@DT8sArpYlqPW@x}9kAADe#om4EWSl;`8S$nhQ$kOz_@Asbl zdYkF#o*B;2WKdzsvK6Mo5eh597rxXNarhfJY+d-qH&$2?vcsZf(I!QS zq{f`3m+C6i1{4ZF0fjC1lX>>@`r>(!McsIsA)zn2sv{efl{n`)&--8RTav4L8HjCc zq>cms&o4^;;eTp#bf&qwVY9SglVoyjq68-ne2Z6mB{#M_mX`$wzJ1FlHe{eyA3~e@ zgOX;`<;sRHYJ~?4%2KY~N{b<=suXFa!LnIi7klmXyMn80eL1N0T*1`r1QMigDe7&X z<@LJArfiF{G^eLrlnO7tI;GhO(P);hG)3iV>eh>*q%12lObhBQm+o4fWLmJaUKe|M zsj+NxJsX#q*3js9*p|YtxpY=SqmU4HpXhxt(1Pah<$%sgjXW(_Tx;Ohg!H;xP|#|A zFDx2qBMR2GTH>-)LX0c3abC)4-#qKFupCn41sgZo_<@bB!1rbG1dT;Sn!um_Zxgg0 zo3Z-;?-~BBss^n!Va=u9^zlN+$iL)x<_8XWs(G;;ab>f{N1wFt0y&N}n-Wo|Ek#*c z)aovkR_q@ZJh&h52fx=OD-^D8Q?JXD1SQqbjfPE8S-d&YJiP1jqfb1R7j44OqS3JC zF_cB6sMjr`MDg7&+`Q`WU;Squ-L?>Iji#s=lp}0&ttJ=n&VI$M>n@*v>a(;cAvleu zgBQrqEh-DYZj%*?XU|hMHv>NVtVyFK-BR_sD_D+_3%cHPIX}zDa?KY%TV(TkgJ#>K z(e&^FGoVZ6OzPgN5si+|?MDmLnl6K0LQzUsND@n~Z5$WuKD!{D6)deuo^9`BN}5R0 zelp8RX4#xMo{du)oq(|6(m$J$#06QBlg8psEAxu+AmQRTqSla#@**pk^kQ-9#5q}< zlcxn~oO8NA#`7!`LV8X|3DGbSSiv~lwAS=aBdV&Ty%3Vd1(u_zHC-;=N1)^;sw&xh zqhZQukg$5KMV`r~?s~Sdoy+&Q{m~NBY0ln@KE3mp-4_F1KO1m*JY_u0N#c_JMaE>D zGq^~JXBC5C#`||MPrn`U{ON?F!-OYaj~I;#KL4`I>Uv0=NV1e4i0WiK)?B+5vbf^& z^m#IWkZNR$-`*)%TXhNR4&#~P_6--UES~LDSSCtxmMY?0@$LfNox;+Bs9hGjHh=lG zzzVZWTxjE1krawIM`9grw{5mI9G<+=>>W#P!z7kQlPFeD5>#9$0r1|=3 zF0Y$uq8Usg$oS%EM2M7UJ4oaW6E6kiVv@qdd=B-dM_6-zdq~6g9lXj?*mlOSpQ5!9pqC0iaOn4Q z_TJ2R@VL#=YA~0eOeWHFTUAP48(O?OD)`k`F`HL?+QwkvxE8~S$j=H>vgi3W@6R>Q zc1j-I^H^VV$SSdxo(&Y*mi)_73)_2i4$t@C?oEfqMTc1`vX()_+*wv3ad^EEJb6)a z=a$E{EswO22HKMzV9CHODjDp(e#NsFDOaxrEU$X9HE0+PN|RJ1-`936c3#gIjS6nv zZAoy8D-np(StW{xOS#yzVCVUW&Qi$oT3zbZ9h=Eea4^9?#i4ZcW<rALEVJsnCyjdKfzK0MOX?3XH#^gX)lK4xg5{(w4|{RP?nm(d2DigHIqTgus36Q zqX{OcC(jKNU1=&VnRAV$EY`MKv^s$(HIkCk;~B4>_WAW+o$~9yI_2mf;#Yrl#$W%% z8QV`r9KDN46Cn}X3qIFwHpEt18ojBK+Hc#j$PLt#q_A!eDcWU?UANG!jxAEyp&`XQ3BlsmuUhIAB1G3l3<@uwB#s-ax5w~G3>ghmF$7d#xfVMwCmg(;nRI%QoLP>AA3989JvUo8uFcL)N^el`;~%$Z zcU;m!fo;=h*hEuMmRxYYu|B?hQ}XD(M;O}7QYq660$U6hwlXFTo1H_=(S_oR&pZ~o zQmu|<(QVs|rpCa4h~ak+DxSP7xqru_*>sqh(DG)>VK6dBC@g}S%|*ZD?Lon(pEg)p z@r(%F5NA~QDh|xt96RJoY(v~u1I_|LS)6$ zobg3Wcj?2>E%SW@dBx%Gh|Y42?sCZW`(3Wz?{e$m z0uMf0=98bS@smH;#Gh)VTNXIvAkrnwPEwki;|)eHBFMk`9QOA#UZamapAZ&A3gAR^RD82 z!2E=CG1S!Rk_B98i?mSOzaNn1@M<@cup(th#9Y(rNN9XC)2yxqEG_#y-;U5)?w6ua zOrw(4f@kuRVQH<#jr$!A_aY|aOzgNIjwv$oY@cs?Tb#gUxSvP6>eP>MXQa6Frh8xk9NusfQkpDATA9%baoQ23eevGxA;jaMmbt6&xt zbECn|iwS9}x%;SNDxBq8<%JB-X;c}(z2Y~&i5O2R9z3k0l`_^v*%rgP%`g(jRi!Py z+0H;Ie)?mnEze4MVwaUAgh{05hKpZ+S8&#ckME04G%aQ576xJ%j77-r`xY*PGX7l|`#k(TwTezN>AtV%9Q){?P$0?=pvLEhB1$(n2xwl%2Ch_v< z7RNcZW79i{$kLMTN}Vh#D67k3eT83>@2M=sWSB6zn9*7e=IQ)mnJrBfyJ&os1;dM& zTFW7*J0_t?gC$$D7aDE!G-EoJO=4lSCVEWc3MvZ0@@JEbES7qfZ~x69lR?7LrWv{g zXf0$1mYPe1@~q@|Z^YtSoqE%gfn3Pekt7nxQkAg3Ge%h!S8uhj9mU@3iKJzva-^P4 z<=b-m7u7gK|widn|C#R-NMC~OwP)|Su4R=|J%KVGnZm@}EeSx+R4NiLyF z%8>#5gO5XMHHYIfDQ{iq+N`g-C`;UAj%$-w78`3Ww{EyR-;)*y(TrQPTMmV>1gC}I z{}1o^yg4X&dsGqDZB8yKmKFuxD9vdw&Xl-BQ+V|{#jiO;kqpr=bd71mVwy<7=;D&k zi|vVVVZmrv&}exSIbcG*9Y;RPgWU-SyAvGS`e4X$Ey_Y-AZ7Dyi6d-pBzUhS4|T`2 zDGNy}lO(c=rS%5Giy3E!6BLl=5|rcl4!P0e7P$<`mCZVNS~5J3C2|wVgO=8aO0KU$ zuI=`cPdv>yKb}(Q4@25^lv!RRj zHWe+_;>+d=jcG|%imSIJF`E|H_V;tG!EYhgBv(=!%b_AkD_(s!WNkfU z^IAxe$_Hqh&U(v&#pQtGcT;S~W_LH@+Kn3P>n>R$Z_4p16ySJ@THR$lNhy`$tM5{- ztUBDe>5?R+L>2lrs#0LX`nqQDO5V$pml+%D4%aqql2piO(@>7%!qTF{yOSJkS$y>* zr_r$a?6GXxLU722jU}aj+pkM(*W&f-3~ZYpejZBoNhu*OAmKKvYXQgaa|VNg?dMZ& z-D%P8dQwzri(XVK!Lw>jkD`Fnlb9qax%bf`%CaO_#g_chvQmUiPudwW&FQ;{R@bMs zU;>FesoWNlP+Ex7SwR+yJ#uBMNuJAlw@NMWj@C4~9>=>g&JV{_rH~0qfi5-Jmszs% zv$bp(oX&(y@GQLCW;)EwW+=xrU1_L=B@&cv29;a9psrm+|s- z#?$SDUcaQ>v}m_1Q}QWMkdCGC9K~={@a#p#yY~fu@Am^%k3|OPdCEu^;ml;3#Hqy} z|EnCwhDKc$2g{YrVc%?vp{4lI=PqA8N%_^cDZPQ_cYhXOITke&)-NGS79W4w;Q5P$ z{e6M|78ZSK4Hq0)Ov+Mfd)7AVRF=*D-ju61n%J&Iqvca+!7(i*(1I5@+hZl`Hc2bNRgNL zH5*JpWyK{yrs=K(3@>7O@27NEYf_MFHdA0ucxk0rT&ppgvKZS%DV@^7q&B^U=orwtl0{bewW=9IJgBK*gq*jN6Hy50~pR#qW4odNEecSHz^1EDZ^pO<`oAo6nxEd6|Q|L zmC}@XMUrU#uRl-Nex391j!UO)^Lk%y2G5mEGcP2=H%>M0FDm}0e=_6hrpxN8#oOab zBqlE8MI|*Jg*Z`O?Pko)mfBsMQxcBiQTQ{5Z&J#42aSciOTAG!h6{A7QpZwET-2ZHq zdMDugI5LtQQ4^%G{JMWO<>alTd#!9WIo%)6Wj2-BHgluFJ$yMJYt~Fat8EJ7T10dsvRbaij{#al|nu`bmp8 z%IUwKv2n9YdpYD}e?+tG(_O6t%=3Y>wB+ocV$@NVh3mna z-I%kpl&hN_KmS>i$BzV~e*DnKu|!jS848moC23l*upkDTvVx;C&Gc8&>ft)zI$|b? zW}4Zoq9`>xdj(IPXZ$z+pusfBh+^pxbd26~8f&Jpi1UB>o0x-lImf3ZzHi|MHuai( zw$quGO7$F`d>e6kn(^qP7RT>%YIO&{CbB3$uyF&Idcz~nGXCd(yuusYz3p-MX2R?5dffhKk<;VpywA+CWb?bUetUt#%dbv(zdz#P7weRTv`Jf* z1x7Po7BW10CsTvDX4G1VNdl8h2xV!37YczjXIaMHvp!0JAKGMTfdsKxGOR1Xla(cw z_}9NVXFACVYH~e%kT2S3G`h;o?-hH`E{LbOKnSiZ7OpG$a)4-k8j@_iMWabL(gjp8r=7Wk;sYqjK?X=LmdOqgun+TAn>CUSeHIpBzE0Z;wNQUNjPo})tP59|g>YSasI5vcV zbg(IH^pc4jA9nY0UhNhVhC<1!x25Fg26B<7spR--4X5WNfBtV{KKsZQLgKI_2rO!$ zyx&;@aUwlUCuaq_yBXUrGaf$<+1oD&LYuH=V<|;6t%zg6bzi=ia(0@rx*qcNZ${XT zgaA3NMG{x$hNu`1bH4h;84Jq+^|sIPyQv9Vc2Jg7k0fUB^v@Fp7b3?xIh@cxH-pc! z4P)%!1u_JchP7)gR6eN_dX=$ogPLsyFSyg5ZbOUT4vj}=4oeW&A6X(yf-9`3$EN~qm+DJK`0ABkrk5f zi)L_wJ%|?-A*s&{e_Jn=Ss%e|eX{m!q<4o7`0@EWonF5ODogooJNt z)8Add^Q7j-wkjMOs5pY;Cyw?oR_&S414HY|Fe>kylc~^Zuly*Do1Q zN=j|MsKsbha_4@NM%$CcP?vH6M z1cWV*A~U2|B@M0$7@SV2U2hW99nRiGEUeY!_;*=VV=#fLs>}ejS-Vl^;@wo5L~M(y z(3Iws;7`288Fj`&>iQ|eluV;MsO~mn%%hj!bjZK##lc4ahW^;Z~a^r?n-#mMs^7x@I z&`==;)3Stbo@G3|>yqS(n>Rdm-sHS`Q*iILN0Q3xl({}oB%a=2@uGerp zd)}v}D@9QW>%P1ea^-51-g!!`<+HRFlBN|Xn@S7zUlamYt!y;rr%A!rcuh`x)=+Tt>`S*<|LNZGVr940Z!hIsmc;B6h~dya43t*ng%VHYpIQzpy2GC zN4@3ZhYpRlOI67c->7i~f>4SqE*KAlY;=8_X2+lF_bto7gi02UJgum=e3mwwIF7~Q zdL5A0x{eJ>&tn1$7sDVf+AcO1aGJwUmT0{o?I&%PZIMI~SS&Jwk{!^L@qWvqxpyGn8fV z!_OPse^6sQmhg(Alnm53xeSH2`1+~fU7!Cjq*k|heX`7#;~8TcC|&V z<&kF<(J-YbDzc=MT+rOOefCDwn=Xzm4x8TTR9rrZxPmT^b>~MD%1YAADicvQJd4ef zT*64IQUY{(Coz5~Z4p%=No3PuhC<7#R#jL^GwG-3vZCI0MF?M(c!7-<+6>PVQAre1 z!4gkWro)uZav(%TlB4X)Ob0othfR+wH{0}2XJlDPGR?U-iDa`jIT1ynDT<0&l=E(P z#M(7UI4klBtzODSC6nm3?qZ1^lJx;%ZB%E>}0{J`Sb%Z%kEm!&0-ESE-!+qXO_rFg!R zi@07%ldt31yxuQaUUn!^EG#-)S$Fy6*BR%1X;z-4FikXh1>3JOv?WS}?xF`Me)H8# zGICQ*oCti8Ws04hm`2ON^=($xe7^g3%y?8#?h(cb@bg_Vsa=f_i{kbyLjldTL)O%h2R&)SVPMON|t?MQ}gA-e3c ztUhoAXu^g^Yr$tWNr{H3EKIpTk7XgM8Wc>&8QqnD#kJ7n_hx{Q%(;1OS;%G@Pjehc z(OnTTx_>$oBSu~st@!2pm6LgAIb?aG4oY)zG%=)|Husx6ER=$1oZqk>9#YZ zG+TL^6y%wyhqn~daf)NdX3&4XukU4`upEmb8PGqEu`Eg7skFpERu#N{K4xXD#{I`_ z@?4xqlS#>CuY^W$x-_Zy>NgYoKymA4$Sl!>HJh`G!bHVklB`4$_1$*LLf7GoAJoV) zMYroPnQ00`VpRxkY1#1Ii;Tj95smeAi^x!O})^NlTR?3AJHXJcsq$L%?rc4GYy3*9!E>&L5 z!)}Vaq}~#-cpT-}u3|dLm`*a<%Yg~R(WYue&3}Kn35^E{Wl?eEW}C3#(LbHC|FXyF z{zPH}Ek%)5yx$+QywM=2xpPtjC5dJ6tS~k7*8KCWH(fTbH#vM8Q5y04G%DG7IpM2c z4%pwDv9RRxgD<+wW+lf*8QSQ)rHM_#^=FC3vTc$CHm-OqEV(>+8sh~v=RMJ=-@NHF zOJuXGu!vK|om)OyDW1R1aJ);Lx8kB-a^spuRw~jQmX=&@Uh{bJEaUxIDf(U6%RnkF z001BWNklb!m# zk>zp<&{~fD{fmqs5SXhh;o9vM7pDn3+XJ(0OA?{wD0*izY7L*%EC?$bP0rp;=IRBs zX+JSTFQ`ih)AB}>W;fvCC^9a|%TtyNKfzTcm8`W8FdgR%&toj>!?jVFEjiDGe<<^c zX4j)CE5^MPrL_z!lQAh$vufVK)?Eqke4F8UEcY66e^%88sKIs>MP@>F9E;O~(OiOd zSzfBqB-27j@1kV=TAS8F!14Zws=WMcwJ~N`jCwIuHZb=7|3C%`Gl}p5MI4Kj?~?H7 zou@qgs?YLzjm6c#IAk=P1)uS-Kwt{-=g(%Em#<>(KWuRGcAYd6nM%7OA>l=FIdtX1 z|N7gQ#YKm$s~)pVI?a|A9mbQ2qLA(MQWo^fuQN~<_wNN{xk$e{9fwLwKCrUonD4k^ z{|!QiFTbqI=A1*T?aG#$Xt=EXnN)oDWXkH5kmWU>*yQ1M7d!^T+|*6W@p}JF#OoIm zuH6>cEb2PA&GLD3xQ#XjjSiHaBL;AAETfcoyTNx zL2E&7lFm}dwR?-K-)NB+6-T=xUVMGZ?$ZnMtR#+d&W<7`!;I-foOng4FJl#mX9bgS z&Ul#fZa*TLF}f9Sz_~Q9Y3(yycRN@mhA7xq8HV& zAk=C$c_#X2lp@JsecfYq)#K}L6aMc%i@0_zkZ!q}O;{H`AgDQD**ty_;srMQ?@GE0 z4zKremX}@p&^DRY7I6ygj?0g~taEZ+v45CTZ`iy)D=9TBt$3uF5KwUfSFeTCLWk|` znc(lX&G|)+<5<)i(v_Cwl_)rFGz=3(WR_^k{` zk!CHfhuDrXLsAB>(s~Y`Ii8|4X?C@?i`EtWvzVeRC7?+QDVL`uo^Q>y>7j9;4o+tj zx#TEZ4&S1XoZhOE6JTpGWMQpN|0E(y3Q;W>xFeos;AKysCT(c z$!8hI6<(me55h42`mGqRQsPDnf{JK3CeIgeeT&nRn8A6>od+H2OYqj)fP4iW?o5yntuhDYb^p^&0`xSnwQe zQs!%Qi+;ak>zc>@e#+in%AI?4x(l9M#9EOTnp)ij6ytG0t>N-!CnAnZ?tj!lDa&Xn zg&D0kMgEl}68QY~)sR}#lf2!yoacd-x%^EiFy3f6>M9+@1=CDEGqok<)39Sx{zk!)oU%zk0&N>RP?!y zXR&s*h2vVh`uY?vu!#mKyU%)r4Hw@R9kc6N#Iu~2PcG;z`uL%2VV)-;E3;|AWSC-E zQd0S|KUkCCo3bQ{1#7l#MG!dLebD6jcO%~J#azD;QdN~`mHSe^RH3ky4CL;D%m4aM z2mI>S5%szaS`!2c-&44bqE=G`zJ%jAj>TX9I_Bl;jOAsA2e$(>im+ztV2t}qS&A=y zROj0#3B5tZU{tcP5m2u?s92;^mT5w`eYeir{gk~oDUUvGaq>Q5Wz9EP3$nB%X+^E+ zvU#=6?yCvc@3yeC#WX6oekTxUMoU9TQNoq$O-_$z?7tdv<)#=Ul31b`rKD68OO|bO z?Bmv$zyo)@;of7|IW&3aa;hMtdnBsJj9U zl1-pBRta(Xx*ODZ0HwkY6oRSD~9gRLw&3lc+DX&7AOoSvjS z`lL-Quqg5ZFR-Lc5KXJ)&y)El(~65;$$JP{jpMXlkGnqH{aZwekf z2NxI`=X>YIekEsv{Led0vynaa3t!n#eX?U1D~nUq9P#n1nv zE*gt8lSn?<2o&|EB$8DXT%4u2p3SWX9g*bZqUEcQQ$e%lQEPf6vx4z3qq7{cuq+|x zuJ2%#BIBt{IJq0x49?>@7A2&HxM#$cDWqe)=`uW@arkOLkrpz5PiN*LG+k9#8(p{l zD$wG^y#e8ev25XAC9)DWNQ&*Xi{_wx*V`oA`G$=D79hW= z?STS9qntDxt}z;6!yeJCdr@z1=;m`5&RS!$M`K@^m6+qIO&)`MS}g5*kP>5U;~Ce& zcian4mfh9%41$lU3JFmeJ+&rYJeKTq+PbcHN-vI?o=cYB#|jPckNxpv5?7t|T|ILn zsHt4??)$2&IFInw{8Kl5R5#ShP}nT>L|+zSO)dI1jGji=lp3*L_TyTf4tY3|o-8-` zxxwf*%$2=8LBTLs7U$eDcrvfFS0kd<`O~wbRadcUWKVl|H8bH`kuj<j6C;Sy|{%w4@yU@V4QYPq$oHm&SjuLNI^b-8RmfAC1<9IrvU)=F{3YH@`r z0D37)S5fAT9$78gis;bByhWFE1!L#WGltg%uBE%9TNGVcNAxjYXzfQ#_(!eX0sKjw zCD!fUnP)Z=GR9-iE00LnU`M~r6!PV-WQp5>5U$PgbPE4-5+Ni}nT&;X<1VxS#`qI6 zuw|hBF)FJ)b5bC?reV%xnYjAz*yO__rd>c(7Yej0T#_!}sq;8*u=(|ZqLoFW8~gp` zPtA~;+r{%!Gqu(|9pv8b86)u&GC`)h>jYXqj`bdO`(y?U7k3V&A*v2B~>A= zl-Z~pc*LI_$xbUJ2cAD2g5bF(%Z`Cn^{IZ0dQ%2ygjs#4idOCryM@pI&+nNkEJcI# zc=J>%qn-$*wf4K(>A|{6=b*5ErnEHQlhE`va2u%JUG1NwF~BoG4}KwKjRGXc(M>+B z5=3&UpZ`jqF|vJX6OLZ+72NpOPMy-#!6aoak_sQmend0u3}0Buu35PG*5@kE!l?w6 z?u4fraldJ%=Be~1`C_r$yhY4M8i++aDtL~=VpRCF4*TKXx!DG^G2~XCm>8SrVQuDE zx+?V1U4Ot;QNO5qvF}bnLwa8|XWy-?{y~R6QHH1b?kd2g>p*6BLx9}z`&vH+DanK- zUTQDLRA){O70I!pwl)&D@e6SCR-bMXw`m>M=o(kj?kT-4qVs%Vy7;&AO_3Rrv9+f| zuTrF;ft1WTM(b9CYebzuCs(}&Vlu}|#{E!50f@oa{_c(>&0BEG*su%L)@`rEX59s5 zD5N8WR7SrND3Y^)ie>@^4rSEl5ZTo(2Mn`z~aLz*XJ1xF)|wf0Ublv*qO-y>ILc zzq_9xZh}e#q$#5~1S;E)PaiW>40Yc1rA@K!-M$(pq*fJqLj|p#x5VX~rQh_3jJF06 zBG*WD{{6i1z};~sT_H_Dw37E@RcG{9>UvnLbPv5k*_Paw?61PtoJ_xw6<$Hq>ASO; zpS^^167qk`cupH5TFGdrqmG+72GqXSg}Ibbl~+7WUMi=E#wtjet~j{shwdSnh&hgr zY|7pb^w%2m(_4G!+cMRlVE8uM(?S2Rxr#!F*{#(Jk-s4{NQ66JFk(!jd}G)vEcl z^my?5;R_>n1L_d2iY6Xf0(F$tC#;HRNC6}=FJ3ii6Q`Yjki`4VDmnr&*9GW_Q^h~XHwK&+WLFWG;!|_$F zM%oR1H+pCZ!hCtFwDK^o3?!txC}9DSMLY(rL&k~_YlrmnOxKRdk8OoWw#-gOsDOfC z+7Q)(pxL#B&Xv!9FMYXj?~EehC0$!-SNt|ie`N$=efwnLlSaxSnZoa8RU8REr-Jds zz*QMptHn$POvbMps>X^ImwbA7`Xn^(J(f@n@9jwju<}+3n0lYyZ5a+XrDlATHG8@+ z*V)99oO$aco}cU@oJ%X)9U8VJZBnr(*J5m;j$3)=eD3o{)b7XD$I-hlIJWTzC@Ud> zaRImdIZxIq=a^a>+QvF>qg$cgxp5d2{?{`SiB0QL!l%R7XR5b$zmO)T_G?YOtcHWa zJQAC>i#ulu=(!rG22kV-b_Z>L(|dZVo~~Z-@eSSg2wRUUyies9bc-_;h&c35)MOxlf|f}!8i*7(4PTf2)+MoeS5^ zp40&EpdhUvu&pWt&rPrje;9pHAicI)vv~1>*M|dG9NYe2kud2yCa*fz{f(Ru$ z`hKTQ8~oerxEc8hFJP%G(^aD&VnWd+O}!w?Z{J4>En? z=EfX_Mf)H*_L4|T)K7uyUj7ReY2s$=(H zH(d)=60*BudA&=1-O9eLjc`JugxJ_hkBVq*}+)P0P^ui~7p9b3f z;x+S<*=*B63`j)i6|vIPnJ7@ux!hDj@~#ImSQ@Sy%SK0=;V@8V8=y@4G?vtcKkT~g zgLeaAK-(tpt(rQwrAqTHJ2GqKHe8=HysRPh?U2@nScJCrnnK%1H{kk{)lJOYo^@%` zjC$Mk$Vh8OizMvJzK@L?b3e{XY?WnQ5e{P_r@%(ntvWIpIK3`i_VoA{)v1@ZzP-b` zgS++oz@cib9&fQJnyDyPlwj{obLRH4X@qeB%AD|DFlT3O=1p}l!_ykI#7&ZJfYX-V z1po>1iPrwtJwz*&J(1i!D<_o@V!Kegb@9Kl(Q%UUP{`PHtRr3ykJTvNtM^ z@Ob}7c(x`{?#NY5S~JrjoJBBFIA~E|GPikb(CeO6(?*Apt=p4r6^z#`b4f2z?e96yZ*RD%M?};LT+O4338#21EMPL} zudNmu5}LAE8)O!lvI&=js--ld;u9cT!o9;ILwg6~m6cDlcx711Zpv$UtUv zd0_5tFmE-`t(pL2~ZrPTqY~Ii#G?PQlojxe^3h-BdKbbiGZ6~ z!L4iHh6%Bl&4PNmm$3}BlPqe^URAkFfU}jkWjgwynelV_AKg^_VD4BhxQ08Pgpm-h z+zwYE^#npcW6XQ@^j&kEp-tUzhn^vSanSg0*`E@Zqjl!nxCiBA(A~P0Hx-V54!VL5 zwCl!fRKp>BOoOmU#yRolH#ed2t7~3M&#OWB-?Wg|CJ3@HdXb9$WTl>e&&&^^tICOM z_HUKZ=6D~SpQeaRr_3odM^=4+;fju7`Z-|Q_&HJuYQt|Zbep0~)I9kXyR_pOw9&7S zBNZo>hzd!~ZvJ;$Yd+;c{t<`8kox`4zI-WiFj9TXn7i(HMb&>I#vGsVLHCyZ{h<@X z83T-!z>jtpHn|kbRFKmtkJypt`*SPxX;Htu+IQ%^w;8<=AhjQ% zm|)Os%(zzC!q7FOYFUZ8#k5ha_Nk{!(LcDqkO+tYo?I9BBCOB z>8;&K(z{bd1gO6ezbjk_wU)C&SeYZT(;|M)mDzP4ebp204v|Bwf_z;$x9{)P6${N| z`>vh>Irq$u<`pD>)!JmB)p37XTD$W?AcpG!MzP)d&oCR4O==5kUGC+krETYc;d>of zjbTk*q8-1-OmY^ZkCv}jYkKQfEPu1IEsjt6@@nSZnuTyJk$CKEyYu-8kcI^XMZ*O| zIfeX50t-Ldvd@w#NmmJYiPnW?X9ttv9AA$a4xcQMOVIIecGrCp^iwW|GkD)Be$=-R zI|BhKDS*a^6x}4NTKx?eKs=2U#El|dh|xJN+e~+4#|V%(;f{?%(}}lX*lm9>7Y2@P zgJ5Yp3}{KR#oC?ortH$Z!m-t)OQ3`uw`dx|`Ua^4l#*2)Btqy|8u|?1sn2~14V5F= z{j9$NiCxcCFe4X+J+nkYH+Uh|zTpNEWFf*iymx!|B!_gi^{{DfPZZ8bWbT%Da(P{r z%!mqgQp216-ByjoPFP3@TgEwmYn>lA9z(2_%q@51F^*2-`by~Vx+AEs31El4w{9Iu zD-&x^4=+JlQ39hiaz$IH7DKOx2zY1zXnI|S@+a^p7bx%-8$&q}s%Zimt7gekTBCKhjl}JW8yp2U7qZ`mw zsFdj}w{48rp;$L6^r|s!vWtq2mlVj!e{g2bzdYw)j@XkugY*U%gYFo*4d1BuE zX8`_%L%jetp)+QOtgwYZ2h#Vn7P{=>w_*}pXH9x0@WzCEJP)*&SW+zAqtTx%Y z$Ga#125s7rNS`HcwuHp440*Xt8Q_~H%(9?V=~~*uEIz}^Fc^>y+#W5C+0|Yg{qku_ zT9=J~MFU>7qjz8B2H@w8xQhb z=rwPozX;=7zRA^4v4Z7HWP5w?pVaEl6OFsh3G7kgS$`_@gz(!FU;lObPF&$5bv}8F z&R8L}Iz1zO ztH|mg-K%GyzE4h+T;<(!59r+q$AcRy=AWR%>JHuRSI)mD<|5KUjgBu&l%`$|+D7B~ z`#DKOl0D^-)ZutI#T`kLnzMNR6TA2Fg#1=Rmq`rD^o@j$8eX0)QYQD7A$2hWHcLq| zsMla3WAB;2Qo@VMoFB`#^_eFcLx-^@0rFLnbg71NjU*>6bXs;QRYuy^DFf8|s=4GHY_ z3LRjhavY=dK-MNeE?Wywa;VK!vV=u&(;!7Kp^D0csD2|!2}UE{IOpPL*^BhE=(5jJ zNuJa}r$yPV=(8Z-jnJLRum8mU*)sakRG;@R;pRPsNhz29Q%0{yQB57*+JkkvF2zm5@kE4ONrkf{RB*%ST_36az@kCHpQ_+^Ax{z0q=5gF&|14y3U(3rCx3jkyb&; zR8IyZv~BYG1H#f0TfWKAmuGyGtXs<7Aq*z{J+TrqZ8z^Hm83JMI0-2Rt!&@0?SGbZ zP3}u6x`4kV%IlG>cz`VvPK?uRx%HZV((Xekcg4}Uc0uh|z@woi>mEzFVBbOxSDNbAs;O+RsU(n+<*(WbE7RXkOV|zX@O2``++{g}p`A#@%mp zjiHBLuynC)CD)64$B+8zh~{nd1ygNZmR*a&i1EE{P#KIaC@S0%{uPQ`G*i3HDiPOi z5B~)_W^0od_t)eY%9CXoiw56nKydwOoor_(N*XC~`4#BDe;6enO$Dxpt9X!^>iFemglsrUz)v z#GR|JoS6%>f7Yq}X!zmmcn6G-q$01uwE$-O1zUG|GcNi8d5o`9xlL%NKWfsTxTMo-?M*v4s0Ntd zFI<2`cQ}%m91ZHkXFNnhW9O~Vi8+mkFUjIFiAq8aWCh$!Z>U{1{5dd94DvbppZ3KP-_d9qJHLB2d>v}Bjo>CpTNHFsS& zin46@G0LGLE+2|87AvOQ_`8ubW`71PneH`P{XCxPExr>|6JvREa)_xjbn3W;w*{82 zp*>?Fse#mPZ&{nx=yJxd`+P5}>BMmj$}g)}!0U-YT!^zrgE`UBvYq*O0YpmX)_X|18d7kk+ZRNGppD;HXWZ8`(2GC``+4mcZjr`pjeTo+^XOx<2k!$ zo%3|=yFE(|UYN*!LbmR|3Q67x<3}Yc@xJlv?R;8O+>?D*H$Pviz-qB({Fj=zQ8&0f zn5I+EY*wlHaf4lk@ey?qmq0y)fc}svhmxLm@k>Nf`Nr_O33lcFV^-{DEiW!}=g)w< zDN;TnX_SMGy_wo_wiQ{zZpdtT!hIL|-@1byzr?qt-?{UjsHV-+%$91^Z{A^#;11=O z4A(PYybtP|v;vI|nMQPXCw~w5`8nzUWt9~t>WF+McVR!ZimTVWjzF0%A^(lCOkroW zrj<9Q+ok2;*oP>}B!V@Dj$2c-j)5)#wf{IX5hgm9^9Ru!*D7WVaf}-C(~)H9vOCC@ z4k(%Ljb6jdP6h3&JveYCLm=rNQ6;ZSfaw{Aef3}=Zb*N+hQTX5;bI>|_NfaD8UC5H zm-y}J(jt0`z}^8I-H#he&XaZ$Ue2Jf-A+Pc{uC9!wmy|lbQYkzRcmA&5w0IDQ!0(E zf&q-Kevdc7I~q9yUpNWlEKphHxWhLS88yUJy2`A+dK#iO`#vuGx-Xe*8^TTq zP+82LG8CYp!5(41OroBrC-Kk9X}HW2G@TY_^|*ul6`{$qdjCK^QqdTBs(?O`v((z% zzE*o%%Vee7lfFMFt2&u2=qRHX`#$=l@0&VZLmIE;l$h+$GOwH*wHBQmoTzsztNH-Y zTXq)(Sx9S`x8kvM@M6EWpfP5braC*JpStANVHbMbBw1qDZeRT~J=ct%maHRVHB~%! z!6y)V=k@YzM<7d2vxH^r&p9TO7kJ|9(ed~Y38WX+E#ZYU9Apf-)-To#y7oPPAfJFL z@&Rg4F9g2;@3f154&6Z?-pI+heq3tk8jcjh(RkYB!Tv0WJZWYpucqBTR@8U3hXn8& zuh%)A;7d+K)YD}&X;Bp~W-52t~!d^*9CA6e;U_EOtMI=bVFL(ece ztvxk7II%mtn-2yKwX0)_7#o@iT(uDgCVDKf$p$yEmKIf(Z)LUHPh@89DX{9p1S(T+ zcBX21HGIR`@G)5AOSATQPlg0h6y`v!<(bGH=Aqn+>O`1A&#%2+(@R%*dpKTDq=Tt% zkugOWVe6Wqaavv=?WJrSZtoj&vXRw)s^La3?;C}zid1whbIrEFlghv4C8fV5Hg<(?>}LE8mQC2Rs0b(l3R)(rr_mi?Qg6O-K(-}(I1BIgOUAreoDhBbbz zTscBcTja9w_>Nh~5c8LTlG3#t7i}cdY&Laho6@Cw6lL1zj6@DzgHC;DaabM$y6u<`c6e~#|H3ql1FlBb$#IKtcG^F7BJ&w807eV zVcd9xkd(%5J0j##!FJ`*foP&cpe}rUh(yCO3DN6}2mI_B?7{)~pp;9yQRFLbQYN4l zs`pTm;-}LQwhpJujSpPFn~d}>iL&Gz#P=VN`9jR2kNS0Q5tb$u*A4CyAkK{$pgQX` z+PY-7a+}%N8A-0{fYyGenH6}~JYz*PKh(5dEPV87o)qfGW63+Hv-ELDHKB&K{hK?9 z-ZZr%7a(yUX^&a_>xel^`d!#&QJa~6E$_ch%c}&2wa0E*G@eh51&rT3UUXH)Zz`%f zg^FRS0C=lr=L`JcLD)^I>8Wn?X-9fMh_ZPaP?rQ{iTY2Cm@ZQEx>|$k^P2%Ki(`vn z*GWz^dRRu8J-q=5FSC3oE_S;*$8h2>J6*-$imHMesO`@@{AXg*Em6iDjVxBO_F|O2 zCvxh5T4ee5A!FXWGaD(2m!>ow;dh*LprQN&X2;3^3hI>J>nr#?5G13?BRk)~<9#O* zRa$zk{|=5BYLSr28=L0^Wj!wTd!dorw&{A7LVM%X%AQ%{P_67Oq)cZhlzA={FuOfB z5VPu)? zsG=$9Kc@Mrx&7<`O0}qZj~sou1WH=f$%slT=RNx1L$F3G-{Dpn)7e-ej7uA69{mfJO}KB zKlRtxECMoE;~U+W>eFG7nC)f0N~&Lq(6Pxl`-8zGlN+n+po%ho9 z2@Zv%c~ja?*{YbF`Wd8O{)5-A#*8IL=kb?e*GBbpR*Buc-aPo05&b7?Kav-i(dj0{tF*&=)D6m#<88&<+pzxzz`li0rD$S9jX zr;4Ibx*}{OmaJ%$pTo(KECD=)v^c~^%wwTLN7=!Y%o1Ng6>0M3$!rA4fIR|&;9b$YD9GE$ja}z71QqMay64FtkH=g&qjoED8zwiNc89uw6SkIJSLz3 zNZ3|9nh&Wcd^fVq`fC-&;&SBl*$svrJaSNzPr72w#_onm(vh)h&&))9c6ISdsj# zczFa-Lvz>td0lP}smO0mtM|JiFRRv+hmohH1*o@**qbHiUT9)}+2JstaqmJy){gDZ zykcGY=$PmB8q<go5BSMe|!g_cK*uaXRi_ z4|&kU=KKntR(tXl?7fzmJgF89w)JrOQ5s;L+#B=nwN{_B=94d`iv2owF=aB$62NE9 zNq@JPQ#a_A5X?7z+^WvYuRuPs^FvXsuU;Y5abSCBCLE;I2F|?bdL+MTX^YcgHBF>< zTtoUz512488;bti_z(gm?k6Y8mVX~!T5qenexJq+L(nV;+jwx6siu1u)rPg4{&&J3Z*rtaumQV_)%5%v$~EakEVv*wfnA)uTS zk^=fH)c1;&@r8%$6yz~-W38G#2Zd^s)Cdg>yxId?goe9rr04Py>buAqq9B#OWM6YE zW?8OtSpxQs<4S|;Lf;r#Z#>{>SzSEkPUt&Q=Z7r*Y^^4$^@MR5G0$gyZV2se{TXBA z_PgHCPixBh_dV^wV@C(P3uQC<;yF2~ac`UO>LYqQisS80c%!eH<8mcR#$*!HNgtS^ z#~T4TWNX-aqt&V3eg#!q-*u=qQW3s!NIy`U&JqgJI`-~-J_%-JZFZ9)D2PHqPb#S^ z;wUj$&%E~GGxB3IaqF@8Zot_x;`0wuR9JbA)8XX$zv#Y$WC1TbPQAqc+Nx<2xMw1k z{RlpV0=rT4On%zQqryfA-dobDIfsYTp)8(5pCUwQtL0~7m93p^-^0pa@fm%V@7q5V z^8;TFf_Knz-853jo`>`Dnzy5tX;Mo)`Q;;u_<*b!OC45W`8S88sosfO-n$@``ucSf z1CP`bY%%&{5!E*+J7SM_8kyRwZ&gAjwmz*-ph6M~z7drZEyh^+M zaTglH=J8X95B%$DvU{boe($pH1PBY=up`cM`b;>J()nX$&g|)b2J0y#HMreQxj~6kA%CSxvqc-5h)`!A3Rd)aWh{xJ3(enEL0=7 z0Nfiw?X=hsu{Xqi6@+p0K6hxyMYim~**(qGSKvRff$)3-&qC8j|7=5+oo&{B4~6Nv z?QLF5v$B7_Ic4203Jncn%?C>2dL#rCl*0wgXk65LLj}u-SVbMhN&Vs*-Fq2#q^G%Ft ztC^D8wZuwmH&1&Yu@4DR&Mre+Pn;ItduS$bOpIN9aNJz8oX`BF%g7ygxXa6VNxslv z6_%TGvZW`30`O`&Hk=*IcBun($9g@`fCiNS?+Cjngcn~#W=(ia(9SSDq z4NvZAYMfYcUTI z#|idG)$REjfsDCnWjaWUf;5~=;C{cN9@1T-(BHhdllnbbm9zD;&eM1|Up`RV^q(xs zoWR(}BfL?#+DhrJ%ooj-BSK#^+Z)%Z!R#JRaU%KZRf*#g|WyguK z$NNO>kq~>hc`3%qTm=L=5mCUvW{D*kWx`^ztOQsoRa_S=O&}1N1P!2{baSpz&~L)r zWez_gft;siI>+O&BYs$3tfm>)IBnFU!_|Z#!y!y_W;Zop#)_T(cL;TM?AVx|kVU2R zjO>-_UyRcu^SA|=rn7dBk13a%He8(JT|6~M2}z3R?o^lX zVB_wpmt%0X;lsp%GkEj&Vo98o1qc%L0z`bqIK%JGCCo~xUp&Fx4@K@Xiri1}m?cCU z>JaAlK>Ae8t&g~u&XfT<_|b>5H7fMar4?L7N26Td$+=cIFMuDAxBiEiUlwdR0FTlW z8|nGgs=2jkEy_7$-5`i6mX*}tII+``gxuP^&(^o?*b}BHeuF~4R$><03`Hh{()!UO zHJxX%wj3<$dgh%M_13^!oKKQ)t7XloQ^5E62VvE6d1=%7rTcKVX%v0cf-hgee08(u zR~$5(l4?}UoI=-t66)!+ZS}gs^2q14I^srhiUA;n`jxxBdeiqQvGGv{mRuU<2<}rj4 zVlt9e%80A^#<<$0tPgOXM?cU78IINqkdhAG#-1kc5wWXkMpt6R8X5r?R7K$rMm#** zTpN{c#gu!h_rv06z4QxTt*m7ChE6t6ZA-k=1wNdNdI4B{ek z;>WA<&)<^$_>G)h06cVAF@>r0vN3|`Z|w$V@AG6NBE=APuQo`cq#so4LNLsh0v_}@ zb0uE_qnvpcz>)-wNFR6qoe_59qpJ{PM(Mjbp_cOfO2kCm`L)6m8Ud;(#aVEE_RLOQ zL)X^zOpitZu*u)x+V@2GZ9bSu#i|E}`UT5>(RH+|!>JLdk&{IT(xO963BRBJ*}K0= zYk!WE!uU=yKp7G8W48q{HI=W*OSJ*WsQqVyw#L&GFtL{uC-INgW+0L>g*S&X<)-^NYyMm z6uCD_0bU|@XMF%u;7&TYuL+-qlXp1RH@&o zu)XJs@>8`H&)4p=x@L3vm?1BPP#+qDzd#wWKVwD5$1&J^qRm*&2MB?%*@;Lu?9E*+ zPP^Fkrs;y_j+jE9(?)vO81xkE;dx&C{agWQ{9X zY{iKNe#@e)6d-n$YuZ_9{mf!Sot3jAPmP=NT^HM=`LxRlgK~tksr}^YXiffZsgsnA zC>7+dzqbh>zPw4QM`BU61&k)nDHp)bM^oEb9Zl% zAjjJ(B13BbL-~2cJ9oK6ZCWZxrT=(_0-&p#fIg{Rn|#q1^P*y@BkbuhkXSJQ|jb6%Joum5o7HRvYd z7|AA%o}xLj1N5Du|0@PoEMVHYmKo}k2{!rGcyzvQl08IQ?3E6*|El6~uf!@qM<_T^ z<(Vg}Se^QM!rmz5h#$8p>KM523Jv`ZL1Zy3Bq6n0?mU7uSh_jP>`e9i07!elD3OAD z|GBlpy8Qhy1gV-}W@BqKvoEJD-P#Agmsh{R%$h_OP?_p}g z^y|BxF=Taw7;5$?n>K}CL6pco{Ns0XorhNeFIR4i#H+8>Loeg%=W!hoN75b{c9Lg+ zI!*AXL(X8)BPn9|YlX(4Z{48br3ODw~t z_%;Y|G8*~uSy=R$faieoB=RWTyMyY#WBDTr4hg7+-+f=WWY6ySGa?H#wuHxEG2HGj zp`ehzR`8^_yd2(i)$~589lB; znuW@to7P5NUxB=Kl0h*FmJrFJ6&o^PJ3dj{Qu=gZj7P$ohR4{&U#oOz)4zXBc}P>_ z25Wq5Dy&~;C&Y<<5T(fM>LF&b>gY@HRO`ne)9^?@YAa|Z!itOH8|}Y&i;89m#4)%C zZ=6JREclTQK~Rp+i)_pUy44htvS4C5^7BNe`d>hHMlkg>A_x;~PnGUaA@yiUVf8q= zSF!x{751$URu)XbbpJ3S6mS)gHDkN9>^r%>+Cz^9*xWqWs{%<@>{<;^vKH(X7|S)WS8)8asTa{qXC?|0uy(8H;1=t`Ne zpqwoG@ACw-uTB@w-x!!F2amGT8hzP#8pZ6151DNAa1bF>X|f}1_g9?@<^eo;tFGWX zlT_Z4IhGzVA`dNKvf(WHven=G3bBI5d)0ETy$0k52b3gAyxk#(jNruDp5Nt6?FN3Yu)u zSDlKjgbd;KBT=fv+&Gh!(t~`X!Z-;^RYQIEcSI;jBmqJY}3E0vX9$ff4%h5Pi|d#}G$fI=mY;Oyob=#o$JOy+m}exx|oY(>-#A zN~G{XDF~{dR+^-_ME;SA=;J&8e^(Ora+Zyi3{!L#DkeJ03yJ@He6ptP7yPbO1~&u$ zu!AOgugsaP2&iKX5_%E$N;ZMXnvrF(ymHWeh0QbSZ{X zRldV7W;1$y5XDQ==yT7Kxn0-e%;b(+wYz#+BCoW&*l#b27P?HN&{`-`?w?k#9DBqN zg$ku#uIDP{Q~P+VI3q1fAjMwfW4wDQdwmE5JZ+mZablGYyt>86m0!O`c4>6QFr^M) zdOt3<>|-Akr{gzzCtPmKO*%SzZ-VS1C}BeGl68WHRa?KYe)C23s%R1v z@qRc`i2J8HxU(1>GS^a#>nfo$BwdqHsGW+NDuu01b$l!dPeE6_%Coxnhh-0V$Fq}0 ziVg(dQ!LHmI@kQ(P(#hmCYR8skc<#jvq*7nv@?ey1L z+ESot{dIJy<;kO^CqbJg{Fms3=OZR*TQVMhlvBvq5Sl0c@cC&aAU+6x+oq;2(Ji38 zXCRG`F-1gTfil|M>hc{<0LBOM<=^?MIT)kI^>S)tz(%yoScM4q21EF&B(KzEx&bdW zSslOz9JhV46f@jkbR_?vVfbfb_0v+lwtgvg38`P%{gctHSOk~rVU z5!$dUeQ@;-8>v-vl`0Ww96eJt$q;*4yo7EES63)`%bF$JVlv61@F<-!Da)KbGFazK zTSHf^jLO;?khVrtuOKl>K4<-6R@sz&Pw0k~Y(f;xg54cj*0^i^Az4!_tv^fG0}SfB zVQeYm!s9t?DNI6X8x&{vsO2$ssaN!++qOQFRjZ5VeFV4ycFS9tI7T`hU9=0asOnu~ z9aT1_3dFkB&q*fz{WnChYWb_x&JNfkrOx(2kASxA5b&XKZO@;46XlazM7rw`few%I zf0SqA1I686Sa~qY3H))#X+Fz{9-uO6iv&(+fQkocsiVt0oc1SE)u<0c-o$;m_q(Oc zEj4yi^Zu&U9{3^7mQn_x1!cHy_V|W@&(FybE{%0AnAE-!PFAOFaFy1NTV&#TEAqen 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 FV1lDN#GwEH literal 0 HcmV?d00001 diff --git a/docs/ug4/img/readme/promesh.png b/docs/ug4/img/readme/promesh.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d572c49f8236f18e04bbf65f9719d421d7eb00 GIT binary patch literal 498178 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 z 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

U+~PNtYuLH%e! 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 z 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 {mw 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 esbs_NNhlA4cFhsh4d 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 literal 0 HcmV?d00001 diff --git a/docs/ug4/img/readme/springboard.png b/docs/ug4/img/readme/springboard.png new file mode 100644 index 0000000000000000000000000000000000000000..bac72e3b603f4d3e41e7b9dccafb197cff9340aa GIT binary patch literal 134828 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 z zS?3xrXl;){u$kC8Wguwq=4+%aNJCzp7gVz>CCg14r=(5ty$|NWvI)GS0SrNri>IP3 z%{R;s0V03HcT^!7UH;N*Ij-yM+XI}TaGrG-uFs>jh}%#;fN%LSsEYAwVDxlm#)=iSy>fyAqwAo-4DW5V=y2brZ`m*o<#iO~*S zgCcJL{SQQv4M=*0;qBVD(iT;y29;soYCt}|+>f6+PU%4=H&u89Th4*iA!yT4U$K~= z!shJ`r!40V#Jy^9#Gu36&O{nb0I}L z&h*@Daz7g_%Oin*m$F!{b%+IYZi}$AWoQsYPBDn-vQ~KKmSwMIH6JA^(9V58t?Yiu zBd)iUvkL(lWTS_XR)p z7~oDa5_%!N0+JlCUC^5525zZvFSjg#%Lm91KI}rTqe_~lX@s2?f{!!+Pj58QgJ3n} z-?VLOiyWPp6ZUjd$Nwmm>|sT%zv6aWY%&ZMAa1t*r*LP?y?9IM;q4$-4kNA+O~f!j z6r}Yr0h$PBh0Y|rtLIf3jl{|eR+HclHIFx zwLdcp9+)T$9O?->K-_MSneFWzRS(?Fj>jkf6{vTz^8M!Dx9E>ji)(GQa7KNzEXmx! z@$bCNUT)g0P3{A5YCDy7=U7mpH_WM*)O9H_(QV+`aL@oqW}SY95i~~1L+TZakzIq! z4M=OWBvdr>6bQ_5>4^^1l{NJHv6}E7lpC%5C?>-VHAbj_@&DT5v-q0MPV`3G4 zKaAa;Sc`C|#VN<)|6?tT9KLs4p5IXO){DjPWt9yvE@2}<0y_RRNLnH$@>HT>HE#Nv z31CYSzZxrqVGEv`T52JxB%o#{Md8s09DV*lD*o`OB(6s>FNoVr{ksJH;p8>OGXlhE zY%EC|a4&|7$spg+srQ}w4f9c-m=7G%zDOdOCwVU1mE^z+79K&`v)BE8@?Xa&+;{Ck z>7nbA_sC`ym!i%*BYyNd(wLvqC6y<`70i#yeE;rp|NT{jI6w#F%K*)cBHsafKg&D& zgbmaC#$>xWc=y<6-UQe^f1IG=R5#ssEUB7OQ-L@6ihVO@D_$9PAYi`3H@0^dHf~SD z0h*d-VxFFBlNQR&((>3WB?9)%rDL|XEtx%g0cm6DIXgN}3cU-3&}rX%t4+cBwMxkQ zNVNHbdj*CH>A-`986b)Ol=BWsrs_Q#Zx(jOE|&BD{hvC3Rua1u%=5_V+Vy1IyEFw9 z0+LN_k_f}>ygPKV?{$@z7B4xpDRMd`rfIQ*psf6BcR_`{_E5q2I`+Ngjh!6qAQt9k^=U=ksy0S z*wv8A|I;V%`#W~u%BbTW*T3|)eMX%Vf4EF97^{u>eM~s})#gK> zDTVh9s%+640fzu!vZJOIk8&ccVU(zdKjp}3@gTxgryH41(kFL-6!f|``gy;8rfk&K}#nd0o+t8Qi^{z`aO z`X!w=XSI0kK|DD;CAvL&AYC zVg>UQi!{Q1*KdC*AjqZ41h3H#8lMXw$)7$bCXiV=QG&6$--Vl$nh!K>smXM_NR?+Y)+zU zrBRuKf`-0BC-39{pI*qxg}ve*RMb$fE1H~8-PxQMb@pb7hTnfYeXkDCD2m_wBu5Rs z!i?3Yc*iwVKIxCYUE7}yPa=dhLYyc~Tn7MjrzKdphAKchqc?s~lX!{xzBGd1hM6Bx zW5e)p8R21`r{{P8++mh7DU4FFsT)-DY(0qe`AeuXTVhm+xRqSwU6qw>Hhav%?C&=} za=Kk+NV#a^2O6(0J8=8{X!{I|Q_Esjkl}*A&^ha`YyuKT?;=b6mnpQ>xPk~~cS(2I z@dedvTtQ;%D8E}+aMKeS^tYcQwE0+JGuTNj*YH=7L>$w>)IGv>D*t))y4HEcuemk$ z!VYeiZ_jgy7(LFlw+$C+LT&$Tj!1ZbgQ8m|c6$$l3WC;wDrYR|)st)Jbhu^N62gCt z?D#%S8K9k?!w$AQw-DP;%%XoS^{XSV?>n|v50ZY*>77!Yi;s+vqGoei;zd~Fg|959 zg3`VD|Khu-o*cIiC!?_M6(Z@jH58cMps&a5QNU6Os z1JX~ml8<>C#VQx7$FSOXfx@qj|5-WTbXB?0I8yW%v$i%u3VyL z#GQAh|2xSJ3XHCOyL-2t|Fu`fQusmAz&DT@-nPdipeLm z&B7Zz*tZbN8!i6*O7Et4#kR@NlqXs49@ZMKPsyn=Vbfmie%g_uF~+)0^mGM}3j^)A z8=mYG4F$OH@~(W!_Gzt--W#=hHobP&X!U~8RL(%KWO2nn!}10ikfx;bA=CRe*B5~s zvc9_m(=_+e>(CIc_w4PG^G5pTxtAwD<|4+T_vV%-Tr~Vt^f6xE>$6R_FKNi2dA#?Q zQ$&64>L?4?{=RY6#TKBl~hD+oYEN4t>M*up_qtBDI6dyJEYrK>TX z%awoa9Cdl^q+J!SfH|ybtlDTg$-2^1T(;2`@hqNUw;HOJL(`sI*(Za#~{8)CO zV3`tfx2b$gKo3HS5s?n}{k%A#6)jqT;T*3>|7V-#>~7YTgSXQ3{>s2VZQog~kmU6Edlp>d&yBWR0Ak@dCZJ2y`S+)sm0m(&)jzOgF&81Bj7RQ{?`9be&n9cnCv8mp2 zC9a0kq8CBnWg~KL5f4Fgj$f8elB2=e{J+vhBKvOtJl=T58T_|G-OXP@sGvNFbBr3B zY|jv^LZ8QTjol4d!SDLLr>D$SpP;BZ zw)sbJcFh)QT>g4Dg(#?Cx?yqu$DeAdcm@u#(hh=Z#Z1R{0ZBfHQ^8LmcQ*X*&@!pJ ztAt-9n^8B*w{W)KK%Mx%Wv0{0F?cXf20^v&WXmUD+57OwkS49addYl7doA6r#5?pb zp@yVadeK>X^YO8)+g5iGNNs(c`u^xRG%#bs3#2AWoK}T#v6x^nTqjPeixpx49Uo1 z>D|j_VoHKA7D{j>)DrxQWtnc{>B_8$NV=8 z8|FJJ!T?t~PoY=iB3?Y@N*Y)!0~|n0<(?|m{&-Xv4$DI(dVoUMN^>cv=o^ z`sSZ};C+jpGat)yW!^hOy0s#)D%=*~=5(2L36F@ghVEhC?jjibp?Z@&u0QT9J0RSa z3S-H1BCP||V4t47`pQfbv-aSg|81Q`cFA+oM2QRUBLku$tc*dn&DUBJVafbJ z{ZOd!*Zm+(1o|?S2FTKI+{gH=C`U!t5#fHJq8MOn+?yJJA+{ppoD6?;WTLNONnD*i zrY-2|AD^&W?Gq2e`dk^1fO8;@^w1)m$$R;mg*ukr?gFWusY_u8^iWu`6gNfE1*8|a zfH}9xge=JCAP5{=e5z%~)`#fn2qvy01vIE?%C4%)phY?(^TxJaHkdC}miua%;HA<~o%cRJwxN0sIpTA`7GZv0m-4M2ZTZD}_m`P=Hkx;!i=io6*N-K8;p7AB`q!j&>lGOutm4{6Z7g_vsEid0+E%o$;9G6d(4;} zR%^%C-86wZroH$)$Wbo?>8gzvTrCG=x`<9ud94(HKftSq7UID!vPWNp1L!C_7PnVU zC~G-2EhdPXHpmXBx@?e}DWTJ8qIl<8%TGl*|J;^-`i_n!p!30Ag-5(N^~VP~P_)r} z4?Pa)WOUD`hWW~;obAff^i3h#m9k}I2zPb2k4@v!OoC8(uCc`bl$YdT>k zx&vs=Lp(1wlL9OQqm?|~xh0*B+xM%yH1$^jOA=4(z4q;_`teT$JM(&i)10bqP>HL4 zzKy#tcv}VTm6%93j2#3!|mJ)l-Rd zfSuR62)cnX)BG$QBg{?=E>c5&&xUZ$8=t+kn03_$Zpc5SgCnYrWb<%xu$^!inA0YP zE^x~1tQr!2mhYjM>Jrn_$JTR@4Q1wkH|Ln>PQ?o_@^*=_~Zm)l3a(DUg;F@VC3|w!2R_ z?iWIOeRecs##tXIrMze+l&{EQ+(y3dwsrS*7+IOg;-1{DYL0UtWpf0C`3ZeYIO9)M z*yrOH+ng;9zjB*7rt1f7rv?4N)XfcM4R`2%{Onhqs^gbAC60(PrcPcJ1(b?;$(=MNO5(UB_H%L zr|Iz5gQ9*0LY0zr*>(qydl6}}9q!Sf4WK_D&(m3Z=XEYu?!Kf`<~} zT29Ys0INk0UAWvNnjd)DKvIR4ljYk1axPF)zv}e8ZwEn@qRKT|DcIL~fNz%_HBh>@ z{EHJ!llIS5A^~JVYE1%GmF0KQX=zf-t1nrlXRdj}&e~wDcT%AMxNF%=ozdMCe8q#T zD3P>RKkjhiG7|XY!2RSX{ik|4&6;`<8(d}^Zt*>2nD%3=>T=7vtCvvI}0s6M} zd{Qtto%G@ME zb}N44Y))TAVfmDdW>K9n^!2-$wPAYo%d&z|gr%$*Nz=#vonY(apOxXWi3%=F_Xb2B znK-=nQX%Mc$ue53I+y)lePiD?Z~t9?P4>vJ_F{ILC>cUD&Ad#4Mlmjx7!9cGz?0sD7dsOK#$FF)P*pt8g& zr}X5>y1K8I%6ShrUD(cgz5Sy=FSYYc!>63|Y3S|zvuNL-5AIr=JYKd$h2H!~AdsWg zW1{CiJz6Cdi*Ez;sh6nPRr{tlA<=8}uW(JzVkpG@RCmf`sEoa+dao>c5#nAPVA%7>pFD&-s}~T;y$F7pbqD0)jG9@yFB@dIl#Fp1VEwR zIi{vWwch~pb>>*5ZyPFsTXfe{yA`;dV|J{}gIR(u5^EbTzP-H`?GtaQAn;pb%l2c~ z*;>t%3m}9u`Qs*odtcP{kc!gP+@f zv6*q1M^PBX`blOFxF+_1n1*i_ffj??5%!rvUBl0 zXO;QNL9N*{xvAlxJvm7e#hx{7S~TgH&+N+COGoa*BZYSIvv(7HP6Yax@r`n77uxS6 znRAVuo!8yfRe*7VSZ*)3+@y;u>DiFIZz~p-RJU?i z|LW>Q7*h*Qb999PF4|0m??3KH+~;LYKapm@S`!#0VM!z_F# zrD#BdE9_2bGyozwA3~SRvfCR3gTJ2o0gao;d&2E4#-N|-Ms z@BD1bH#T@)9Qse10QR*jh7=N%48J;drbJ2q9Io-$W_OuAW6Qb7W9>x@l=}c0xhEz1 zY4RSo>!>_x0N~y+^Zo^!9e^k<5)9-=0jY2*eQzEJt<4+gDQbHER3fHipMUa&qPD6G zE&TZCBPk>du+zR=BGol4MYCR+`pp272BMQqK$liZ8*{GEgZ;!E?gM5-$*>U!Sb0ULjz??XAlb;;;2{F!3?>TlMVPbG`_YcP< z+|&Hu?w)$X>efG zNU4%o>2&kbMR5wVcGLb=f^*@Y>I339IW!9%eTMpVca%iySF%!QpX-cFzfCp1F7`Tg zvyou_{Hgp%CJqocOke`NzyA9ZADREI&B+y!1bFTf>2>*3das*#zq!&mYwG_saMI57 z;SM9)A-B7$k!c~;!eCX4un;3AB>pU7fZKFCF3lc0D2h~d=UK(<_VqG&^{ss7MUh%! z<=xkhYeMHdIOyUQE_)9z#J=Ql!V8wp^i;upw=!%BP5=j`@g z3m41Ldpw~9?@BYxt9jUqlGaPJP8Z{qtEF{*&-%zhvQ-wzt6)q zJV0BS5R%UmKjQl#^uymJ9|`r3PxH>k?lS}fHXHc4a?kX6_su^w2WBNn0bf0hTF}=4 z1^7>35n9uNRx9KrS40ALI_FIP;O!`sBzsyxoy_b18y)~4Uq&R)z4nP9O^ltk%Mib$ zklU0hcshj=eeG_bzj$TbpU_jqdwX0(;M%6LfQ2o^tX4EQPxPL(i*T#kv?&fwy)N5C zmsR_*CZg3H*y7MLNagf3F^i&1lJ)LnEYY$${hfumsq{VW4ARS3gvy8zSi2EG(0o6A zPyc)R-ubZ&B`P_*nQy*n!WCFS*q-T zp}S3JOa$GGnVW7tO_9D9yhSqo<)kCOO8%s{=d73E>8`LRAYrETUO{Q;*dL~$hL^4X zj+#~q`!p(Xr#FteloNnyzH-I5+`zL^xc{&8I3dGS8X&&(z+oWef2huh>-_08uM;5K zOLdmCD9cNnwsvP;{=;c^@L-D9l8$Z^B(@@6=y#8e@OBc^#2LB;V0-x+O^c^242m}w zg5H_J6p|HcEvH0ye9CGpNnmbI6)uAsIIfh9i{Aj)J!+Pq&D5Cw!%5B4i@nVtcKBwW z7GljTaAK~*Hl8JA<@m}UxpcJw?&|b{^j+ZxEyg~@Ry$KmWIq!~EZGP!4Kyf%B*b;~ z6)}z|ivmHqD-FO-Pje%cO47}U@6IIa&y)YqHrLqX0C}yIqF=Q?>;?E>ZjFR^Md{26Yu#@|6=PXmZv=D2}T`YZQEwmrd5f5FD<=8%*0nu7~!7CEB~vXV_NxU zbjkqB;e0W)SnQiYBY`E$>*z0jy*qov+OzUPyQ}E=BTe^l79hC>6!|F%2*i75CvR}T z*H;RsBU`9 zan8uWgSFg6&@ba{#6Y$Z>6>kyvzW-l44ns4}(;ynFiFgRi_ z6-!RPA_ipDffNTIqgV5<6witkh64uhN!Hv;)zaFvMg|jRqRK=Nt=<*aOhM;wO~lpf zQh=RPM*+@viYGO9e&ZV1DmKLJ#x=%o?>N@!psO|}xg=JiK3t3Vzx8DmI>Itk>a6{z)@Q=+OuatrpkV36V5jt%Jbq2NDAqOq1FHp)Gj} zs9n^8vS{00@bbmm7td{ED{R~bfWm&eJ{5ed6W=ztU8Yv7*h`grL|A!_C{hvQ8m|7G z%d#|T)j$5d&Oc%5?4*&$M@+8e>wPwg-2WD#srG39xNqZ*w*-a_g(Ti=05h_oy0z{x z*M)Mb&0|3Zd76{F!PqFf3>O6xo7*IBh?G})!wp-9Fav!hyDr*NTl2QXbcSGX+J{#xNT?`8L~;GsGeFB zUNO|3a{oOksokFCe_iZ!!$yytX_5xsLF;==B>dQcREle+(}%mIhuGS`mq> z8N0nJC7A12>wO)egF*28VT=<+1%rJ$zxaIf6q_mXewjr)Kn_@W9 zv)arLHi7Y9X=EF>0HN(HAJnf8{?jc%+>M(!pmL`#-!d_s4W^!4JV_Xy((pZZML{5p zYwe8C_RaS9|9wb%!#(}+I=wb0PJhkVIe9Tm!ydX2*#ywlB(uqC^yiv4Jtsv&xptbi zKN#g0-e`1fu6}m|5@x7jwDw4 zfLF|J0{yW=faLIc!|}frb9(kvpxpnTsQijjL^m8Ye`s0 zgmM?hE+4@CKO0@Fl9x0Gq|&OZqP3X4as(}UX?UI^Kh>M z<6~nafvo)}{bnWO z?8+;sodojmyQ&Vvcq|ZIAYT>He5@dsyk6<%}(BDTvDJ0wa>n3v$=)&9lTWekkZc&Oqp z_ZPES9xRWxL(kJSjd4KyJ;GXTBN$j>j7ttMf_?1$^`4O z(-P+8kBxT*V5VGNu8{6b7eD3T3EtS^(!?H*z@L7bwp*B~MUa#;yzI^HBfmL^d$Jaa zDiJuv+HrN5%~is`Dk?+B_xI}iPe3mk{HRAjKJJH8sa`?D6n>|!JaPn{@+rG%UZ6v+ z#xocJ=!n?LLNN6g-MyB=fQNZg+K3*g7NRxhAxPz7F(9jf2LJ6e?ahYYLW52Q4BxQA z#HDzF5ieF0-vc6_*&hQ4BirtVr6GS!N+ebydsxylgB{`pRcih>nKu4)MyWWE9f+O* z=9}1{Vp6EWuOMxClqVzMC;>!^tLs5ry#fY011e;MHtaDtW@y!m@_-wL7R^;j0H?pi zT39y$lf4VGIkuVslm9h7cd~^|V*rz!7gz+kfO)#B^#siX>Q@!;{X@C#o5B(+u_cb5 zSY%@_;mA(2i3RysP)M^Rh!aTK{}av7uvjPr;M@o*kE(B6@>LWU!Y(*r7bS}oEhS>G z1?rfLVN`l_D(xb!uWcf^_v?8-pO1SgLKfkGU)iUsg_BKg()Z8)MPKn0{wSSc%s4$!zF_%d z&l>pZ+}MMwc2Vu$8s7*O{oeWrN9{|6=jVivP!xw2?odAzKfmi2$au{ZKghwjnyXlq zn`F>9%Ka>z$8J{R!Hm8A**TRfuRsoEEr!);4#qp?(ZreXCIc_j)YV+hvh+~%^e?By z?5dB7$}SE`)|C)N?|M74p*`(oP5iEC1~LYjYGKM_VLA3dyg;`vNRQ0+2a%u5q}E8~ zF6y`4x3A+K_k{h+5<@^YxZdlos&mD;u%DKPp|keu$!c%-d$j*iB_>ZWU*5s$q0ix3 zU>-X}KVFKHPWx;w@h2i-wP}eh;I0&#^EW%KSb~*v2C21KN{yL2aJt)9aSTJsu?rr2 zI};!&ZnxxQ+C`6ai-t|J5`qR1jim{LprEgG8yH4rmQsQS&$ho=xWaVeJ%bfcjr_pr zR^A z$Yr5WaLk2~JSBCNf{um`BV+hb&*eU0kh`P}A?fj#1R&X9kw>B7eYZ0G1GM>ej2?Oh z7nch+va*BevY#0?kHcHQ1^tAY<8Xm_W3csZMy$3xMCaA&j zJwf~&3;XR5Y}64l%tH;?(vvtoMxI)9ugqR+Z_hip5N+jkvr@Q~dh}gY1 z4Yj*}6)i7Qk2<8X`rHyowH^7=70zM|3PQMIfT^?AK2m*eFfFSde83px2o*LpKE~At zLVKTO8SFy`skUA|a%N>;*L5ia`SqT9rf?4$pa<*C7S^0 z8zr^KU#5`HhyV20US8LZZg_8%91SM+(G%yi#Nlriw)RYgUU)D*E#Fr|U099sVIjie zR8ws)g?2{At|efw=>y@4O}dQt`d~pjEl6E0Br&DuqCJF}IWxKDukb~!fh{AX@4B2; zI50<9XKqut?FT5~x&3H~=Ls=1hRFh7)w(Wc`YxBRZN8-(AVrUG>8E5P*ry`>Enzw0 zHDO~ZvYOFUcJsPaVF7V*-W!jaJKRDic7)$dJTz`QGpn5!qxvS$q3D|xzhfUf8tA@d z{08qEOz!|&ngT=hP~gnCSuzw~pRHi04D6$6VG}EyvADD3Fq~g|xG)D-*e#F-!FJZk z&5Jt=tY520L-w=s7OYOC5n^m|S_whEXWp3l^4P!b_fNzT0rks3(tYLXdpmT$UmUEzEqBB|DCR(;ovfB}pF zo9j0;w{AB+7rGW%z`sc81HM>y7{bz1T<*SgRb;yOOm>1|Wo++W(EN8Q%tWh@)~m+&=b_XC7y4=-LgvPr3&HjFV&GgC-L0oDkuZh~ij$Vy*SA<*570P7D%GVwtRB z!wfdjM;|r*1sM#gY|WMe;aUwDK1n7c+mX>0)E~9SWs5@HHdF3m^kO_;A}t z8a}wJD9|_GVaL22^%t7vqD4*Jk*d<+&_w@^C!x|kl~(HWfF`S1cezUfWunh!e*hv@g02;dhd!$nkZJ!=chrb>?7-hB)PfR72Kq<2mbt7|SjEzh<@8^P(G^-PJBh5g$Ow^Hni%xA z&tl|gOOg7;`3rnFwhCQd7ybiu=udwY7|y!C@@rS?)Dl+A6q(7vsl34S*O&HQs+J+( zR4WIA(3SsfZ4l3D8`hiuUb-aKwG{)G@0Ac9=j_>mcBj%?4>D*){_Oc$#QuDHCoDO( zl;YXY-s<(iP2G}8V{*rHyd;R~_ynttZB)^(O5I9r?ddCG|A}2)T7F3tmaMs1 zyXwq};S1TT*j_1R4j%UTO>n!c*~f)hw$ubccYUDD{S)wkHk!Be`h@BR4^5rkw_wb< z>SI5oO(&D7joblZc1}k#hKLM)>vxJCZ=Q%si|5`3;^14^Xh+fXmmBmmp<8q5F2)p~ zV0iD4!Yq!az*^{SZhV2z;icJ26ORTq{hhTV{u=VXOZZ`MATufq$Odf+WMc#VLhvB?{iZEOvZncOB(h!S zbDuG03o!w1DQGT9Inf+yH;{y4%WSyU$lN>4qk{o)pJff>fO5ane5r8BKJg0FdqKGj&61ah0kQ4MKde z93_}`KCS$W=&beE8raL)yjR&}>+>}jg(wgRZoapv(fT?ydx?foZPf<lE45Y;zFNK4O;V-*Y)eA92u7dK}| z%eC4kIjmanxA?A0q&l3lQOd!1{Qd6tK!fPC6lsx#&1r<3q3h{Hb2k0r(TO<%clI}CTd zGxTi(D~M1;FX<&2N*0}gY84w@S8G;+N=UI&C!Y_wes|cJ zg%$V8hPUjMx}NkKR~4lxQ@`*yQs@53x6J)Q+LDD>yb4vxf-tpbj(TXY=>0l-(sVao z#YK%bH+9d^`g`-xK%rI-`UU3Y&8IR^e>2VRmD_)_5l!J7hnWQ__PI?L$pp?P@hu=x zN&<%K-|L9Ck73NDdY@9;9Pc5tm?a`rp(M@{VQVy)PnqZXdC2!u{>&XvJlTesDIk@g z!yH~g4ezHwBnh*LRX1nlW-#!x&-sx?WH}+PQ0-sbr=EfBWSY{2P3`)UB4CN!NXJED z3EUsA_T#}Ax$6^}(IU(#BLG^f>I{D#cxX`@<>WX1i;z#KNtr6O*IM8zl9V`pj^(H{ z=P&7hC1>k)j=62?$Shz^kRp|gZZLu7WchJm>f30UDAamskU3}dCGMLwT~5Zua>jYs z- z{A{F|Y_|rE&};P%}QXy-FbS!s}7Yjjr`k<@0D2 z2{_%Be4Pq)`W55}ok=(@rwu7=pS?Jb>&v|@%AHZl*TI)~oae=;d#Fe?*#WfMTkl`r z^fC5de&1*Bf>rEOPffkuR@6ZXpSikjQkk-H_RBk{9i zkA*3d9c=^2o=fx;)jT}%(1K10_t&OJ#Sg_o&V^zSx?F30O%~)JywH+!uWrVD^fKbv zV4sEg?mGdQg5FLyG-KnK*qx6xc)1}s(lI4*z>g&}p ztOMN~60jVOwP0sE82HA?X|gWeShm`z8(kCVYPB8Yx64%|+@I8X@4PxK~xx6Y?Sjdg&FM4;wJTB8*o-V;fOPb-#t z+PTTcFawqzO*vp0X`q|J{?8AZ!M->3VD0YnikD%NW>U9F5qFrse9sPb?cJ#|6;bzL zrk+6>s)spk@AG;yw6^atQYfdrM|mA)hV|gT7Py1JvY&5DjyFYsmuaoaq|4Ed4=7UD zoRa4+v4)sl6U^U2Sg7MEVycdqE+x;Polz1@m4TH^ag%8U&_h)bfmguYk-ly<8GagjRo+mE79vT71`10I-y(Z2JaCT)(0v*f8_H@P|*9H7AyU>D-=Jm$0?O`TgZf z2OR`K+|J{qk{Y%mRT4)fLBm61E1~wClJ78CvSzZm`1OgXCH#-~q-DZ&To7FCI7Gp^wJa zNhISvaaUvs=)d20mX@nEry0TFp^~%_aPW~oQ~XJJ(0+vMx#{ln*IxU9b_dsBb~fyc zKYt_RaNp!Yj>JRvKxiz$EH$OxIiGU1uhsNJCP1GZ-VBM>NyeVp6zQh#)l+q@d#7{O z=AF02obFgQEPKh2SkqbA-c$tH$u-;p7}_+7uzqB3gwe-|isma4@?^x~rOx`>KY5o> z?Llv~WINSx6mahTOLpf>v+vkCS3ApcuySf|T!fvh?qs7^2r=v4qsVV{%^$5KSW|A& zn51pf-Vxw%6vCAy@X74Y@wK8%9F4_j{@97-)kRla&;GbYg6M7@#sMq+hyB)PL*h@HDZDqnY8q~s}CF-T2x*+rOKac*1& zn@CmfnLOO@@}|acRfJzXgQ?Nb*G5;lu{MG)!S2R8c^RO?(`ILR=CPulA%i^nnjtMntmFkPNTS7flhw*BN>X zii|t{-J{U`E_|cN4d2qCF;fm6*d0m3^_BuQVp8>`Xs3v?zwKuga9ilu$1v#sOje6n zky73e5pp6oUR^=(87Z01@<2~a`l`t&5JNvY!jcz8s(jAkUbkEllxAcP8Of{D81hrFD74# zi<^6Hx_>7Oa12$`6tvs2JTrU2-_Q`pxmX>=ITAS)7gV;r5zFbR!_CM#_JLvF8~c7? z_+k<*I_fp`>(4e?%+B{Ng}6@76H(YI)cY+LC&t+>(bDZr$7c{>mh0 z*X~ydEU&R?u})f*(qq-pAGduA{Atsu-K<&R2UecBPYUR3r{-evk(9gnNV1uV7GdD= zb)`?zw_qzHu~~6#^ihw7h$u9?@n|f8y(`R&lK7;MdZmj6s`}TM(l4jD7?m~vOqjl7%VV#4 zO&7SH&xqHiPk7S#?=?H=uyF3rox7oTj-A=rH0AboH?e=2@_Zj4y30=zA7VsucrL*I zup&E`!%ahGgR5n*0%V&a`r|3y1(7Wipn9vY{fRkIxqu6_DU4p zDi$#!)Pqp^XK%cnjwJfQ?Y5;Bye%iNK&rygI$c1HaCM**%tR2SdhF`&y|TYzR$y8pqNp65b0-eL9=d;~$;94TyTIvw12=aoB@+{O_lf%*1|?CQ+a#oA*U z9de4e{B-CUzBoBGlDD{Y1*s|NB2>O&qD0Q}`nAjpcL^IUc)S{t&p{2O7iSDq4gPz- zT5X^{lc0N8`)_`bBh1+c7$WIltQIb6tpS*`L8~}>e)P_ave-nL zw(_yJ*6;g@%?;HKh>w-o3$DOKWjpum7V`Ty;6v(>m7CMl;q|pHD#zs8+c{F(qi$cf zj@w*;cWZz;9H>tSmBkX8qNfnPMm3eD!gt$AsYm&;JCaa`{G;wvAS!`eG9X<;0gBa5 z=OSz?AUcJ^;oHOaDKW@s2>W^LK+RXgm^83UwUO!4wJhKZLo_H(IW#R*5=eF1f3gDo z`29!lHUU6MLw1QDJ7O*Oeu*o_CdOOdAufCMad(Zxq(Xrd(sR77`n$tz!WY}3e9E^ zdT0_EKW>~F#rZrc5Qmhnj%n$+$W;jGNaL58N*Zkv94zMq`*>eN496&^uR{aZOj38L zf7(2H!11hYg8-Y>sSo{8s_A@SScXcc|5}*!UWdxPZ#(C&{IZC{D@#NJ%W-;^|6Z^_ zB^jh!0wg~O;)XeIcQOp;)HJu7{X2m!nqtE)WTWF-^tqFHX_oEzHj>VcEzD9C6oZB3 zm@$EqTdKJLdv|`4pzK+zzE1jL&SIFUm0OEm%?~8Db$SfrvEN18#Kv2ZYZ{<$fy89x zk70IU|D2Se%8;A2(JER$Et-yePlpNb###SFIz1}Z^~>FgMZ!UAfqCr(nYi)qPiYMu zplPrm=*RW93n>9@Jo_s6#s78UtA&04(RVFy@qyWsfxq3n3%Er< z#;=*|+4qS8E(y;0qs_FGG(Qy@bl%-eVWHKF?Jl;O(B6DjVcq*q9$()e!o z?hPl#mi1)XwHo6Y)x(Fn4DIZ>NmVV>Yo$X-H+yftmpc_wjE&7_!UB%=-}vl%D0KB! z!SZ!$n$-Sdp1x(i0O-F7b3x(ch{;o*-DK^4v?!w-Jgo_q5i}c!4da6v#s>kPxXyle ztd?u{rBe!mq6=S+mdhR9ma=Nq*Y`7P^T z-hu$b*wECLXTZIY2qsD2YvOAbOi%Hm*U8{$9EJGvq<`@# z!Mok|55g$&CR?<6lR!=c0hO2xDeUJ)sk{JjlK+}?4r}+9@r~x)D?UFIduJmx9d0v; zXDO!8UeD&)aIc^-6tzap)o<$esm;3Y>m$zHnA|R%HhEAyrh{s z&&Iw=V?%Ry<}Pz)Pr%@v@{fvPZ4W0Dl1ZW!~v3fdfi}np^$ROD@eeXZeRJi&#JH1TnzOS2?qbx*F#0hV(_W`HS$jy{vz5zfv;M4 ze93C$jI(6VE;r8b+w^*mai&QlDr$3nTi}QS+&989wK#u2#ud5fU>#ti+Jdjvm&n_L zI$5Gd^P22G)w;!HW!2j0d)!3;G=XlXZjS|XjUF(DM-}rz>!&OF0QdlqjiPycf!ksY zCkp#}7gm20VM?vDnD7faJ6d`GJB3NZqb^rQun=yJTkDU(H~scgK@j4|#BF(}oy2Zs zANBcs-sT%#?(xczP&J=ufbnoY0mYd{7yw}U^aI7*?Ol({JI1qua}#VRSPs)PhHlom zsa4&8qaX*}xiMdpo=9m$BsqVorqS0}fw%p#> zF9+a-p3>M~Nk&sBwj`$3?0EMa79MH!oNc2zvo0L`F2fJs;($oGInuLeYV@6h_UW%W zPOzyh)W$|pMyZg3|KB~4A{sAu3Xw}%3#5l88do`AV6X^;`&pW!*es)92jmJijOM0{ z`A7?a(sEiVogC@djzujdWNFl;kJ~GF*Mu+x*OvoFdxkOJTAhADs>nVD(y_h!IR-f+ zE05)&M7$yl$wzM8$Zsm|C#l~?6u<{<4AR}DE%nEKcUgnt)=E3bCjgOqECPE()+>uj z_WJ~;8=L!*nc5w_sEo5%h-V_;0l%;%%bR~_l>io9-yNcEZ1Rv?HXfK2y{b)ll zW7KS~Am5==sY{N_K51Ges~z5|VxcL&AM4&6pKv?~d8ka;xX?mFuwWT3J`Y(%Y8D%f zE*WeS>pGs0_63TD9|m!khq5gnpF8_eP{*Q|SpN8+zaT3fVJaCeAHJmI_4{RaiFn0$ zHdtbJF8PayPwx7#)KDpNFHQI=)@xz0rCqeit-fm*tUP}GwH3qox&B*HC8>aY- zH1;>z&-OyNTKcT;IIuYd30dNpS*YfVCYH&%icmV=7v6VGQfvl}(oWinJerIe{?hgQAV=80pnBIL zDqk9YwCazfA^+prokXP;JG@YL2Wk~homI~`1(vkN31x~&Uo&ToUT_e<;q5&AoHF(s zm?PcXjCpy!^T7y!!AbxLBGeE0T>XfrXxY~#OcRXY??K9N1n)ou9}&%7Od%%BMJ?+% zd!mL{H*gW_g8n|s!?Iqkav-$<`C>v-EZ(uf2M!n;y+TCH?q#S0N7)Le)S4nIx5_AZ zdM^Y}Jk*6hmfPzrC>8n|{7ZpGTp+Cc1M35|irfMi&Q~g|3a|o}MHb9h_)A zGX(z0grlyQ7U9l$o}wRlUyWSntji4LVSh-m{JFITenweSR(1uLBS%v7KrRA*GzLGd z5s-XV6wimunjDw=01m-&HTCEz9if_dcjCWh;mE#^tEm;V@=7Q01l}v25EuQ<~0U6)u_8)zw}ZCcRjL&WfSJW%Z$V` z!73g9efuDXbl8{n`N`ss`IGA>j438MCy&o&tTDJo*CbPgAkQwP8UpN+{=^ zPWE8Wq35NhFE90A_VW3kbdl|m3&ykOG~aoJS63neXvm%gY;O|#q5fGkw*!$|D;UZ= zIyzX6-jc;5`8j%TC3mSw|##^YyE>Rr4^4sM%-9!i7uyUP;os`A-NTY|K?e zrul5ul2x;uHR-qtW3lsA(={7*F%aMgLc-t*r)Q4kc)ai5Oq{75r#*lo+R~97Y6wO_ zF`xNX3{+Upxxl)x&lOqV-{qf?MU`+6RVqA>^tYLs(wwLc*^X7~wkk(5eVzW51V(k0 za7|0auYOW=Ns zOO9$+g|BDz6T54E?TAZzjN^0q;W_qUQ6EZZ3Ab zDPQzBj-J;>LzKcRG<6UIQuM_O`gzD?JD2mP+>bOqe5_g`3sXOPfY+Q0kis{b?5JS% zw&F~Ue}yclQ^L-T8~wu{8xZN^whxrj`UlX>!-=vIDSv|cV!vg!)K$~~W2UrdcmnQS zm-VI~(>S>4#L0CJ!&!bD`294}24pZ6Fw&)+u8)*Hpx_MN3`HQ2(@jJ-ARl6uRSpQ)G*&9zZqE6Hy_+d@n^%~ zHe8}^W0~5rWt`%&e|hD%|4`!=3Mj`LhXzkrE#PlfF8&;Xh5g{?H}vF8Ix09%Ew~V_ zf}0W-S22nkhj&0O4v~&`HQ{kur9o|G5@bZ}&=y4#uK+W0X^={jWmk2+q^w0uXnn2A$hfB|HmQroGojI3B!}Tz&CRPXYEM(=9LI`h~B1KFt z92_ucO2k}SuqJ=Pmo4}mPSszr-O9??ScfhGMG{|T95?s0;C361oNa;`p9$ZG^z7u+ zhK^2?XNoe@O&!vX9uh$1l!qbr%S2u+)>_^}G>m=qf429v_80~{kr~Z;tZTwi6(nm~ z%;OSB&Z?z@PX-T@c=L+PsHkREu4(E*@hK?_v3k(oSBy64{XXEvnXcx>Yl+r}g!F8H z-Z*D8!aw@&9&1md0||P35>|TNL;$$?+7h=GWA?s1mCoILO(tY*I-8}8aRSiIei#5V zOg`vj1*q56yl*DV#fwyT*^9u+h+ccIQct-USd>B4T)nhF3Z5i5i%G{UkbX?9X#x{D z8Bk~&e#HUjg{;1f&bwuuj_JLp5KnY0!%At;;_+z=a_8jw+^pu(3aHjUcAUc@o@|~> z%iCWv1Hnu)rTnmS_l31*IHz4c5;%y>rCYv%S1N_>a7mIT2wkP|?pd4jd>=kDXRH{b z&~=O|QOdMS$qX5+5H6LZ)35f`5t|b&{ozpP$G(CJBIBS1Xn~)zwLIZ2h)`+U2H+?vQ&D06}~{7{OOq=lz!Ag9KjTj?bkxD%P#OF zkntW7ulJX~O+*4j3d{$7T*I`~-OFcTE-MF5TIU1A4sJ{HfW+1AIi6Cm5GbX*vc{Ah z<+Q8}WsW?F)+w=BrU}64v)4(F>nTqd6xoVfnPCx$ev_R z^*Ya5Vui)2FCSEMW=boaXMIoV#5t6Z_akm)la6MG96QH6uPXeg(my{j0D#+B(B9ag zXO3Qfo4xi&m?d53iJdv!r5xXUPd}eY3oFJjoERwlJ}$CE*%nzQ%e8XGH&;SgAbs`x zJqJAQB+fuyXZ++iyXD7leK<431}CMBavA1=$xBJ$++#)Zb44n}*FsGWoCD)1_5$zS zv2Uzk0FMK+^WK*rLpk6=@|AT|S|l9~UzOhevkZqNTzM)vKW`b7qwB0es8ZCaC((Qy9U@(#b}W#YQDwrM;8(`?NL8pX=fCBxYkFF3N5OE;;>c_8RJBySFqK)17ogUrvx9cx z<1gzak=~}|Gr~DNlQ>*mOw~E#2YJA~D=RgS3+^lDN4vPK#mosoio*cD>l$43_@W6K z>5W;lK6nTozOv1Sk9{@BSe}d2YDFsGnt_GOB&%BF&Sd;_x&Lr2Q3k zr)m6?%aiS$sn3Zc7czyH7H5WW=7vtQHqxzgAs}+|k4Ke-$cUvZoyE zP}M*JO!*=^%qTcbPDwAnYl*P@vhBl7dk-A1mOrL%do|Qb5LO>QsAw5kjh4h*#)h^u z)d-cUS|&L$vzWN}%Yd^S*wfk@+|F&yEVRpyFi$~xk8x=|lBe$uEk#v5K>Lw{9hV15 zWg#cKK8Iug`2b?42n_3S8H^0TK`-QD*}y|NW#8}JwCpknYIW(T8b%Fy2FZV;8~Xru z7x5n;$nX|T;s%?STtCA>q@XrfmbMu^p%XvyesxFVcu#E<9%rPrg_r*(z{aUqS?N*W zG~wl4=v`W3mJGN;L~{z}sdm!R`?CP{gK1mc)?B4@iWV~x+Zd~Iwg4!ub}lX5zMypN zrj|j4U+;>bC7~2*4!kJY+KQLn1G5FKO#dy1*HSG}51qlOw|Y%95S=hhBBOkr-jOfL z5LelOT@)fbb_}N*cjVj7SUJiAmD&fLla$WMNeQ~VxT0ahUfKg5j;F#r7RW4x@q1@r z{rgFJ958ZRhgnS24EpZwl4!r10Z{pO&kd55jkBNoRFP^gRA{Ez!Ayz%ytswy8AAU4 z%n%Iv6GZYnYH=i*Q=2n@xu1Ya&dwGj5N-^plc32 zFaHb|+VhbcGQYd%^R5prOYDRxJ+BQDv2Q;Qf{nn@fU`EHLdB#UUz23@y~Mw74yge*c!6{hv+v!%`!=JT~IO`02LZ1&jL@SHNo?!JGkqnA;#@WG3=sTM74eMK)&sYv?= z2JY72H-p^INl1r85!iBq8`c!3I$lp#wQT3jcv`hufB0iVtu(jh-<%i2!e%6gR)0Kw zRYurM613CfDlDj-!n8K4kbqMM!6*?;4VKQgK8m$#(WX$ST9e*=%}6d@zu3j$VGmWb zT#PKwjJozQyPl#NYGwUF`gURmT$gk&n&>Nb@Y7@d0r`C_8E`qr*_E>^;*+0aD6zLs z+Rz{Fb^>Y8ofUoJw6^Vsuo?IdVRX)8m>6?PJatkVNUWEdKfj2_ z5C<1>90oP9wC-SI!)Sv*%nX>uA?*C=!=nZ<3W_Vjr~Sus-Q9=S-hSd+)h zQ(KcN4;%I}y7*}oS+vxUfJ`#H^4|xW{x*}E@ZdF^@pvQcj-XUg%r`3nLSnTHLZUT6 ze|xToXObJaJEK8e>1ss4$Ok;ss^nDpY`CUY>Q$kT--Q$oI=*f|XmL@xNs z_q~dWT_0R_Kl}94gbv)R(hF9{%B1oVk|>)jKQ3)<_x<*S*5f4X6x6RbO-HuTwS&*@ zhM0haHXz3A<`1x{=MUhD+P9U9$dD?26PNj@@utsUNW_q`Q*fie1zVn^a148Qf( zb7NOOG83pa zhQ?e^6*)(>KH!I{ur4^3h>I+82iP3i`5zz1pR@C>=FNR@a|Ym@^2~&cPaV-UhM0QS z+_?gws2{DYEJZx&p{Vn>Q5eQich+Vx^l=fKHpl%ush&ZouLiouTH|s!A+DmZw|5II zYpsbfGLz~f?Xa{ovN9>>SRYb4n19)agVkH3X9FF6XIoVHAGLB`>8H1?wiV$;FTc{J z$sEw|;W`BzYLZq8SWww?m~Q|H+#Tl_3#5dlb}R`R+`rA1qpsMzSTPMo=99fB+6dvW_+IZR?wSB1-qO&e)RB) z0Sop}=bZc9L-RQUNoHCoh5EIniuFf9=i;~dAVpVuGMU!2gJn&nNe5Ot*v7Gh=C?`2 zWAFUQ48?=4OrfIIp>SYvPJu3whg2$CoD9GU4|mLC z?t4CtKa-`{mWl2;XP;tOTljlU(*V2@=ri8j-L_XyNh#}d?>Btc=J7j}q8xJuF>mC# zY6*GF`cxmJF$I%&+|JKuR(JDs;srs0i>JN2pL)*-TU0P;=u*%%_TALz?M<46sSz~c z{@t!4->5nCD#?H9v4nQYVjL)`mksxiQT0FHPRvgMYh@rAG7j zYYK@iWJzW{lU?O8s?OCPuTWC)GL>Ubn=u(DA%4biT)=Zix7?rv6PYm}% z$In3jnU#^{j|ZppU5F^yy(ktOa}B1*%P3;hxn~luLN2t>y=;NCE~M^gFvs&YVk2G9 z<)ekZ%W0kfZc6n#>EW_~!EkkBB}YWi03mAw_-Ik6HzI|3y8jQi;o&m#02n&b;>)o1 z9B&8sqV;>>WI-AFH6NN1S-tLKNCdi=Ajds156w-@W+Jgst>$zR9r$aI+4m?*D&2Q) z0SW&vG(+BU=mYcGEDM8vc)XD&e^{-RRgVY7xS(rlT2@keR+g;qPN}0y|Vx(_-N@cT-5v!JRfe74BJzew|Nin2JXeCD4*Z0WYP+$FV!u<;`&eia08N$d%wE*(pE+baj^Zx;lTkB#0xNpaj-Ss3PiZuElS zGhaRPk`578$Y=wqFb!eEe1Q({(OS%b5z?a!7%_qAhzxfutn?8_eOE=()wAa0cT zSJXv1&zy1Lcs<$n&nkRLLfZt_3{ib@Qu?(dzIi4T>bs4)pwllzaGBPNAtqJ?dE#Uk zr3D2_{a*Ga?Yx4q3{vQ`EopW2eb990psJ={csBnYo13;hQXzLeF3>PHHe(2xXH+WJ%j4?NJwqf@cw06G= zJjC{_j@8e%@M_ir8`&hLQQItNq-mvb0@qpFoP{S1<7=7qzLIEUu9(3K8NC<#W2Mfe zAr^G<#iv~wwk%C#&KHj+UI_Qh)h()oSk^y@;uT^Pxn$?Y_R1IeTlm&Buq%`WBZr(G zD=s_pleoVbq5jnd2~#IHA|@)=KQ1n34UEi&D1fQe$TEE@#VqpG%Sev5(YK-xy-APd zScPFEj`&2C(L_((QWpMHS4 z`^D42RItnU#H3$@$E%#_8OQy<9q-tB2C2OmVZV$yju}?uykv^=daD9*-VSdW?|){D zG7Ni0cfVJDz3Bj;4O&E#z{b|3n|+!Gj7mlL4nhaIU4v~bR9fDfw6&f*Rl&ez+UX1a zDH$t%(3{wGVS&jHsPC-58hHVgr{3-M4);%Y3Rm9SU@4G4U5M zoUXKvYCj)48UZXNxW2|-rUhaS8Rn{DTmd8zBv?N4>xE2M6!D~-7!Brl2@Zo}1J^e< zkbtJfXk2ZTNAO!5&v=#sSRKvRkZGSz0hy`mYLMKBaOCqevc$NF*f(fJDLRYd@m`aFdDO!jw&(#17KjRrK32+l&!IT znyii?h6t$L>26I~0QNq8VuEd~^~TTv6yNCr6$-PrMcH=8nn=XTz59{ z8*rvL21)zrRIC!b4iKeVxeod$>SE)}3;Ui~W zsv0XVS4iY_xA(T)z4k9{Wt_~ablImX=vo!Wi|D%#AO676#WsOw{TzY=?* zNTRJi^`Vu>MM-eR+Em;O(`_&){z;c;(clG>Qw_%=Oi6$cNNqI?B;W{2xTH~z8r?L9Fhs{ zHLQZMF3hNa(jUkRnzj7;e_XwHIMx3j|Btc~LiSF`EXv3#yR5Rqq0pgh$I480c5$*t z_B=M{5VAQ|b~v_U?>)lz>HYbAzkmGxa$Q}AT&~yS^?W=ZkNf?04`+gUz3y{ya>QPm zhFwQ%PO$0I>a)-%br|5<9YcO6E7UqaY|tTl+t0k;)sT%n$muEPX^(wO8TaiDDq!cg z;_9GqMlwr@0*FnTPMG}tUz{R(o(HftMr%WhcSXF)s<@aTb~VcSkEZ!khxRxFj5DG%VpguN?qeb7&yM1hcbR*T zmr?x5XQoJMK5AnS)uLECbH@)1!%`1eir{W+&E|B>JX3wQDj2HViy=#$y7?t!C3Z`S*g)oPQ zHFQ+FHoA6qI(Rjnj4kM$iikhql?>zUZ>KTqX3*7m62kjXVfp3nl-vEvrPK~r-}1^e z3(Ld#fVaaL1{5T2D9d+Ek~C2_@UoVqG6$U5NxC|C|9Hu?EG-Ip2B0mV-a4nrCu$7d zrIh%}`$C`D{|XlHF978>|KfaTLJTgLSl#PSTZb9X*u`mL|B;u!J~w3|ct+NWR<@&r z**9+cC2gn4cNjH&y4oZTZk)0>43ib)!Q5Wl>i8)_5;XWz1Q+6Lss7Y=zTs1vQq8L3 zoyQX;apQSUenvT7?}&vb9n@atPTsstMd$wC#ws+*zazn0>U!+`*G9)fj7=0=$&-zr zj88~y%(gS&6hj^t`kQ8YpZ$2RB8TubK9p#B^HwR_UNMKs*Wd-otd(i(t&W=pBPn{_ zxyb4_GD^LM?=KSHRsB|Btmj(Hfi`}@h@EY-7oT^>?p&B}DfvUK zU}?W`3&kICZ*j0o1P>w&7CKl7Baqeb2Fb}T_R{9qFiKT1%kJ+})Lq5 zX;=6>eeGED;YjicQb6i}(&<;@2}1oLxRtU4AiWLq=sGW2wG+Au+)g8T<)R4402qD+ zwHK+x9S_14i5oFWe-3+%>-&!0*JstjFf&{FeomAGk`K#6Pq^w?)PJ&WUUBlvP5U@8|JwmjR?!JgW3L z32&(0BMgeCJEy_NLx1h4S$#aGCw}k6Ie{ow&CcGaI#3(dx>F_1pR(9$-$OGoDxBz= zqv^}S@*WztS3noO$xh_$jfur&`*%CV^lzgKKA|?BfSnT$1!&e+l?kNjl3EU14Z=qq zxVDm$zp8d|VcS1C)9?vFAL>IV4f4Wo14wjL^-HftsWK{U(GNP)0y&s(lDx*4F^+&K z=1%y;ijw?VDY(BEU$c6|tZJbHI+nFa*7n#G1)%D{#uuuXg@bfQA*`zu!d?q>1680$ z2X-iy-VbeVDUuPu)&%qW>)KvpmRYKSXiGucIN0b^gG04uq)nF*ZY`fU=c@CRyWn?j zuTV}=81EH1@I4IXVb~er=EV`{3P;Y93^w(Gheg9Qx|iz_pZ>vZ(E#?27MX^F_IQZ{ zT5td7D_Qu>aRc2NK>>q7t2D2ICMN z6!sII#Vf)Iwm1)mCA_|0Qv#~FKO)_`kg)xZfd`+S-DuhlSzatw`t)lgJi3NA`h4=hSFN9(d{X5)axL740{hmxl=o9MpM`JpgLkOi~he@m#Z55R-)JZ7hgR!Yl8)S_qX z8i*qkWzkqOj;g--ie;H!qiE#wO}96U>UxvWfDw<}(gk_zUE*aTYc`X|Kh0a;%zVFg z72v;U5$0`ahfcj=$6Ydf$5}L(jqNe=tE+yag8#O;_U4<2$GuLY2x7f$eb3wMVw?-h ztkV}t_6Mv61?P-+q=@u)Wna5^=W9EAh4yEM_J?D2P3Mn`PBV4 z!uY815i!oir4W$2BtV(rZ(Yd}XQpQ00=sBC-E+Hd8n>g8;$#%N@5rG&`VGV^+;b#T zRIgctHb0t#GXsew_&JkHdbW}{2#Upm$FQd|A0BqX(QxJ;1XQ3_V_+;sB%q^Y z7Q;!RkxcRYGvtf=wlC-X_eB|{RyPi%jq2nOkSM-t3-&myHsCXmU0V?%QVJ(MWCXoNp;IUq*u*)yN`Msz#%J7CGRJRq#`OniA}5+H7X> zyWoHE)mYB9iy^g$#{sZcr@?gRdH@YTPZZWo*-k1731*ovBYLCQIIJ3EQv$L!y+}ED zZyA4MD^?v88%d54&3grR%YZ-p5-Llj6UDLWRgko{n(I7K@9T+`^(NkH@0$lE@j=_! zDe*A3pP%|#o%XEcd=b?@x)*`JGQ`e7NNSMerFPaF_qd{>+rb1fkdjC zRYP!gl;X^F0B}-pqauu_LLDWNJ@e>#l3tg>)M02)=cqP50=&M}ny32{R*!NpOjBG7 zT~gekaY-C*Q9Rn_FRO?oXZVaUb$E85YnKD$j1S~9A9Yeyd1HL7U)Gw^>H2)ne8MY6 zptG>1iR+%22SX@xTuV3}2>@1xaR#~x&mp%3HZW@(nm1I8gykvQ7`@&$2%Y;ah57n2 zHri8C0=L*CP`Kb;l^J?ljE|PfX%+~)TfmQgQk&RL#-J%vq9<7wO zrtIsHsI)NeJf~M}6+v0tYq5|`CR^+X_A&g;b$bh&r4^vymqR}mCu9b&&-%&7sJNj^ zCsa%0w>E8e(dbN~bPw*hK%D@^I&Z=@nUo=`yF#Ni_q9EgM@z$1#*)=mzZl@_9bQ&F zwjc49Vr9u}7HiTaFFg}!68$@d>Z8{O^4>sJQ0Ik;|((W<|pb9a;C-TXm=X$PquWGi-oJ$}0Pz*atzcwS;A zMv#UPr?AidLvy0D(|;clG<6f}zgdP8=_`G)O`N#1 zt+||Vo>$c*4k^YhZsekiY7lUKGhkeCYaQ812J=BQfM>qq5A`y26sptDz8XLw(Un25$##(Y)>^jIDl=G$3*4Rl?&~FkSHBzEjmHyiI zOX%Ol=#~(6O#Y%&hy0#2K-3vB!X?Xtvck@58z;$NAhE$1=oQ&*)eJsrv%up(YVz>k z(8E1fpw{gKwszqA2dN@tKwNkAd|)_3dw`tN{qctL>fuv<8sH_28PQMFU2~HaI$z5CsD=nIUDGs^!z)uuoUI z^A38uVp-zd!*Bj=X+xhuaBKeI!(Q)S3=>rxF->!ITF;|@y{Z#wT3g{@Ufh%aHPC+q zu6&G7<3!Iks2}-1rlt2zh0jAv*hreSMmdKGxDnl*rBP(C2nZxp2wLF?l@nCWZ`KwC zt{lrn;p*i0#??|TeIto%2^6HovkSbt>T~-HvLGdb>@S{shU0iflHQvwSn&TF|0^!0 zP!42$=Uf}sX@He}@_zacP90OnLb7P<8<5^a;3b1rz=8w|)Wm8^J#OTq3PaT1GzF@X z{HI$u-oUTH&%zdGAYGXSycspvfq`0APH+KzYj%qa84XA%b0AG;%)r2p1cGexl}@#P?xxH1Ii71jkj+s-zVD&i#i zIGcXdKu3N4`H2wrYi&w7XsF@pU{XXfizQ;G*Az@_Zeee00~6F7JFSn}qECZEFhyL5=c+rE0{ zxJg72u9V$+`(`@}XHGJE`nBITLrf-h zZ(`rv7!hk)k%gN=y!iq-Nd8b=&7G%&1;qHwftU}vm$u)d>%8kH1h4s~59zcuN@UGH z#rRIkCQIktO-Yp&_e-4R>dDfXbAMSzd7ZS*qpFe*?&i^uP$PrL2z1w|61a_xAI_#z zURwsj%(F8kS^AW)w{E6wREF`s3SI`P3v*!l8)?o@0jE_|C@+=6XB(XaU&b9rf3Mqu z+oAm?4K>ZAR8Dz#m|Jup98jr3HZJH`W{VMoSBmc!X$s4rFx6@vx%ZW zXZanV2`W#LKRw%#L5b8F^9^m4e%juV>HQTP&K75vHywd>xnMGC@g|tH9{#>@$5iw| zW`=5E)T8w;1}W>^pM=9I=;}xPOAVE>r#j9@OvDVSdiDo8;FU-tlOYtDKCAZbOi-Y^|{BGuTtvF%Ty-!2FBxgA&cmF~B>c=q9h$rcM9JeS98c$7NXmdot!`K@k_+%) zf}C#aY}N8~LMw#XYdX`NLkGc3bg?~`N5k&ZhOpW9ILEdQKPOt+EJSE`nb}*{0bT}h z89PZ|EP^sg3UPb~;UW2f? z`;pij&yJ9DR;!TeLXu%SX3d`A&a9*#iDfR7q*;-i6UGDKp24qW;kUC;}0Z-Encvvm#=?>&5)2P>8pqx zzqQh)US)(o-V>rRF8IpJmu)~{Df#G*>kaauij8Zg=A{&erV@Ne@Co`9`ICDRs`m8Y zeG)k0_iA@pC4mc`?{Ps2p}<&oSY3bT$a6dSZQwt#dMeWi zVta8N0AO2OCM42Maj4c90w~%M6Czp5#cUFe^t4knARZ& zkL_Rfb-IwDCg@Ro6|TpqD)aYwRgQunJh-TF9`gs(&n<~idcQ{s z5buffr`k1BB?Gz;GHNbI8Hf*e#HFy6 zTxWY~uxuQYh+6*|X^Re+I<4Hs3eO1JxdeJ?22iydZjQ7z;L{3hss8 zI(S<)5hwi4UboiOIS8(O*Z*qTe8Ap9Kfk9%w?9G%dlqZj11F#T`ibRI)EwU!3^oK2 z-2*SdSQsQ`qgNFDjvxIpZeOhCE2f>)Wu|n9Qw2eI)6O6u1JvCAqAx02-OvPJ^@(*y zF|ky%$0qH%%SQkyaVC1Qt zi)`qaS!+41kpwumX+i^yOf-Lrgx3emj(yg3-L1oXhVTBmG$h;fG3x|NhC5JK3qI4~ z+acN(#sF2?`&sIbv>4bYR;c$_qe=H0wa?}OHa)=%kW&Pg7tT(M9NH%RwCC3!R12J+7(_?c2K<_bRvr`)7l)30 zB1UZCC91e3!jJs`Jd1IH$#PM`ADCL4KG;o?!j^3d5D6{BxW%gpk{W^|f5gL@o9VM| zy*}8ZjK239v?&3m4H^Mck)j}}r>KK@i&2aeh1)>2lE*AcibC;lJm{rwo_G^AeD7w~mDtI@M6zN7-^JspLVj=;^9-kcY+~b_WD?HzxEg%bv%vLy zCS+UT&p0!xD=o$Aa14$l00PlG{c?Uv#&38z=fV<>C>1rS=@a^_* zgJdV8-(Md)iL<}VMisJ4!?CI^?q&|KandzBi z2`*xQCY0SPMv+o$ckZkFi0dTvDWLs|i$xNu^cX0A!vS53<`hka_UL=_@-Rdh+KcS5SK!miT?{tNG!VG11n>QR_aAltUMg zFl#cH{J)#dy0;~QG2b+jLI(*PHg@i-2%iZ}4SZcaA{&0YEpLjx@7KD(c0k~+ktt!x zU|sJ7;!q@kd5Q-d3Y!^dNkPHod6=zT%BM(75rtJK5TyKi$^S%ymjdcvg&f}O( zoIgO9P63F3PJ)voNN91YHy;D}=$a%A>jiCYQzGTgU=>bIUa$tH9*Nh*V;3s~l`9d= z@tP`e0-#}|sQ*IRupU4&Zlg2(m52OZ-?fcXRSZbmR}b;RTXizfjZN%e!@b9Bt%l+$ zWe{4H1bGz)YP8=4t25eb48QWMk1l{C?>J@%{5#ewCY<-2c|BGW8&IL1cg)-N;#~uO zsup`(rvC%*`YWL^6?sCO))Bl=@z;T$ko)CtK;M4oH5?WYQ}v+kb$BrQPfsN{F;X^| z0qf+sb-@A<-xpc**j%UV7`{xjUgwl#L2_U^x%J$cU0paoEprd0FC*#pF@wX!0zc-N zJLoE*5CiaX&qQyx{$3DM(K+p4-~(m0cVjP@b#pWJGLdYv!K{-D@)6AGX%xyHpuuGR zB)+%R^?zOB)y+rJYaduCK4hz(=Q;)R$RPmtlc*OGR~RVC@mj>N!m6^L$g5W&egs*n z=~V98O2KT@oNLJ6)+rP%>~_vFGk}ISVu-%<3j`%mqsuE zdJ+I(oK5t_OsV8P0Nd#~QAo0-#wiW2q@4;@&*mPxH8Vhh2&bwY{{U(dpXZ?}hKfE| zE~~n0k1~Ji-j1O{SyLiJdRA-ov@k@&5F8(X8<4l|s7qhmksXtiSbu+^SJN>pzW_Z={yLu_36uK%|YY>anQEklzA#cnbI(tk~kL9RQ8YMxSeuECTSpAyKM-ppb;p z$&Y|;FTj&1r!;Z*pBMftig!nq@OXs+|45u~%%Bd8(sBuc+Q!s3Nnp~_T#rTv>~Fy) z(H@SMJ;=XD@65B98Cz_%lH}!JlYT#I$%dB>?@3zVaThJWVtytS=y&q6N3^%IoQK*0 zR1`Vje7ujCpBJop0M#~1p<3b9;Xn_;CUqZu!R82g+0!?X|1b@QgN&9*W)2NT_}hrv z;Dibqrl42X>o0y_r9h+66|z@^W9-6=kkxT7K@586f+2EWavC}Dr_^U!Mx3bulH70~lhc$TRu!CN36 z?~?!qxt>y6u)7k}WfX5=ptcu(I3JY<*sgsmHG9f_(C0NdOMW`ZajW^Vai1O)Q4ILi5;B>U#OSChNwyD2z}$ z{6&3|shXSj_AX4GgP@ggwZ4NWA)^1137lNHgEmKpC|bqd81muqGrErg?)@jCt|dSVG|r%a=gpSR>!LxJ!@mT zo`vT`2AQLm5hBi}K}C+g&TbTwtePLQ4z%w#P|mh|9ly1wya?-{P1m z3;&u10xu2c?>%AT0E7NGvnL>zMP)A5dpFic+Rl9{G+-jsqpeBT_&V!XjJ@sNm$)r~ z?8qA`8a3&)rWDfh1cC?xn1QHbr${(op%$*21A8}oPel>qZKta}XUyBR690KJ{wwii71(upLT@N1eynPMW_7U##}ew~4Tu5AnT# zz_|y`&L3Afr)!i6#Olg$zN|2CIhO9ST~Ya8%J0qpQhp2mOZm+XJ9jU}d5eoo8`0^k zLRQV$0tZPHuagXdK|9iE-7$psxNX<~$k4AN>OuWTr8+|UK?Z`bHdfBHKA&(6Za*Q=UJiIZ0aqv-i(G7#gj05&{8osFbRB z@0z~(dq8yf)7|do{LMe&jI%z}g&zi-QLj#5fTyOe<&n9_Op?=d0?`o~MPZ!Ux;Tx!GF_Tz|}e)x8q6a5lSa{}|^pNoEX8Y%*C(_$OImiY)ul%9q zWe0&_zZbaQnCNweAEXaT$b=xaf0~mF;)?o#^Td!{jLU!BZcI%UA;D3T?m9_;ybdo; z??wW4X7(*!vFO-}pq&%y?7Y@m zI5^-KWbHbB7X)DXnsjs59Y-vnBVE{2DgXtpUy&eWopHaP8@gQ7>6asl?~pXX|KcUp z>}S}h9w5;J%M~^eGGp!8->G}Ogob2V>quk=LN*gIU~g=zA*ib<99cB%cyg}M+^dU| z`q~$nEO11<967f##}m7hz?Yf<9M>WXikpR_>ft!cyB*qGEEliuzYifXOGwwwf z)!s+qQ~)Trsl&r;yn6@+8Z;XD6xh*9S@4RA;2|_-h_QA|s|;P>GGZQ`w=zf1kc*mX z`O1*wj-qdtu5qB}&(vfYS;j=r<4Cj@h5(49eu@@!|I|F~pTd69(F{u{;(99j0ONvV zk{g=`OFZeBp&JkFFDRmbs$V;gEarw^`w7RuVUoi99B5e($+tWaaTFr)lnTst8w=4* zZt!trlJz8(5enP)8Lb z)eI!ypAZI0@DipiSs>nc@(FJCs1%1$^W&!!26H-H7V^Id5qykr?{dve6TrrFw|5^dqh?K5Rn4R0wwtjdD0(8 z3E5g?eQu^E>^{jHt8UZ&g~g|avG7vz!q;ApsN_3t(y@LG0*gLPEH(=B=gJPpYC1A- z#=ZcH@`Ak^+_4|_IS7*zw6z2lAA{QPQiiFVu~(aaE)#{`1Ca+txgz~#O&p@+ni}mQ z(~H>8er$c@m~_$63<|BHL@bR1#F8=1c$W;>rOi7}bht+x(Nl}lN8m{~RKEV@mLxJp zy)uj#;`~GD07Q!t$N)|1Ah1lE9VV)D_inU%c-=zMBAn;5PR#8NDz3F1N>^1-Cm)WW z*%p^Zgvvt2t=~W?=@oxl{Y{0NQ_6F@=fk|;NkoC2R@Ye4cl|Cb`0hY`vCZUkm2*LX zxoRzviSRB{6@U7t|JmzJfxVt~5xcTTy}AQ)z5|a(-D5fa^|7;f`^^mPBBfn_*zzdS zz<{1Pi!CP^NM#@ENra4a9l}_h0wB5)ohdd}G0~Faf31j6!>(`Z zGo~eUa>Dv)z}ZGM63qCLBV;edH@G`XC$|6Q+GAxQeKFwfBSMyRDBqvW309kROvBOh zj~7PoZ2IkbxzLl z*Y+;E+^UcKO4kZpP|zG5aE(PkuKM_Y(wV8H(yj)!z7#{`H1F7a>z=QS5A(iq6w@ zL)Jty$sKp|h?Z+Sr9nzq_t+HnPacq9Q$R)eUS*9gSjciV6bXLwJ%{R2RPUpO?&t@5 zrMcd28=LoOBK3Nk#O?C1kuK&deAWYk=q8mK0{0;y+BWmu5AyP_nH%`KThO$PfsFn$m6%L{b@5f3!HVXxX>yq008x9i-M z^--1#l(^%TLvg4d2G83I_NRnZW%?h0AxP)uagV|*McW~`sd-ApDnUW0514)hYU}g| zDj0z+x(-5lwF{yK32)sw{Qx=7BW~+}?HrWX8UHuU?q!yy@C)MjN_3izKJr}Nu&)Ca z<++77YF_h&22o&ZK9VOKCG9rXk;DtGX%`)Ph z#&vZ`{DqiXAF)z{yufqE;9dl?D+OCoFvOrai*ZVR)pYPf+Q5V!M~6OngOykOo$l=t zrI=HH1oL6b!ijVh8Q+}F`XZoqaP&=-2swMUxmzm}tag{JEV4-MF05g$7hx-nKMwk~ zl^K?gdrqI81RC6lDdXxOpm0E`_e@1w+kha*Ys`eWAf9K>xQqX3(v^ zR`%2A*|Py)`8Q%dkl>jq{3X6IZb3``HKZ;wM@AWZzaV%NQAdu@<>>DC^0<-;dQ@bz zkycqq-rsu5Mb~4a=-3S8D4+|MLG{NBR)=$PdViLFVkzFdHCtWX&;IZ;+1Nh|&6#wZ zExYK#zD{+GM5R^IeZcCI`1*Z4a>2h6#541aVd&uLM!HY#F=NikP2cB+-}`OJv_;FE z_30_Mfv;n4I)*aDDJEE5R&Z=F$b?ad6lLV!3rtBkZf>2M0=7+o+L^GrDecU>I)bp? z`ReZ$!|$Eb#Z7)=v5v_Uzuo6|`f4YBe%JiPLY;11N&^yd0kPs$EfQs#`GS~EzH*H2 zSO2R{fdzCu%0HfOJx)VVHTP0<CojC7`iM0vg+*2Zkt$ z0x%}3^hP7M+suLA&^iPCFlh~>>n>H9v>Ma<(l#CY;f(TKtf<(ucnN|O2iNHCGTCF* zLdU5Rl7)QI>T(`C%g0s&)RO_jd{acQRdD#AH&-5&OG*B@I~r0_a0?ifEH%N=8PTrS zd5C0UZ_R^sj@wn<9D6|se#Nld%4pRxO?OWA89i}Mb2NqGha-J+^ptQxvI7FYw*flX z2Cli+Yd%*>T^~4QVAalD=d-(i0Z_{6MpX4r%w~|YBfa*IXu!@Xb_8ulRTOV7K+TqN zsAR(E7~%a`^CPR<1XD3b;k@1Pd*kmHnd>5Bwhy}ZO?Adc7_JZ5jq&Hi$bw-cY-Zrm z>U_EG=~h?RiqxG*KXTzaI~pQ=jU%{MGkP3XQ@1PY8H291z!&xzJE{6F zj*_&YNj`mrFTKdCsD8Ar%~M-#m^AD6X{zpu+pyp?19~lpaD0ix>m9Z_K^@W3L znJPS%R})(q?mjHapZ@u;-o&nT_-|8$1ggm(sS`4#Hi}|e83I0yQTi5s;S$ymBJzA`IebA$eja0_jQ?8 zipIL}#U+ZSkl;-rrf1?jzun|`|C%#Z<;%yHur#kz;FVa|{86e2=ZU&YI&Wvh+CWcx zJ}R->`$lX_^w{i7={ksVrTY+t=i48_G3|MGT(;$d#%jmWyhL=06X+i}oV04;xF`53qG@Jrn zvr5bxmVJMFd{uLtHsffs3g<3TrMyqHU4I-DKsZ-_Jngw%Pl!9QUZ|4In_r+KpzcVb#+=*lUuc;7 zKXBE#R9wD!>G!lo3PuNO(do6_QbnDs&Q@Tci8jkYV5E)8ie zgQvqA;m86c^RAE3^*mElQRTKJWJz0Zs#z0u~mojRFECpn%3c9 zP{W%49##d)Mdp=DBmR{n`s|i75YngQk-UX@k<;s@hA_5ks1Qy=hiA!8@$E9v13@|3 z;k;47$4}jK$TnMK-xud~7!zC5M0?&b1a{4(a13fvNjbFAyS413*?Y|z*0dxvhORxUe8X=(Fz1&JUq}t*gL`r zLZ=#^&m5EpRqPw}SgnmUAU^yHjEAfKg@1wI*>(JRn9Zi2_H7-EKic6D8e2=dC67=C zB+jIlzGtJ`-{971!AU!s&MHfUqRm?wExj(}D3{(DGn=IbdX$^5Y8mm!zqJ}cUu%36 z-+Fb9wudyr#S&@+NzkyebNR8#vcq9kqQ&TeG;>!inv5^Ijk(REl~%x0Ig&MzsqK#1h5p{$+jVD!Bob8V)7kzVXfSDWE8Lgs$n0iVv@`oPr*mW4TJpri{AJxyp`%et{_$gm ze+<@+#Tn=s`-Mi9&9F#x0H){f*uB($_f`#C;pCn+6xgfU#!VbZ=ppjT)RrWZnj6VH z;q)Ylk^(zm%jCTAv*LMO^)SiLzBq3250lh_f{Yp$;?=IS+OA)DUl9==r_nC&)LN6e z(09x)N4uar)Z7d0ev*#h^0Q5&nmSCf%*#*@i;ZMOXw`H%m~ zLU?K{x6E>3FTv+U57j5Lx>wlDbrMK(6)N)4A9c7VE^(UjVD1>1AGekQ!Af8Z5>==S z*YzZ=U#p}8cos)@~C z6!KIPOw=|~fs1FGOCY9>9(9*dy^Kts z07kB{wORyFw%+?&neh>f#j@6~NLuA%2ArX$k(8OH zFEu}=;Jwk^WZg_0&a8_PIAdfecY_)v2F}Q;pd5FI^aQ>LO)PmZ;orC7?P^y%6V_Gz zw~szNs@bfvjNg3L-h{zzkooJvsGqv})Y)0@2f!Q0c02WN1w%;fYzKW^y>WSj;*g03 z?e<3&yGc{@Nv=7YiRB+XDfMGW;;pBiyH}I)X2{vyVZCG+VjyZvD({Gy`Iv59(3Y)d zsIgm9=+>J9YQ@+q{?BwKg5$}gGErIPo=@(PN#91Og?8O$uw4hisu0wuB3}e@Xp{M* zO)m&e;SyMI@Ob0N=Ip|(#HD*61(eh-FgX()Fgf(YWrZ~NAb!toN`m33+=C^Ev(9wB zam%)H?ymQCvbiY2-6k3w5<%LHjHMz;1?n<)#^5ZjL7@RRied#xXpdRX&r_@%BS2^I z=keTp`P|*ZYFCBf1(?@syAz5v%IY$`NB$+&grF+oqCCQRuZ+D(1XTzgB?$3J@a!i( zs6|yI#E1*5wAdGbmejaCZ_iGn(E--KR~ry^F40I@!NZYv`>lKqL47!1KPTyeaGm1w zEjzzrsxtK5{4jinvZ_DgOhlJJ@Eu={Vo!&N973o-joVGAlKQlN zw3JyZ?3*u(j#QFjWWNL~wP*p}&mWZLV!HWJK;~>|wq=1|O?ptq$tv0O@N;0z^)V!I zbS68eJNgqI_}HFlf-s6*bvjIp6s&12Y{u8(HOu?BIeG_O8Uj4OKKsxqF%(-V$xqxj zOqIqsSH1Q~SqRU@`E{Gj&~|{?;3ryF!bXfC!!h7bAWaQgVTLC5!m}eee}WoX5;>$z?J2(;F&< zjk2mU4k>^|01eGy`jWAd6mR=_V425zTa4PV1j;uT8w?}Rd zOrJ~V#QC)Lbv+COU!V8?IsRaC-X}wNoVk+6#9-&7VN}=9hC!46edZKo^mwtnu3WOy z1qXo(Bd*eV3={dC-S_ZW=pkqUOrosUiujW;BQ zPu^R%0bzm)wjIWo#2&ZcZ{xd84`lmXiw)0YsskWS5ckRj9UP!9qBvS66H5Q`*5Hz} zTniC+a`V z>HBWAO6|qG5*k5%A!oR)wVuKkU+_%MHr4f^<3#<3g5LVyp+|Lx9qOBxv}6h`Ja)zH z1oYrHj!Cb$=fi z|90!;z;h_E;*tVCr=gx|49<};pkr8C90@nmacAEa%&`%X2oc;;|5y?q;R$*4fC*E> zX>4Zm+U1~@j^n-=n%*4AvvSARGj&D)=UBLr>dM;qn>7TWAN&}YES$}RO?8Hs+Rr8s zg%3W-x5my`j?8cGlQ2c|&7<7`T=cWB0({JTa!2APB^8DD1JXB2wcBJW7jchRCc;uW zmHyEk%Y6_jB7W$lU&d@0_N+Av-1#VY?jd?kk=#C9ak``59}oVMJ33oly>T zxcZa%<^7bY{qOPRRcn&5QR)x994N&mTE=N0YQS#K>R((r%~Wi0`1Povtu2uW3@eb((vDvfE`Q@csZ6t5QIlN_T1LskzHP3ao(7`hyF+_ zw~^Nqvd2n0x-*#|qGOpnmuEW(wfO_mPVugOJ&B6)E_{QSrXWN3*#7g#hcU8x{IHG4 z?KwmqEo2*;&Qa!QG> z-k2=mK!BetiqAgBHS^Jj8{De`@#=KXZU5dgxoJ1A_?yd0j#e=kd(lesPhF3~C&eHH z`&aP3RocS{W4H^gerqg8k`TjSa9o4+3-4M_T3w&&(2;ZkOc0F(n|>4@iS(=1k~HpT zABK3=xPvhpznm1flSwQO8|)gK`C2mW&yIvGsR;M+vB#|=t0e4V#f09|$LWX$ZS+bH z?P5JYy7WB2L#VX~7^xYR_vx3LOe76FFW)K^oBh{wJVAV)M>SnU#J+q&8Oh1Um{uqj zJ($_0krG2nVU`+UFLV~-y+U?)U%34L-y$~Cj0ew@*-U7n&vV; zo$35nC2>3)|7hTi$|^wuM{2w4dx`dcMz1)y^sWp6$xDMGh$BNL!}1``E(7fr-JJ(> zSvX!{zR;wEeGWV*Dyd&9Vxqoi>gtjfKbJi}^E@E`9JX|1uRw~B`A-0UMP%xx?r#DF zi8lnZ#}?Ndq0A0bvfv>#Q$o;2C&9Z)0GrX{TClscM#`mR_bug63Gz%fZf9aTW0Tb< zq8M(CNi{}2-#Yu3{bsqEYwTLm7}ww>fR8%v>l}fG^7bFH-1@UQlJ1tiOQ$$an=vF@ zb0b3e&BkO4wmHWa(|t-BUbVp?vp0eJOE|jj4=V6yt#L^*CgZ@IaklmgW~L}=qEgiF zbctGl;H_za9d)AtbF;=6UXInVW|C86(O*7xpZdYdsK(Su3g2@(XY#LeVkeu;N5*R7 zcXcgVc$8viNbO83dq!V`n5ns=T*+Ap#di7&!!&#g$L7~+R}JOi?YCx*1VH-~Cm&|^ z{*E=wAPF=x8dDMts|I(S91q8l0hq?EwCZr)in+W0UH0U<5*-{4tr>f!T5X3aKZrvS zZ6bh9`6Tid?Qw>OoH%mk$!$h6bcb1;o_LtpNXtpw77e>-N{0XW6=OjaXuJ?V)mvki zD{`ZmVIjk8j7)k8w(|vfw9oV^=Nq5s)DAB&WTFXC-gwS&L&0UyqJC$2&|kO5+q-9N zhZP0QW!#Cl6E;u0HJ|$E>jX_52o485oU?VEGS)$fzXG==i9@b>0;8{+bYB^iWPjIk z6hJ6T?=3C(sPVQvn_$=PyrX-WnZs(f_lS0aKs1Gce4{z~^Fx(XfqU4l$dw|gl}Uf> z@*&bk564xv!Q+5(A!|GuY&ari_m0=X|%vN+6xsBjPqI zxpn~Y%iT2;R~-W(Xu^^xFK?4z#|YHdSoesnMTRMp!t({|z_!1aIM3NW?=41Px2wK` zel3m{6w!}*WjS=p{(9cA?Io^uVdEYVs{9ZsvAFga7Ns8TNr(gmM2~W|kE`}6&FgU4 zDk_ph{c>$akTsy(8SdA7j+iU6FKzH9MBc6Aqk`8FnN?(!mzAu9hD#C3ObWpL{(g>b{f41jY4vvj> zNzL}2%4Mga6j*5^g{M&3Bq&L9(?xKD4=yq}qVCE{NgN3VYvA)8k#-c?CSF2em{JaK z1n{~tic$NY=z7y$RuxWXvy9PQkIDY^mHv$IeQyI0zs=ZQk)K<%NKm=C<|vcVSr5D8AHp!&Jt zPw$^`J%Qu%f2EMyD3GEV4Xz5IfpqB1j_so4Xuo0ONj}QE{l4SF8nbp+*N0gLBvc$C z+oEU{fS$0>R^bx9Nq$f7D)P$n0JKz!hxtcMrx8@YwEiWgQ`2~}vxWM0Gh%;4<)6Qc zXLEncAJ-?;KbOxEkKi8bLZ+1qy*J6!$ub=L$+@`40A*0=8l6Co@@qT8pk@>0C7Zn; z*bLm>3=63G?eF{Y;l?W=EAV8T_PGkZ1B~#>cTqnE7E6h7qdnZ9p$>fMgRlGf)@!>K( zs9%^81Ox;`y5s>wVCXJsB}H0>P8o8Dkw#HKS}7$&P(p;EVTM+^LtyBTuAv+BTs+Tv zzV};a{-4ES?(5#y-oM&91N1qwC&l=I)M7UwC1(toVG33bSH^fAj$)TpCT*ge#_M63!p|jpytZb3U@EU($XdJV`5Jnof z95PmpTG~3VQPpYEzChRznNu%Sk6KzI7Le;n+?|=MvWg)+AB_{z(|zr6peJJJ+QgpC z_*+5SICD9@BDcnNY#Y6Z)TuX5eQk;7kOK2gfn=LOj5!tM0kjwzI8kAB*(7>{1?~gp zGB=CgZwYH!fVr`9MBq>&nxV6@_ukVmC15_t6SVlIs543byJ{fb{+pvo(NtT+0{>;t zc@z$`zfJBJHkKR-cIK)itE!+w$YjXO@ce;k<6Vwi;F_stZ~G`N=0Ra^nIaRt3hfD^ zC2<^SLGvYSKSy`yLv{Riw|)I6@5$+$v$4gTlhw96M3!@k&Jthxr z+FRQ-l|q*b_DUNlaaxAWKN@%P;P?ZS!4BR@Rt_~(2n9!&o6f7 zcJ9b`V(3pyo*KthQcpE}MH7l-wq~w?Cb-(@A`$tEo$z2eXei~v&{eE#?#mN)6ou3zCnY8Q znO?r*2MG`eHIA@+x6EGLWR^i>EWqWS;>D0Z5{1T5_(?jUmS^1 z8h_fHY+IgA^Y9dK#FUOVgt3!(_ju{P%k*Zi<WUe;l$;bi8IzTZ}*8Elll}+fK~^51J*O zT`;u=6lf^4VOn6-k>y}%@EyavXx=n!GRWc%_iE<7?rGs1t!oZ*Aw@gi#mn<#uZ}X{ zx-a{qyZGe=MmoALibnJ+mP26UPV(Cbr-AVwHeDotkO+dmLA4#ZcQJJOe=rL=Lei0X z%iF`IMYIFi5YG-uJqNq9ayV1SuW1g4#XmK(TpfYa>luEj1^Z3DV~fUBnUcIL?N70H zx^sM)^p^8Z#d_^@7HdYeQ;tvo(o!%mw3Z2YSU+&S#umk#y!te}EOmlEV>;wM59N7+ zam3Mx1*M^dCich0mh@$iBKx1+@<+WLGddf$t59O>OdOSO4_E7ygmhi|cl@;&gOm67 zXAAbz3+`z}ct;-T#mB${!D@(k5PHe!Vll)rz{H5n%MZyU92 zsY8tZl<`!}<%WyDhemM*)XnE4ssH}K!Jwd4ml9JOree}PiLZXY7S;djNH37}Gy?Ct zt(qTxTHxHc{lAD;Y-Rmh%bwbnu8Do09^43V{SU9b!_j@?4J*Och8Q}1id9JZ4<&PE_2g8gH(4;XD^5{7 zJ_Aco{310Oe9kW%3i8M2yOrGBju|spI(>|0O{;-88C@0i0K{gJVGrlucz|@_`ah3c zrz{X}(b*yyNai_GG=K%jJ83>|-a=o+a)UO6^tv(f`$p@w;kom>8(an?+=xco9$yNE zEh_(m_XC1YDx!1a$e`NK2Vt+KDM%{-yJPVXf{UoqmPrLePpZe)m#$gV^R-UZq&w<_ zf`;FM@^03vgzP(6FdX!pt<_nmQO!tPWpf! zNXS0Q2NhV-xbw*eAW@j>hW>BQAx{6sN~;&0aeuTlCFSxkO1Uy`$Eq%n1>>WCI)!8x zVmt|9gw+gmWd7Xh;Y=+MPSMq%~ zX#z!^$Z7Q_ z6e^y1PLVgHXiz_ZTdlOgM3(RNiiBXE{LJ^uX&2sm*6m0X{BI&ludK8GV4nVnE;(8* zj0g`dH(FmVpUie$*v*B7>=3&f{I|S{_t4&nXR_EP3N3WX>QL6EPWj1}_Sdxj8W)$; z)yhftl&xE~C97xMF@*0gTV6?+mxn0{5NK_9sGH*Qcl;?;8$-pHI=@zbwRg=WGQVeL zei!@j`%Au)^>`i@+D+M!sWkIvBF#@B+F!T&i~pE}#3fF_YH43J3OQ)s3_d(1JFlb& zFlw680H2WO!wWS^VRJdcW+SGE;3NMzBQjrCHzXMthTY5$YUt9>EEwPuuQjSGgny)z zEu-5m9GAecI>Pt&cSQn0%uM)9@21V-Zm$Q8Fu z;Nb9X8THaE8a0way#x}a$|@I0(7w%L%2R=;sZxs2K z*p@mFsnT;ZoLWR~TlI;9wVkE24TZRSRdlTXfYpu1_qO`(Xfr$Qk|*_zdsG1& zwngRew0*B5N~32;(ci!n0jEuL?RW33pay#{B9_0Q6t_5Q7N&Yh$UHIuA|JdhvTUlv zEYFo14FXaZ-P9y(Ws8hQmhUwJZ61vYe5~EcjUc0yh z*JIvqdRBcEaQ09;zaWe0T4X^C)3r zs4~NzzpZb^dV|7viY#G0%>k>4hGuS~FdN1OvCEYdzt4Fj=S#t#rbEw`Y9j}6Togu5D_D8Kb#-QK z;Tv+&GIQCbyUfGCTz_NCCmR>CYw#k~)n_#nAVfPx0N_``y13U-h{#j=6)t#nWU%g4VQ>C?@Qwl8` z|KRQ1oof63*#X&kUmnb4KsVM!$V$mPt-Duw6c78m zs%pt~A^i48p1WY59<{l>{MZ0YHvY`Q+XS-{)h?_XP8ihJ*g?YHogK6F8*J?|kAbjeNdrg}%kSfNMh=7R2#TNIH8ri?jYxFzI;1&uX(>kC+dTFtc|saDFWs`6`x_G z>mia5ZgT^me_m^z$>q&2AHMRyx+Po3=> zUe0vhY23-A_5^1(R>=N4AfW6jzJ*JTa80!@c)Wh1`V-ekBXzIVnjr)u67yGnXdMqd zGFM6QSplXUHc7m&^wb@uUaBV>ma?RMM;#XW?Hi{bKI4sFHsaXtAIyvDKa{m4kzIo? zpsmTIrTEO}Yz9qbG5pk*(Yn_Y9B4Tk6;k-!`&);-~ET}Q0?gYkn7-Or|^rHR@H>C(Kvx~{mcXnd(A1#b&& z6m-NM56S0WU~MD=pIqaj_W09v1;Rc|dOXl+^t^Z=NIJ!p#(6@_!ce9WuxVR0ZpIGP0<{ zdD@fxAa2ERoA2KSZT{Xos49;8*yi$>o7X1hCp14iuKE{3%N)> z2_iCfRcJ1neDgeLm+AHNF*YLl{e2!Do~zu={-cKSx<+xzSKpl#oIEaLKO_fu{AnPp znzIc)lBx6w;*jPQ7+>s`2I3(|woyDFf=|djGT9LUt6@%B_HMHFub~yQe+UZ0_DkG<5Ey+ZnjS?m`#FE{E+emmP2la-#eUrhb__WR%Z6}XBMI8Z3@2z3 z)v%rDX1xn&EEm8*d|oF|ok;!Jkju0fIvFQAII4bgh625nR}{jJk6xDImSnL^4xj$A zpz58nT?@iRhRmJK73aS5<2DdLXO)A8h3=-McuXsV?Kr6OnL{<)!J~spb($BY|9IH- zUUcctkqPPhmiRqnK6QxPBp;ix6KW_gn=rc~#f`6#L0NkPi6VL+JWmxSAii5`ZvnJ; zfa@gy_2(dG&ZG%22>dD#a@hu+lFFU${j0kp>?9#93^&jmC%YCKJ+x&P&VO}ZJp znAwwr9?TyDt=?K`FUXI&mN1=JuFpH4xAizP*?HSYx=rg{>y|oxhpTFxT@;ZJEv0o3 zm9d=U{;mBG4-BgJk>s`uK{`UqdkGdyDq~U4rjtt@aM48BhW84KG*yz7^MS}nFN^AWoFVX{=muJeAxu zBVIu{IXQE6d4MwMTqCSi%Pf(XIrQq%B@4IqqUp!%9`k%{7*zbz1D=XdDAC%a8qxY< zSbMv|=Y|$>`A4Fe{?!YT+~S6#hZMVSS@!S~1f(sKK#2QBkpe(Qzq^ zTDO|o$H3mA0VE%LP1PT+3#II{2s2_9+fld+`?4D}lY9e&QOSCr!8c_3eAw!QW?J=*Zr69{1h0;ibb;Utd_YP3{2{07 zPIZKe;mN<)e!Feg%chgaaAOI}E&Ao*Mg5E0bCG|YSXu4j9#rfBi&l`LvW<7bpI|ZB ztX8-cb-z;gZghgyrMXl2uQfJG!{ARbGwRC}vp}E9myrH}&-fRQvjXRa4l!JK&lE2s zM!Bc|2f;r8Eg6dCYW0KX+HZ#QAS)(IdYJ2}WcviQJjp@^QOk=8G~qsewK^Kr@9uJ% zt!j4Fi?^L9t;F+O{xMZT629=SPqkU(X-5#hUg_^rQ%}0M!Niazz5e8zLf&}BgU*}Z z({5I_->fifDArtclv!f1?XO3!{y~(eKUo%|H-BakZ%FHOWpQ{RXhFfA%35C(Tyoud zB*_v^XD+$J@e^Zs_&QP< zG@IK>bB#DNIYp#o&SJZL(zI155#|8ANGaZvt2Dw!7PgbRqZ>nd6F1<@p_?S=o zej~)@Gk+?Olh2yPYtp9rpi)Pv0iTrTIW8|BX`Zyb7)Ii_m*-FSclcLS$hw=SB-&kU zO<@V{cM{dFK#h4ky69+f3oLtS4w`f)2}?vSiXWTc`BeeU{3sbe_)+lgB36QECRoFKsv*#r{i48mbFwdMZ%|1HorFj0tz+M$kU#& zfL!vJ67P(KQu^qT5PS0G8g^szW{rd7$l{N4+iqvAcW5tR%MPeJEKYvY)BY;$zQu`1 zQym&rTUS(9DI0+%6^-|dWzikWgf03JqpM=MQ<^Z>povD7`lW}7X+XGfvirNt1C~8v zaZKt|?-t_zgW&j;v3N;I^!GNJ1Q?}Zp0LQw$l|kD3je=%r6yratld6F#|H8L%K@pu zT41=Xmrbdkr;I{kKfcpsa?gNyXbz6r;X%8DO`TDwm;qCV{aY$)2l*{LO+T|we!+w9L0ir16A-Ni5&%HOA>(gR);-ibvd<#Ml3#?r|= zX88yY9%613Ka&w0!>J3bt08(OVPUy;npl^Dg#O2>WJG$%*%O7SlY15RVcNwDa66ytIA9 zrE{rKx;7Qck|qCDep2ny7|~xc+T$%==#huS`SdS`bB93ys}pN;kPXt0pYkEq3RcI{qf>m@xdq<0Mpz6@fiX2 zYT?EWWEf9dtZ%0iTx^Fr66nh@xWq6Y1cIf{4ko$1nTf?VzX)JWp>=B&2XA8!Xu zcHWpY3HrO?UL$dekWEhomU3}pa(K_aK&c3N^{fq3577BF_8HkGPL5ty{ z!j2{#ZOC5u>@pWkwJeNFt1(XSpH+QG=GBkCnAwk6E7&4iYJ4Q$J{nnV0bB*U-)XcA z1r`b%spfRZNhn>2Q3NylmF8rD>*t?Hh>Q`z+`KC;pErr&9nTWJzg(G`g*@*xFQij+ z|5L=fv=Iu>?Zk8Of8H?t{)!}1@HQGBvHs=hBeD`jD40}tKUBg9fAoIH)N12CN^W{A z_IJE_!`Kljyg)c}I5$~`JpOZg|tHw z*eykAL0ku%D^%t$IYTw8-6WsktC?DHZ+XIeptLU&H|=oJoBb{8F}F&*;pkcFTNU9c zak9+jN`)3*diYtrLYzi&34=cU#mTN~0U$Owrt!SL8b+<-I9}fjP4S#9CGLT;b&qA_n@^S>uJ*5`m(8eLO&)YON`@188dCWUzi8-2MgTXAn<)vhMnHnvzyr- zeQCba=@LF2f&BR7-&4B&wXSiQ#y#QP8M)q&`x{~5xg6vI|M|JA`FoJ4$b)q8^%O(p z#>KlN@NQn8Sa2cZ!sEpSs*c<}>KCAiz{%IuPVW#QF!&4pHsjWIh0bL$4)jk*YWg07 zSBs;hxs2zvk>si4_sP|F7i?gbQ|s*0X#BZdJL}O+17|)$d3%YK+PnB6TsCL@r+X$0 z`FvfoWicz&dSJI>Dm?sUnmM13TjV=MBj6VmW;cF-bcq1U%X4eRsS4it z8GI?gi#2+Uq5K&)T*gByR5nqaHx@(J3Xyj?{FEbiWt5H2MF}fb_3kv}|JeCBuCvan4?ut3M*dmW z=?47(0!T^@hGtGbJY69`D}@*Avx;5aPK-bgitl9ZwlOnf%6BoYvnd!bq}&D$~z?Q=a&haI>mMQmg^#i)54< zXkFb?ilTcJ8@RpmE~B$rjXar zFJT%rDHz)rE^0V&P`ghp2sC`w@F}&byxj-X&oQ6c{>((4sX((YJ+cK2jtD)wt7#n} zM;WJ0A!m!aGB4p=nHp(>gT~YGn>~T9w$QVQ3fQ~W()0f*p$AE2Lxu*2#U6&DkIW!LP8%zgG-v$IkOp82^_) zq1y-0OEMBKC8BH&sOSwrbX!nx<|P z$&S`?K&QW@xCWY7+9wn@kkP}4y+qcw#(JY7;558)KX+8b?t(}agGe|~i znFQ?s>NGaGRk@y?9?c2|FjNHdmx7+jR%l<02Yim~*aq!Jh2KVcUt?NT9ZcLr?ek}#MW=2P9A~*4+|K72ok$=x79^M5sN6cABVWB+U(+1_dMHk)&FMB zDfwbF^doHpU1x@}-Uy40=p+89$u@)jTjUyQs?dpVEGM5peFc$=W{bvp%nfgU?wV(B ztda3K#x5MbISw`!1>(OA5Fb);u3EuUi)!L4qB-!SeH#9Rwk+oTAekNER`x%3%w53| zPH`C>Dwj9^9NT}hm%C<7e4a_I*!s6RE;wyhSf`Z`Hl}IdrwFmkM#mO7lrAKB2Huw8 z%~DVK@*{+b^hYs@jQAw`;7A`g*L@>-OTKA&1hW}?{J`{lTzu1^9aW*;Hm#_smPayPXw zV{}#GW8|BF-IG-(L;4n5gja zE-$VS&YYWgK6T2*+u7jd=_-b{Z>w=Lhw^ft*v}RN;ujp*DpU>^hQ)Afu{$5uf#*S7 z3-(hAw4DJ~;vJBk9}%DSPjS^(cWM4N*H+etNYm>B*> zbo^`MHvy_if#MDmU)FBhl-3{>Sq04e$sJ|-3Q2zYpCud8dkTmV8C*!4|8!Rjec=6_ zpYh4tr>S`lE-Ug_MVsaQhvMJ#dK#z~M@PbamZa|vtE;x~#F3|IGB+T+Z<}8WBz{EH zOY?C}WmpDzKd~MpCb_giW$~s?eh2bk5De zZgGB_K98i=X7?GDxxNbFx%%|-nOddBYEU2F+y)o=K0%3ESFq*Hac?L44Co)>7q6_l z84;&LU(6`A$FiT47~8AcGw))Z4R)Z08e1ZgXq&kTWn%$QnXRMF!&z?b9Fki;nO~g(PCVhxLlsO(;5l4&*D&2=1-R^o$!OEle??ru( zFm%+{*FYI3@V9B9x@ha}mzJ7wlc2Co(#?YX@j)_w8Q09@Vz&Q0GxTUB_jGvfLN3PX zgoXBuL58~SX~Or86sAd;9eozT|C`ky?wr;HS`XnOl4TlJQ)d$#Q6?Fr(1rAz+; zf9mhsJ*R>)Z-GMeL!qT=;CODs-pCbL`Vk}|eJ=y*&Q` zcc&uuHVGfi|HE9BbmW5Jg*=Akks?IZq-@gtuJwl}*RzUgM9RYrNE{3_j=YS@4jcum z@2vz#x61XNzbe&|&DarX5-8uPxpj+L+)w9^Q1b=~V(|q(Tuu^Q{;;T}l>GH;Dd|t* zI9pygEcQ3h1UekDQ9)dSxu?)Y+a782Xa|FpGNn5M%aM9h%+|KOrt#cF1Ow3>wVK~q zYqq_xc>E8iE8A}kJT|>}^awodui&%9CoN=Hdr1$v{C4_v-I|?U%-h40qHm z=bde4Il)efR3uiZhveMCm0e(uU~i#1{D~MkfUd-}Wi-;4g(9JDN{ZhZ-tcm|=mSTf z$fWK1Z)s&@F&CoLiN%Yix}e-p4r{6@v0@pUE#s~u2^JX6s=FN`32VQMf8YFZfy@hF z2Z~#XzF1J2ML^OYl&RtY2zXsK>?EFQcCh9Eq1CM&X?W>{mLx$1{x84pQxz>^tYyED z`jkcA^mDifel6ReV*Hy)hxB|my-=;@=o*KYMmzeM|NIe@ImhMf2}IjCV=G7-@#l2L z6a0Aac#)~LH8$}KxP)}%dAq#46C1o$FP^d3m0q8Pn6=eNE7}8ItVSeM7rlkH=Tq^Gb36@J7rcn#T;pX~H3VY#;VBKDAS=$5x&O zKVy~vMeTzQa!8T0lIj#1YSfCze3>$2Z7WygnswvD@Qhf-z+D;f(e-lrR)|uFt7l6FRoLD#jf_X3Y=&7F$YJk7g($5z=4b^*lR~6H?8Ta<(*0(k_R6>B(kKK z=T6OXF7OWe|6g~<8|Z{T)I3+f($;-_L~dyk*EnK2>ZhiQZu*9&6eH%gVICyKS7^*( zlS#8pl`^nIFDZ!KVG(k;yq=G$$nwzLoN;EJ8orXVd#-#6%czlPi*0G$}N z#biFDZL~t9U9Qx6?S3#!b2??FvOXreMO`lfo=d3E+d$5O~DCRYqk4X z0FY|6H=+2O(EY_E+ENZrtLAAmva*c_`=CYk|pMATYTo zWgcP!bOt~x!H8GrvQu5W9H*Dt%uAo{HtO~F<0u;o5mpAT2)ip zM{h@)B{rGD$RbP_rxk-YZur9}_JUpeu1{fV+RpS(k1M1oSkTC?p^y?j{e6fYT&dc| zEr}-17OnH&#fVPJ$tC2slzKb1c`Q1Xn^6JR3J<-Gf=J#TMWk!s6Qe`+MwYdN@adPS zBEU+1!W=vPeY;(2@1{RI{~dKz^wOZR%D4<2wQoGk3{0qakkR+zvAH=qC7DnJ1WB{x z%SC4MPXqN%_rWfb&v?!CaonJh+l_WHw(ZC)CAC4895EBJU}q5__$yzJ55KmZr0or_ zX+OlT+SawtiHAn@eaIH?OE!x)f;rd7AG1to=2vl`A57@U)6a;X$`9fiRVSjC0mQcb zuWzxP4z~y?*tXZnsRCUZT%rO~%P615A0!B0-jmhD!Op$mnu{gR0fUd-miz-+aEyF9 zHs;dmUAoGpflTCI*VJ^OgU z71{F;65{qkXSNB*^CtRYi z{OP(gfRaO(zHPH0`z+SHO!T*NkWq+KLN{RA62a!MWYO<@E$y7!8py7&VO6(<4JXu% zG=~4!D3)nH!a?6*$H3*0Jjg&X(YU<_X0~ko4V;HhRe3Jx_{`dEuJ|AqY8g1GX(bU;s|(hV>DDjS^5*Hk$6hENQ1>Dbix-31A*l z()YVgaKwI)(nZm=Yd@t4PET8vmF~P_ymI<^w3Lg|kcE7!&BRLLLEvh_Vg=-IW1UYe zP^Rp%o&_^NBHFC|bM#9pUC2oIsyy((DpX!dEa;9phE0#3!gy%+vlo(Ks4-AbvVLZB zdYEoYL=W;UI(5&Ad})4}O~I%fyyjr^{H$8ql84AF!1d!vM2O0Ql;2+D#_#na01$Ct!d}}@tEm~88}MDC zd$=U5L_1VWsTMtJ952T>$Iv&ha3u7``behux)u6*I7o$b@8c=7FlU!pBplMK zi5zMzN#BGBNx&g$M0zdew2{$`ZL`1M5_=T0r;ZAiWrz;Q~Y*l(fDt%ew6&5(A_Jxo}cHnZg@^|wnwxk zVDUa2Bu~&A`;wyWCZyA#<0;JfS=d1-ocXq)4L7o2|5`(s;~bfRV&UGIlceVO4b}OPRn(sF{1ibs-1!hy?CVTJie#m9OW4 zFtvn$OKtx^v%eaT8kN}~vrPE=L9u@>wn=FS+&|0P;M#g}oXVGUlcVl_3EKi@YDXGt zscQXcnZ@p+j@dNq!wI(3v&{kAlEA)!lPsf!Hqj7B3^L7LN{J9cHC=L${xvufRkVA}Ae0 zwjEnH5dW$hAFt;pV9$+=vU2K|NcPHVex8xp6}vBpwFeA%*82XYgxBQ9t7s!BJ%IX4 z8Z96UF~`LK1m4n;nr-urp?F*J`WnR7J-b5b0-BEt`5UrYeK0D2cT&Prw))kM(aN+E zvcn(r3y>;4+tR0DYXC?c^wwZyJq&g+!H1q`=R+>S%SQ9xY3BuQy86W~k_Dp;omgAi zm%mx}dUk8q)jK!d_CXUZ(ee@SuqwNG4gVuflKz$br2MPNL-3!-DPp~!;iuVzL)nb) zOUz_{&+snFOUV(LBrH;#bZqZ*oOG1m_Oi5?CnU^?P*FJp0@zd_=zeu<>djTyv9R=q zON2OxK6$|@8SW9#JfQ&$;=>FBmWBcQ!ZSP5t+0$w22ATPm_0zIg)&2awa!9M6l zWOVV9UuUscth0nbBF56`%C#iy+;f_P-&a+ai}=|8J)PGU;kEd3%c|$6+(6q-?5xX% z{MikQ=R0*?=GV@JY~8I26GuY*?(P}RL59VjNqy$7Ub5oKm9tV4ChnT3<%7e6xmf&K z84Aqp#-k2k%1=WMT{2mGFWJdof0h4VS;&8c2;%LAyi2)!hCgTa6*iT(L8^6>WfQVM z$4Y+k2E+p8To`y8S9^PYJK*Q;1Wku>TaTA9a6f~)TsUWI#Jd}}_PC&&9Vt6kw(J3q zZ#NP$s0rKOvbE#>M7p=RFzM=YR1E5d`>#JC5|`IUN@i;Vra8v*8&Zb)~_>Nxek`TUu0}=32RP(;GiT}=GDuPI=J3gu183~xB3jr8{ojVsV8 z;-X!=$8m%Au_|4Rn~K@%<5?n?@n%d2a}cF6O6QxeXr^?eyLVw1fXHJP!%~#YRQMs; zVhdf39^MgG0kUxv`vHNm6+LDD z*B=rJcfM3~uTnY30yz;tIud%al--Y;)U+pV5Kii})kBSGQ$vA4L_{uv&RO1<^g7n)|5MOM zK!GLo9qfD8at!o)0a!h{IK;_U=^hyg*XVtN0}W>B#K==Xs)`q!p)wIfo%V9ri05SC zoa~4)PnNLd$%eT^^6-8Afa1sYPdG&VZFKh`M z4+t+$l(1S8bc7bYbT}9g>Oy$Zfh-KTp0tl0Vu_m@O4dgdO_}rH0k6XtvvDCiVN+b& zdnQH{;v@{7SA`?|OL2LKx9$2*_3UMqRtN=bIVyU2JGBoiTkIVQZ?mUL>sGAuiJ3a_ zAa94gBfC!my>p`YMqWzQc9%fhCJhX?c*wdv#XWhV52S7_hx+{XeZ5dfBFHq2t#r>0C8z;xtmAxkC+`!og=`wA2*J5JG^lmN7WOmRR zUAaUR$dI8QPb{uVzM(zEO1d zmb!Ys)9_!=O(aza3pFhan$>7jEAR*^8G;6dug}^t^=>b0UbzNV)Wia~Ov{b->WWCdSlVYtA=9AZQM;5l4CKnoBZHCu#tH0COBqXp;a#%3p(oR*rS~yte zK05L=LZK&u5kFru{{#31!C;~*0mm`}saG}T+i8=6X7b_FYjQ%;oi{vY9%3H{rF#IP z*?6Z2f;PIqiXPv7cIFzQc zid_R<5tY(R+z0IuDM(Ry8lXI5@GmJOi z4d9ReTE43>|ISB@buydAr-(|(Zlb?`c4ShRgpYcPQO(OI9~T+I#(GT&k9lH*RaI!fFU`iW{XK`ebVuL0V8fxQd5>|`_AO9{H&|n z<7?G(3}25D)@lZlQY)Uz4j4ZG-rq57WWY2(!H2$rq-*7>WRZHxLw2qcB#b#G{fclv zQiUI}I?JY~PjjvjL*75>IumRs=I*rr=}LcbA_K=J!_K0F4jVpDTctDkzU~b5@}vMu z8jZzY{mRp+0e3IfWiO$i>xl3g0rfO9evUJJas9Wwy+O8~@iM1Lh-rLTFQoFHxO?nY z6br`_RRl9-hvY7+#{RFT`?lZPW>ScgDyn=Ch54hSPR!xBpe z_f6(DuK6dwpr@pV;Un4X9(Q;qYj-<3ZU)+2eENFkV#A4|tjT^8cZSkg4BOIMZt2Li zk(0?cyJC?~l4o4nXQiU=T;?(25hWnOyalL4hn;B?=C!c0Zk; zjDHQ){odc@lF%l0?$s(^hwl<2bs!zPy28Lw`g8?VIq`Dk4Ap*WBKGO}jeUBq`3`%Y zl9a{Hu}Jk2SA0!7(l0hIO279AyZ9eQ)GeARtn8+@!h>{3$;1W7w!QK4Y?SNC5h_Uz z2`t60Nq<6Ydoteid_;xOz)YN7r3_3BAIv|shjx#0v$8`n2^p` zvD3(cxea#f%IL|mKdg~)Cl5Lkxep>a;cM@zXOt{wMOQQ;JfF=$a8k*!DhoF?7BQ*_ zd(;1T70hs(4?cS4c?(_NMl#4zHjtV=xwHLNdF>ICO7I#9)#XWRwVX9h3lFnNSK*KK zo>ZltkA^mZPhc)hV%M=HOxs@nz&v-ZIrfc&^o_a)IG9^#Jnt`yu2E4PiUxQ_EyF`B zgQ0d=G`9#1a)#V*n##j&hIs!|&D-znJuTPyELuN2({p^QgkpP8qa%Tny`Qm^R?q6Ko^&}IR$G~8FIe-k?BQ`$qNr1{ zD+yOS+2d)68EcWHXSl^Q_n*CTZ!JCc+T6klJM>D`wFh~J`e0IQR_*YLE$7Q|py0VC zkvZ*TKpTdVhLVqt=5CifhuRVtbu*=|Ydg>Q*^_IVg%qfd>YcXsZ4+-k-=%O?($Sx!LUQ;$$yTSrL@`pOR5~yE! z6%5R^XthMObTu%1YJGZekI=H1c%EiH9nQAl;ka?PEpQs`zb(zlo~maL$o&8|1loZq z=mshFdVZoQ?3n5o$E|Xgp0on1^u&E`f=Gh9t!~d@8UC8<#Re%a&nRgC<)yI&N+gcGyfR z(9R6N26w%2Oyi9y&qvD={#s6Klq!I*ij4|I2q!6U1+K3FpjYFr1+k-WUoyB!lVjNf zeodI(-BP`EhP(N)!S()8LSNC-H7iZ=8;K3>uS)6REja6|i6pWndCa-rb^n5wpMSHc@#gvHb$TbNFcxnW4QoJVkogUM@+bF94ct9dYJo8)r z=ci1zAG-LK+A)xtcA(oRyRrE^w?FjzbN*bFhsdHt%}&>w>+KI!ib0CRo;PlVqF;Xk z!(o@|FXN+Kzrc&f>3{&If#X+(;MmO@io-X^>W9()sfZYJf0(`| z$mnWMXjtFkGlKzg=+7OpT$b98hR+(wu)zAk88CNwCajDM{pr~M#K~8jhc_bWoz1HP zuu+qZkx@?QS?}VddantsCW_OE;Y)}2TM*eX+H2+&#IHCi8-`&@b$e+{nJ`?4-W!#!f*_mCTh@TsSskw-7J7k+OnhB-`D*B5qNxtYpv5u=ws z5=pWQ_7`8n1-T~ibz{Q7ss-}C{L3c9W3%_|lk&Ik$s9i_(7Nz1a3PLhwl#4dkslzi zuqn2F3K|+hG`j5K#ncq|ku_;J*7~x=q$*ogzZW&;I9(9FCtlNHrRL_LU^24Z|_AO83RnXBdQ9T{A^N35-{E z>NsFdqw-)LW=m!8H(+DKY@95!AAx;Ie3xn@7WV92yf3tqB55_HE6cS%*x7a_xu}>O zQ{W7rv|YSKdT#s@$uwJce&3XkT%QGMGrM_y-f!Q+6C)5`6W9d=GV7fGn>) z^*QLBVbsdGb#bFY(N`=wvzF@l?Y@#ALc*b<`+f5S>Ht7J${&0=rS0;d7`s!G?up*Y0WFrqVnUuO#Dn!HLC%E zxkE^F>VPfCR&%4!*CaW}MkU7I_RJt&r9mz=Xpb=$5a=DBlCA4sGBE4B=Q;dBwnO1G z&j!ZQ%Bs9xH2Xy!4Z^)YgpOd&I*u1lSl;$M1HHQ1eYq%t_9Q68NOb@kCoxu0e|CF*mrs;@VRy5h$x!b+uSAq>T< zHQ)5++e&r80q`yWD*Md8(oSJiZ%%$|H;0(s;FdWLL%&rh#Q|ommzpP) z;`Qxy=i&e`fzz>b*?Q>SaO96>{!fC2(y+WA{`_2TT}`<@>xe=fePRTsnnx zfN47&!p&{iOk4YuF6sf3TTWU_M5^h1En zQ|ZZF-LJUWySR~WJ^1cWh?w~zdz=X?{(~dZmH^&@E}?s6-rU0b4;^-6yak`qE%k5! zL_;oYIqGnCC5CGSFNxVW+ieQq3MAo34?gD)sg?!JXzg;ky(^(6R8KCCdfS8bzUov5 z75bua1Nxrai&;Gy{5>D!9ZirK^*O*9hPK?Q`CM3j12R_t#kQ25Z86;*zI$)Z@QYel z_Ok^o@KH%nC+Mx(TqP$PS@#Bd8B3|Zus|tkp0kYm1Lb7zO*WvLW^dhOuI9yVRkB-kQgdwPyK3Dozk50|)eXe=a(YUCT(RFh=wa$Q^>jJz{_TJ&jt96g z`K4`p3jLYtUTPeOxwA9(a3&lH8V_f}y93|bI@20_v5hRSZA&hr8=Jfg&{uiYc~8hp zg5g!&ljEP%gg{}fCmr)7KEE^rDFzT)#Phxjt4f>9{^Sxb5MB!zC~k`8t^|;2G#THl zVTIM&2u0SGF^o)ixCMF{&qWj2tv0K2Pd~OnI~VVgEjK$+JAr6FJc^)iAEjawolO97 z?Zz>EI{6L?Z$;rzF{vI=4!AzGb}ZB1Y>!ESn&rW4YY;-UL-n+X7^;^XJo73)7;OcF zg15SIZM=s$&9tNCX4?~WpXzY{h$zl&qQS)vFYltFJJZWgh&fHLV=uc80r1IjX@|r3 z2vAWi&c(@*RDFjFNpx}o!Q8vqw&(ikObEq~$;D}qLw7oR-Tn20aF@ZNHbjheUrwE_}UUT9Co zj9Wa5+?XDQ@qIYg3UgC@{1_eIaIIRn3`dCC)kG0kU)CLT9h5ZuUmo-5pn5zLD$Vb4 zb+H!DoAFVY=>`nnxgL48_(P*Pi#3pzLQU!|R*mh%3Q)-t%&Ygx@}|d$y#pq!^t$d* z=@Vt>l`B44lB4qN0ymE4wbnW#0Gd>d!1Qw)!DZ8Zy{mwBRk&|MC-bRqHl*Zi)3s;- zTEb$|XWxD$j6(aD_!Fbiy_$Ou+aVJA%o+No3IG{1F*#d>qQ&X6%?gA7CU?09_g0TD zb-dOsS}O~tadkW6>3H9b`Hk0Im%PrpVI~1?QWm-6`jW)T%dFQ+G;D93;uH@Vw~>U* z)1!vPGO2+0Xh-6{tD{0p??4ZV!@eEF+=kC}h$Cp_fWS^*LnYe#cfO2V_x5la#V7t- z)LncBR$=K#LdB)(Ms;kbcyT=N=lwAPniJvB2&_#ok$|b<;rWvKTh-;lZOvS8m729I zh#+wxu_Um7Hh-ZuD~BS1yxH!bd<@KvD8Olv?SEmSP+!~l5PN~aC3*5(VozQ^6lrR6 zQdmifDcBY!&coTld$PH5bUC9#0dL=4sJs4< zW>TE8E!ZAz4p$BmCkaWi@%ReBXC|h!ld&QOk+gAE^t99JQ|ZudSSgEjL~gpTzKw&s zCYxMp{TIrT)SIyF=rM3%ai9G1OGjo@y-)TE7sztjt z)2KZoo(c6^aRBYgL2U%*v1hRo5Dv>sUtbspkgGsK_zimBP_8)s-DD4>vVkYH&RD#N zSycE$>(N{(vlVu8(ni`2(9@eFU0z4lR4jXbvmM`!M=tbQiykWQxC3TIx2!72>t;qetzn032@w%W2gfhROzcVH!EU%N$Ko0>3tx-ul7}CN_~-Un z%jfZgUe>$`wYv$V>%9=c-%dR%l4fKtWzfEx@5}-+rde+7qpD4#-f`mVTLyJV zCAHUOW5ToQ+``Ft^shTM-fu0C5L&p~u>jSomiR$#-bC0K#(YUR!kiI=U0!u?TYO30 zD|6g?6>~O)cDPW+eP8KM4vQ1_PCzq@N_bDU#*TVwJs)$o!qKz^&tm(5!zedv2Zpwo z{d%uDpfF-N?B5Ini2EXhkU%qcnN$_pyFSC%(Qr4}S*7nG7;m#IpJ*mndA0{Qi1#?( zqVhpsmIvu6DdZPZCHo7ce)nZtAx&4@%t%xUlLf}G3S^-)40iOG`ghMoC9fZ1N`K+b zqofIC(Hf)&6BLB*DCCoa@ELF%j(=DRNdU!>Nte%aUnM{@${JEdK)mhXnD65>bodGT z&~UPea#cM)N#ymNl0oc03QFzn1S58bCO0Yrt_CFwr_@F%3$B#pFrLJltDro`<-f#V zaz-XOu?zw4BBK>ZlHp4Z8VrTDvdoJG84IL!>mrXo|?S!IIs+)IM-~@i8fAFHTWzbS<5D+VIHsmfv{>xO40i^ zqv7|KT~*O|k5;_CYo~s==CF{fsVPn0db<{WJzNxEFV>g$j-BY)s}H<3D800^C{A<+ zx8EI##b5q}#@L_$z!r)699v<0Flg7lM<7BzRvd|{gg7{Q6F?keRH?X*dz z4!XBjOJ3XZ$7<10!3Bl8SP+Pztw^h9rZUNzF+j->~{VaR~DNH z(~1h%WZZO2ACw_MJ|7r&Wso*>8JHTV2zu~l@JMJbP49LdrUl1Sd7%>_Kv#x$yGSHa z$UP=Y%)6M#ANOm{5y`aw?C9&$i@!BtX)=8yN4=r0UE2ES}gFBS2 zgiSk5DbheQlSI)Ik0+J`>L`M@0ZoE)ThG#s59vpR?Tw9FVxXKLxM zW%!zY^nJ5anB!Tqws060+URJn60?_{;~3wT0`+e^djNGqcGwS@ako2tROe$TwCCsw zzy(*svFxD}&89$GT)h?L$!!nk&wDfVf;y}tjZTtVwOV;zx`QvAJk;_TQiS&&a$bw}woyWXlr{>7Ul zqM9Y1Md5^s@(Ronp~Ye3*v9;Pqw1&+`|vy_cU#s{HAK@M%LGjyg>CQ~>&O*b%$#!C z;4&!`m;fqysx`l5n^f9ugNoiVElc;T{dn8PB3m_`*I&&)j*RHXHzL_WYB@wqjg@T) zUEzdb9PX5PTB>rL$M*dR{(42jq8;m-&_YK_WA&YI8`quXW2~wUR|~$X+R7i_x@Sp~ z9Yx*f;1ldqJ7=)N1eVN(u$VH{)wvr$5>V2p2h1yO^!lzaxbSq4UZ|bTBIJQ}{sFX< z>=m~{l2SN7Kz{Uy?)hBOUm5l-B$Ljlup$t%=IhI>gr}H9?%5x7o9&c3h{H@ZV)5%} z)W{n@?vnk<>d+VP%+F{#{*vKCG$8%;8XqRdOlR^%boW)?v;cp3LzvDxDnrv|hHD^P z(kE1OM);0R0w&Xhb8mhXU@*56VK?iCF+KCvB75X}rjK+k+?9dbPoM~uMsQm_g;iyq zL%#f&yd=EZi6MKy3b)g$Cb^g08(;LCT^Izq43qF&Ik~4*ki1^ZQoX@r6|bKqc;6Bx zDe`RO7q|s_TvE-AQhp0R805$|GTmsH$nG<;91HijDXe)jOuvxzxkGC*73;Wj=DUa_ zN`VqN8^YjR@g#5+p}|IDcF!PE5jv3{P&nM}8gYw56soSu!1-Rq!f4Hgj7(#bySBsT zX?-J@F2&gqufALI+kT8l^k6h~7I>A1Cv2!9H)V^#Jz{I3%VFB&Tz3{s4bwRhMGo%) zl=06Pvk1fKiqP1>Eij{YuWwKvUA9lIBK_D?U2~*hM_VnM#vTg~AE;zEduvC{ZbgYd zsMKy*@asfu=RO=Hdst4KZ+L~qmr0R7j*DyxQPbU1?n5e^%R=2mss=s11 z4OYJu_l;`vtqiU=g`)@J60s~%JmdXt|E6U+&#woWERE9|V(l9zE1lSIo?NQJm zhZ>PxhEA=|b#Z3<;QCBsYdpQSCbwh(mX;r4RcVFo*pfeTS~Kc0{PfD14#CZrNc5kX zu9Kx}cGZlRqjP^;bSHOMt}9wg!mF$Lh4KnVol5Z2*s;*r)~)&i*psNcaezk~G!wg` zQQ2`OfDB|b`iF&+p-+hBb)&u0KKt4^ICbC4R*GsPre@r}L?I1?AS(O^M2i02cN6_J z{ZNT8S+_Yrm_z%r3T6#Ky zgnF(pCTviJ@);7iVMmrY{(Y293^ zFHGJTMXSD0ge-_f(5`HM=a`LC{fN{vGtY`LeE5BHaWZsV;@&MO%bur4-!x;p_-l-d zHe^U!U+D0*`YN%5#!zLkZ7ls)BHUtt+t+$=gyWI@XGV8UO%VL@9j=g&y+~U zYrDDv+SXO=Kc=>-TsQS|&404l0(A|2$(c%0Xxy?%<<() zxRnJ?5)ii_cT3~7eCR~^+j<-FJ7!~QJ=iH&tx|kE^#fjZrT7gJmD|hb8tw6aQqv}v z;Y-stZlRwj#$xbyc#Wd6qgZLjnom`E!oCON$#t2Zn~@+0RUL`iZPuLxxZ{4F(8DL#a=bLm^`2|7o@LcMb5qFPR&dGtnV|wX z2I2>?_P9n^D_5sZy`3|q-^wDsDR$39)79|GRu3fa2dL|%9>^vq9K76lZyRxkz#e4x zTqzFE3&to_ZB5MG%t|cb5D*%pSfG^Pkc-s6F*P6nCKg_})O{n)07NbKMwSP-*{WkG z@_qB*&B@c_KWJ^$&y5O;De-@;r!bPAVS<&iK9Usi;^=G$)N8DOp@K3rYgNMccgc&r z8wz{h&cbCE7wp$HO_)n?cd<~raJ0n&|AJ0bx8E^hsKAIXj06Ie&t!94g!W$O5v0+0 zHwMlye?@2RAe7WkMG8VKQ)By2`$c9hll;2t-jXYr;9;HIo*dYMfFgJ+bQL?i6T@%R_>*Mv3lXnPTWn8NDgGgSB^BP$~bj z$~L1Euhw?L6K<Sf2SELSK6|-=11P^2i-E96n3|so+?(Cw<@dGoecQWUu94Ih1O2T zMZF0XzyaL9Rx0wmYK0Gn;} z+1FHGcziGk4!MECGnSL~o9%7{GytS(215H^A{f87>w9JfDbJ%+iWG`nEx(gxd7;KNz1%wqfM>7fJ3P?M6>9>0=I>S5(F%*K5lX5TkOQA57h721u z{^F*$9cix`qc9w396LX(@g$5%q_KH;=UHmHtae84?asRRB0~|wUid4r=!cDx#cqH7 z6ThA$Kaze^luYIkTlQw9i$I~%1OMxrD2vW zQ-(fKUz(UU0YSlWV~!E@V=&}67~8_HeSzEu?F9&Q4X@HE96jw z-oJb7-MlX{>#m$tk`Znr*z&a9xz{Cp4I&QR8=A5lIPqbZP}Fm*Ys6#3CBQ zYfTuVrz*m%81tZVR%LK*WHApm^^NrV*<$RBdAshJ{&MK*e&(O-YQ!+^1Vi(FVkiCU z+UQY_-3rU0`+E;U!gh|& z4N1zu*%uaEHd)-?QOEC=`p(_{E*x^iX`^dKv_{bD7?b8(8ZLJ#Ihw=%Nte{=&Lb1x zkS9L~GIZsh4D@KsM=KQ$-st$M#4rKC?E~4yK+WgtiQKhlJRr8g9~VS^3_OJn7>yI@ ztx%SL>N_Z*n$uyUi50YgV6)`g(X-7dg~LCNd`= zqW|MY0;y?B!rX^2=U1n`8ae*OkNPy01A?4)Mja=4j>kd%*;!2XU^W5w(CnW`one-3 z@k)atM;>)Pp+@yt$op_Rg+0^-kV-m3#z>BfqkNRQ|Q=Ww`<3+ zD4JAjkt*}V-V|v-632c8ifYkB`R`+r37?7Rx!sB8D6I64V@&wP#ov71{xHt8YA~^7 z{oN?xie=FyMekm_f#VI6d1kTF-h~#oM>26YW?S8Ib%(2uPW{7UGwj*n-4rDs+V?ZQ z3eJbC8{yXCs#-cjc!M`fwn! z#mNYd>OF%;>^kglesgrFIn(-g0fa*_n`}QM#5zVj+vW7Ky-2-lI+!@QO$r7yaiaWVG0ra3cq$+f<5yYg=jtkZ1?~kIphF{hk$Fl7sfvjp) zjJx1?8z3FrnrFR8BlDx}{f>aNH4$>H@uE|X5oS7U+w8+AnMb0d0eZs|k6_Ix@wk^k zZO+{;32WZ1-sKRB2gU=|U$tSck*N53km_xPo*Kr(>5qMr?D{07lh;=eb z2uO3RJwVOur->@Ns7E@Qhe1p5gBgV37ZZ%Fwv!P(Gip746jJWVog~_8JG%e4BbBR7 z^WtNc{&@+NK88mqY%v9PhUU;55oe^urhMY(+X=yc!f{;$B4E{LW^Ba-Sks+i^395U z2Pe2GY=~0h&D951vrAU0aZ9q)rsIM;8*R_5u%yI$+9PIkUQxjfqOVm!Z=(sbD>AC_ zY-2__=y9QI+>5RI4Ly9NaR)uz9GtH=MUO}U98hwI<^YHWhATql8?-?89cIrtNQ=7U zrKZzSZmE`vR}M0sn&9=5$|Mop>b)L!++2F5F500qIKF|t)Rmxsix*TqD0QIRQ!oak zj|S2*D<4cL7n5EGs2-XjIQ`(2%O;0b-}BjY#XRF(hepdUO_>N`N$m~{sS$zl49&#{ zPTM)sWhn-(rQtTgGko*JUv01s4p_%H?MH3;z_YFFpfE9E8S>IXTd zZGw~Hxv%cj{jh#Y5o3uu)2v0*mEng9f>C&SO0TIFx$ijvsPoPc zhoY^E4nxJY>|w1`Cmigodj9r^nyjuw7cSnH+P><#1*VIa`-%UgZ4ADbuz-F1Fz54_ zyS~9?{y2}HWn^>tqNh+h#2o+ zd=)PP3b4OiCvYOa`M>73_MML1A*qgbhz4SNtE%TlQ3-+p^p(A(M-(3!Xrsz#3xUg;}TXAQ3KmQ{^|Mp{dBZfw7x>~lq zw=>x_Pq?JdKrfLFaj4r3fZfpU(Mb{N;t#*5-}hEB z*YY44iAsCIXTudXP-NSn#Zza4D#72CSfZ2|>C^iQ*?&E*uqqcb4N=eYrcsS&!kM@d zG$groUASK*cRN+tWEqpXhppLlCmPUHz&De9(rRnZ*bZN!&sivQRrc0}e_GJ^^A$GN z>1i&Wv}cAv2k={}A@fU>3b*O1jM$dJ&`;ubHZ9>FJo{*yU@nee>{`0Q?D`TmVip@W zpA{}P)Gg&sNqW0| zM?VyzfwCttKBWRXZGObag1iKqCu({!FP#cM!)b7`7Boj4;K$|2SGd;e{H4`jpBVmh z8Wh>YEFMqY~U5g2I^V=Qr@z(0ZtPCZy+%=oB2lXW>>18xoP)VHe_)r>M_ADAbJ9cVND}}Q` zC-S0v$`ZYa1K$EbAuNmbIqT~G2`WE*GNT2dz*I9Y&l0&9>4noZhbNhDIg3^pn~S64 z^`os};*s44PW?G=Fl*mO3y>wOqt$T4*tqtKyao1bl~)>+@1$3|5EuyU^|5r1a$8)M z?9>B<3c%u!Y~M!WE>gdMJr|GKG!Pq}YiiH!qAm<8OE#%J;u{73QC?02W%RjxBx4N;x* zv3DcaWKzNPg`fn8O4Co}u|MlK&FMjfUTZ70LWdj+16le2*}D2TJ0Udh>NX_BNmR?1JwkOr`48a`3DNOGAnek9f%-gN(i{6Vg@po3?G*Z<@qofPKG zDgnqJNl{i>)Y^pGFS^AGHOq~kudDMIFmGFPDE0?yAlAy&3e5M(YW@9C9cpagvG#dO z2XEH~DRo2%?N*=|reanIi@!7K?flP%o)nt9_$+@Mz+ZY@*s@>sV)R(zcCb1Q(HG7# z#fUrB$FE`nXG)}%4?JDo9DP>ph5uwYY5yINOxy${pR(1QGK!BG$=DwBC#nddW)&#; ziiT+L1otWS-`S1psq2U7#}|Tv(4`Q&1Qahj^GrK{jZCB5G0`!LzqRjBw8@Y3!g~6@ zNgn_)GdpqBc)11>#AnXX%Wv*rhwja6E*u{gE;}Hpf<548E+h8;v zy9DdDrMC38qv6U2j3R*X3~be#)prg`H9YpbNvY0$75rU$0$s@D$Kd#rQ;Yag;%6s& z>>ZOfDH+hLY%)N8Y(3pfXF_rxp(9c-9HSAvj<9#l%#t;{y&~0VAjfY9i+a!O(G87v zH85XphxI3ZtmNjX@Byj>r6yf*tmhK&sV6c~CLh~;j6y|Jy6U<@rv?N6;85L_Obkmw zscf&p$)_KGZJ~@G4Rl7Khiymh5`SCo=bLiz_&)qS^b40&FU;DwVVoj{YN=NyRJ`n$ zvOSXtuA+?rDw`8!JEzZ^2?LlOX`mR;=G4RRN&xr>IcCZWQ9G^s1haRJ!&u_TNufun zkEmeVe#B{QA3Sp~p(yApC6hd{zTGg09gNlF;x6$>iu}I`0w5SiG!b|84+uy{V8mwn zOO7L-V$0HwcQ-+q<=bVYoXjm-K+kxtBgP!*DBH$P6>}*rC*_%-o_BQd%|_&}JOs&A zis|)sw9Y#DKy=eb(d)S&?dUBR&HhOVhv;-zL9X2jBPplL{mxJTw41o7NuT?zzeU zb7H%jnhn5;we}|D&tFtzC9>TA9;josnd>v(Ra`+7p`H}gey4#P) z9mp$k#O`w}hjTS27Lr-)R`hvGVBH;jT?2;FvvQoat#_bXktkS@UpD!A>G3n?b(Skd zGu@Jon0hE38Fr=1O?ra~zc~V%-#5bF&Rn;-jrQ+$7JL>EbG%H&!6fjDd@6r8YFIR- zxhT4BF)3P`2uzP0H?5!-r|ulM{B5U22fYPiuWkg6^53!ro!6SUZ!i4Sf*K32H zy*!Lti=?ui-^&p*iHSbY7TnX?pU&saG+8(IrQCis`Iev07FQ{A=0A5NZiH?;i*}`_ z>vn7LrGiYIxY~(LP|(~$?flm}!9rvE_a0)UyCeV&_Yt^fphZVw?Z9_iqgPZvoZDkA zGX>#uppI`5>iO*+6{~k7tg3&MbKXYt!h`eWuV4X!SeW%@wI42>{QtlDQ{5S3sXwvLM z52w(r_%Yr=cYLn{X`~jmzlMG|aO@QRH%S2Y>*XmCZY?Y>RGQ3q0>G0}UdhEgZrj>p z{NmI16LQ--P+>go-tEmKfOyFTDPwf^PK_MH9Vk?h6~AEgmqbV)8q=PXFDtc)}GwV-7eLQPO)F{Wps>Xy?$U zWESnTS)mD;q0!lCBK!Bip^0Ktl;!&p0c$ zPd;2Z*m#ay^Z)!O&ZK&XabVfLvu->yCuYSYflVL-q!4tnsb~>(t-ObjU}mz!vktqc zFp;sjbR4=5xRF}~oDPxKtvMm;g4+LDb)5LXnXeA1ViSBye0(byN|_CbA;xySof-=T zay-HE2pz(MErs)!hehkRkK`i8nMQuFA=?eC7*%28ha3QR1(j%uAEx(uEto ziSJML@Oz2=;Qb#zUcG>On0OlgDZL|p7zP8C3tz{&QpE{DrHgFil#%5gU?x7Eo&BBZ zD2>hk={kevobM*kc{;IVP;zZuW0!^87CEkR4d-bEv=7f6P%A?VDfzsn^6$sLwm`hS zB5C+OE2EHv*EsFcy<)MHdl@9hG?i^iF7qqzU? z0%S%0k>|K+8Y23Jwt(sK&+da?HZ5t;YybUt@S6x3!*6cp&A~d%fHP@mEjQ*cs-X?d2oRj$5L|->4Gh8E-DPkc+#!Jg!Gne1?(Po3Ex3DdcLp2e>zw%B%q2 z5S&G%)sTTNA7s;S!0)diQrgaNaNL%E*9)l{XE)$QLKkr@7gYyy7k6VPGdOp5cNQyq z8)vXF#Eiwk$s*-MfCvum9h|h7u$o8eQJeO6673)9H~Q|;f=*)y*s!RV*2l#Md0s`v zV~|1$i{S8{^?c7P>KwTbpuI2oJV_C(UUAaqTY>G~XTt3_($fOr4Lu_VDTOO{`+YZBH90YHHsnDcbb^!NFSqV zZ7UAidg%Y>zkUrIczYMW^gGg4DEmq{XykR>&Xmo~c`duoITSuXsXv9E-ymO8)3ya> zcacnL53+5AobxWog)QCWGbGq}`|^hb+SR2^DC{akv(IPjc5b~yl|3AJPaHMzm`S|k zX4U8(w<#II%g_Dm=m8~eN)|Xn1gSgl)o3aS*tP6;TIfO>h%_rugk@wKwZCY_x4oIK zX|90Ezg!N&u_DXvU)o?0rkF zumMpFVplr^k$tM$!3j35Zl7bSuk)=*PoXb4Ml0j$Bd~VOu$H&qtN;G{9ZDc(*&9E> zOpUUJ+7?}!+8g`KhMMR~!GK12R8je|ozwFLDPm%2c?>>bq#B&RppQXB-wu&nuh5o~f6xiInhx^0geV7ne@S%30%3xO&X`mQX=sDw+Z(jJmGX~>c^ z2keBdeMts0+7(HdAkr08L-~d?##iM1brt5A>-eG=c*TVL5CVq5sg;1dG89w<2KL6q zHqoTp6O8bT3zsg}5lYS;c?~E05kbq&N8pp2c1zZWcY`5uRVOQ53x_!WUmSi7jO^8Z z6Htl4rcd_zE#*!XaaD94^@g&^yN_5c$N`Yg?4+`t3OyhL74xyE=+!KGrQ zl*j?{9usX{E=?9!$!WIDC+5v|Hl-ZIny#YudUgb5U_AH87{Z{j5cw^Z*!RjbFN4@) zIK(atFS<`?y6hvu*0PsQ^?G6BRb!n$)BX!6XIn>ElZ)K$RWEUhRtfB=+f67CXOyDC z;8DE2MY<5>eBOlm9#L0Cvw!nt&b1omGK^ZuEu@7nqn~eNTBdQs_G%=O(I8GywpVyF&ml0 z)8%Z`eU-TbKUKwFEjtBz6Lgb5?cM6oDnc_i+m|GfR`XqKQ2$>W8^dI*b&IN?8ahj+ zo1mO5Ia4w9UIn!j#+dm51+k<7gJio@G`~eD(MQ!IFwF+ld~~7zVgwCnS+#i2l{gU_ zPjKC+M!a40!nQ^_zRihpu|DOxKv1!N^jfg^0z2AOmdo?da-Qx9hdIaiuQht;$3yjV zBWtk1E~Zpf(Fxz8jd;d>OYRxmGcCrqx>FHWgV%l>m_(utkLqvuSydDp$1*Wob$wYO z8anpFmHzGLwAE7cne0nsp^l~ATkU|+|0Wt(eBfNhM~{p>qj#@uuBjXwAHV3y)>Birx!59HNwVooBBzT zYcdm6FSNLe4%Kiuo&REA6L0Dk`>)AE5{?Q1NLn>$t}%<^NY;|(h-P}Nf%7`RQU zwPOL64c*L{>{|$34m^@L0`oaNR}mBYG}@Ky6-A0lt$e){6IbLNw;YX<+`Jq1`~lKCJlDY{ z;kkO7LfU(+uS_s=f>R<5GpVGBG{KDRJC7>dQ01)b9UHubmR;M&!C`>ZSQBEGAS;`w@018WX8w zK#*W5Ki8%N>-T^(C=W8+z(E)mzw@O}-hZT|QVTeHm_Hpn{#4>~vYH-J$*=)llAh{c zUAn}qmnf(B7{eQ|Ero|w;%VkhL~>zUd&p6`9^(Z~LaHj`qHu zMQ-V7B3sj`bzCM}E?2y1vuWZdtcF6XP^UoxMij|yzQj4pkGG<}6p<@MY7oEt>OU9G z+j^vCRn}DI4sDWuS(VR~UA16!9Q{*Vv`kb@omsr@&GNU%qnsL*3?st#c(}cwx08+b zTlZDiR%@kn7wfscHF1x}-FAf^(6Y1XNR;Y{755@2Y6Yy0Cac_9P)=Y)l6{j*9syUY~rVbo>@qjooEX?HC+m zPm0U-A>i|frpu4@`E%X>Wjte_BYltHvzu!%;_T5;2e;rmO|XeW(@J~3`IhGMby`=9 ziS0?`%2Llomkl6@xBLZ3fe?vuVM!G)$s`Y9%zBfDtjBN!E+kBhk1SR&VKp-H7F)JnPPtJTft=!tM>*Cd6PPv zzpB)&%~=1!(SYE9b@GtGWc$K5t7U({yjVcg zy+QG+bjE9Y(~kqdTV`dThe(4~fR(qzVK|YBKWVlUAAAMn=sI{qwEMfb`v4KOBiJ0 zR(8?Mr;+xH(;JNR9WNUb<<;^SLAZRsC->Rm`XJkNNy?l@!hLPFq;`&i4o$RcT==kZ z-RJe#5A&wJAK$Z792Hu+2xg?59Nyo>d>9>{%ypMGT1)l#5i6&G{V$oG$Ezp%cCs9O z{m7#a#*gfwSH7-}oz1P=Eh?o1sE6vje}_i>mK~B*%5S~1O*pGO|`QvY5All zvU18Yg19EHB_6{rt);f?MqS#2!@A0wp((t&rRY8uM)M4 z3I>FH!q0iopcq0YOMKWxY39BIs$14JQ8iIj^vVaHuNJ1{Gm{t*=_L~7rm14mHLQ!P zbn@5o^-vWT%`)}gY|ZQ63Gwauf0F1gTX)fkW0zW3!`O9(V0EoC zSp^0q*;4CsHVEwgeQ(-+ zEBvpYOdPE%2Zj<>CJ{v-HuE&?PhAGBouMdE`GfTamQ%V>GpWGCe%XV*$1_ zH^M;XMDga$f8ln%n}xoN%V3Id%+h|Xuzr^C@bfGZj7BV`5Q~PfIY7UV8>*<>UWGLk z`@nErg<-XMlwX9&a-0%LeUoO9cSIvVIs%LSyQgRCMBSevw?5Cl|490X{}+kIY5d0T zT4e={hf%J}S{#zeCzA0e7&qpa2HQ60e`LB6(D?=LDaFp&QdKDug!uwg9H3mK)G`o^ z&mLVS^nUerVuMXGC&E7{?NV37<`gksD;(wfsx1$zqC{BJH}NE*jN2~a%iaGd8$6aa z#Hlg%zKV^~8zl1`cT@M=Pb8yl-P^57(;jTz^mI;opcy=l>@ZcL_dDL`0@tD^8Tdtz z-+kdEk_onLKNDlc?7C+m3yo_vi z6g9cn=iZRWhPL5X%v#K-k^MTr(&#+{Ipcf~IYMJOHk3=&s%IS_AF=av$N&;!BN}&0 z00Ax)F9dIR1g3Mlg_KF3Ok_Ln*V;KmDAF)`MN)-^r9-6luoNvzkFhu{eOn!q)QZ;# z6u&*W$c~D&w!IHANdzsisFbJ|X-rL9tNV1c|1Hv$N@fZ*N=(RQi{`!^sonrw0XsMh z@Vd{26`=twLDR+R5!Z!t)_)7hIvtucm1!V5(m*Y?yJ;vpWw`Et9yfhwG~kA1M#Z_{ zZi1|+Jkz4uEmDb-t^^x~65@esLPWIFmu~2|Z0uv)l9je*#T;Cr+8q0*It}4NOuCe= z-n{RGz)x}1^$jlfUw;rXUZe>St1X}LqtGRY@S(7#^>t>EiFK?%CmB%&c2MZIzf12b zMFl!#4`144X<|uc+~Gk1AN3_ui=3ClX5kORkT2+zhSWFHU`MKUH#c z@RdK^x<>EiTJf@lO)QFq@nnx$)1VZ@)aHw4&B#!`T2aDvc`x379dp>P0MLRHVK>UT z=oPUWQXt{>B9fP@o9S~&-04cfyftxGA*B|D*#-RZYp>St&RovFj^HikfL%a}u`@YP zewA^wmm)aW2%x^6;?BOzKupV`Po~-sitSl;;iS9-?2_TX%8LjREpwdPVf+x6Mq=Xi zy~|hhg9Y3gPQ*0~ZGD6J!znC&h+fD-5e6n{*=>Ay#(d| z!1ma_VXtlGdV;?t2Alp+;htU47fVmtQ-prfYN5 zv98r}wvbNY+OJfkRyYU$pauC<88WV{#yDa0sZAr{3m0mU+K^>hSiHkQwwx*PjCGI; zqsnb8_b8~i4kbY*Os9_Wy6U^mNS;cOQrR~EgxNXFIUA zGLj#cziYFb0p|rEW zm4|r1DZ99D2Msbl1DLSQn;znXTVz5;w;gkMN|i9eF)k#+F7$~aq2N2qA71qGl(3+$ z`f$r0uO~S6C1@Yjz+Dplb%IT4eF%qkP~lf!-oA35--*~(=)I1D_Wdj*aUwDX;=p_Bdc6NB5t@D^s%HCGDw@b90D8ElE)S&5H;g-omL&=cwOta2w{RgL5 zno9Gs)N~TPzXz$Q1lQH!=BcP3fvGmSwMWu#A)#Rg;mPSLD05Iqs+8cE@C2@=%suY} zvRW+DxctJScJUs~m@X*bod7)lCUV)(f&TUC7bjTo?)m2IreuIW1^+Yx|2s5zpN=r{ z>DLpyRv2SJ5ez1^6bbV1Ju)ZPS(!0LrrraamDvC$1BH1?Fb3FH=>`(J90=$~fY+p~ zT&$Cfy}~tM33MV=X(B04d?|^w2Pagh%Bk$sl1OlG(#TCvUN6TrB+H?iIvp397TDru$5o6#A~mXOrJ0kLo5LQE0o6&?$6RQbghS= zI|rlU3wtX}=uy_Xq=b3p0q<)t>aKx_3%w}I<_65Q>sP;{UW5j(y$ie)E+c2)Nad9iIoi)?H&^vU?tFuqojbNX)!F!8ea307%#Wc0YW@={4 zvRIFu;D&anLa9Da`s7ie2$0{uaXZgGwiM#5LMFqY;`@qZj7Es}bD{$02gp~Saw&Fw z>WravUY7DhF10JQ!^ZfO!abTzwFwoqtFM85ZqDUi3=Iw%y=7VRWQqZEI$$h{>-dzl<@UTGg*5lN+rp#10y8= zh$sK+I-7fzGp4?Nla^>Hzih0i&R$_v1H~?Tcj+_`<)z0leE%`$j~0eTp17rynjcH? zEAo1?#8XOmN(xtVWS8F&A>KcuwkdjRec<)eh-XS)R)!zz$6B6vute>ekRag%D~pJw z62wrKI213h+61dykdfBJS?Y7gFSjs&YkhgHT9IOt6NfkI`w-NhT}2bw z725xko4g<((%P$~D7&CJ>c#NSgvyo=Ejy&XSJceoK5(`Dh=8$pex%sh$bXCO|Mnt& zGgI%?Ij_@|K)K$UoANw~>UTW^Z>zE%it8$zs^~TsjcP37g;1+IoFmai-j)SHSkK*F z4C^5;Z~4+doZNkGs8DHL6oOw1R4|TnQF_%h8dPY#B@-YMztnQY*K#8n6c}6(hXCCf zfGkbgDhWxlc z44@C-?mZO^Wk;A{%-eq@Q!}jgLz5!?YdoX*U^LpK{{elH3A$Rv0o+H?7j$c_2)_pX zp^9*~=R$Y8%!&d#t7#QY-n-7L_t);y7KlaaqOEE~{f-cQjJyv~hb9qSj@iRS@`Ecs zCGZ0Km~#P8WOQuRP5d{UkYO2g8ajt++FxWyCem0rIl2Yc8n&$eRtt--q zmz(^#Fx1qiNQd=&RiB$m0@5~wywif^cwK#Xrlg=1f;H&+86HZPS+ z^2${RcbgtHG(HE{4>QauK1ggx8C|$g{BcTz5~_$__NKkiUnk@ia(&tA+vrt?h^Rp( zhc$gD=kFMIa6!bGv0~(R&r%np{xHMw2v2o|5ydvn^Lze`J>Ch@CiQwM5^os?uWhU8 zZ>bb=;)&4~zqIt~iPDf3EzpB7fc^J~f(lC+yCCdyZyuq7&#Afr?D07wCftJeyf2(L zJv>pm*Tgn$F0$;n1yL`1`3=zip&G;(m-35@{4jZ2c|(LxDb~4SfI9)DawLPXeGZ)O z*Kq3(x#WNgi$U#&Bk>ks@%+#|G))pm?lX8SbpJ{gHC*6lqqL#p=kQ%a2|n}% zTMB-S(me&20SQAD8XTcG=|$TL4C`;P%dcMiTJlOHot!M^vloCnDwN=;sN_`ZzhKJ> z{5-kL!I`mUvU9l43fGn;P zy4kzUPs2AS6TiDb9|Zo6;Ew7jfDd>N+!j$adVl0hn%cJ*F{wjH>b&GQ5lk?-`#%=r zr6Y_ETbj*PaZ_a%+#en|700{|kT4W33N~rkY>E-8#V|qokBh;j;e}YrP1jaX z<18Lrd@NzOq6EhhSyiu%vZJk!5!6W-nt1qp3f=8O@ME zHi?-Ku;`?>1pw^?M?RN?<{;K>1A9Syn&!Aicv{F#0_gU2U!Je4ELgT$Y;8EQ1y9J* zWm_+Ho*LDfTWzo()`SaqojQ}X!T6Y*Wd(d7abLa|E2Oo4J#5V7Y$|k^Qh9}%Ez=Dr z!x#Cwo!b9H9G04_Oc!DWJ>lY_5^Z}^L3}8_TViCpr-e@zXS$Ib%q#HAZ1Hs&j`)Ue z9s1IbP$$^N!w0BN0#dYnb!+plypAXM)!UObliOwK;IWKPO)U0|PgN5C3Z%MAR!s1rJQ#F5a8 z_u#~Zt?fk0@#uMxBZ?ax`6n+!srH8N4)VAectyHz@z7h-`ULCf-I6rCJSTrZdQgc} z1lBZoew}y(ujBLM z-5NfTMxTP-X%f6kVTv8u8SJAudh>@@LEu~}%e6(MC2UxlF)tf2eJ4KHz&15uItzvM z2KisCEX`>XYH`l1Gu2hq9{ zka!<+MD4EUfnB?ND|V(hg#Fh1e*{X|#B1VqmE~q}QVc0;m|&Z+0>UWvKP{a5f5ie1cQ?tYYnfKXk;=_4k>i#~#U^OLIP=3g-lEY3UA4ZN`H!-x(i zc6+94@0R27(lbg>y)QK=KyAGWr>LvOfBqCG^TZh$7Ufl>m5*xhpmiLahO1^fQ%j|S z2AKxMn6rmJAX^~HtE%vBuhy({Eqge_jdQw|*x#xMj=?dUknD#~|B) zhH*G=w=oLK68WGj_|n@PimszgF@EtAg%Prth(O2k5Hk&}(v{ZS)~Q3$oYgL2`CqOY z0O8%=({w#HaxKKAWe;bgMn0H6RJVqrFm6t|0~Blz^DgVj!e`Yx2qE>j=gNb5K2Xg3 zXa}O+yzKu^%i8xE$t1%eGjBk06URv0|TF{2jr5pSv?uow2+;#x(@Me%2?F3f6(%9IY5b&=_7GluIl!Ok^paflzafef;t%j$GdmMDc+ zokE{=8tJQYhX#K~rS@YMQp4c#K2t-VPA+fhYi+`!0)CA%#(q3X+qp~jYP;~O_eq_l zo5vHAJ!Xxu7ppT~K|xTfRG%;$p+=GOJ+`P6Jpm5Y^L;6n)$f5`-N=F8_Z1zSp2vg$ z6N`WmmvYWCiV zAtghT#A*GW2vJ7%$y>j|aAi)CL{P@mNt(Q3Cm%S>wK;hnzjv-vd8CKz=6~Yj9TF~K zQ-Ns06+6PqOf$zjC3lK}DYGK#-C9&D((*H9s|^-`_TK+MeW`_ojLlDvPfc0X^^Qfl zCIlnJ&cSSGY&tcSA4Yy3iH70#HQwXi&mCJ1OhRJdyF&B*K3)e-+ zdY(_Zs^=)?#fuabrp;$&&vD<@289_cnJZ7=xJ92(nmF2K=1}T295D0DK+jAw!%Tj zEDnW?C#-ejd3MQ~^l-+17>)n>kQf$bz%B1rn{o6Bi#0`} z3Ef!m7ppq`SecTxfy2@otLE7--hqvo3@2*pv#dib`SEG-PB~;jmfZeq8hP!`;Tf?6 zW9Rnn`HWRMkE67rB0Ihds-jFjWLmV0hCIRQduK``5HsAAh7vb7PT_<-{A$+Y?Q@ z!DD;c-o0&{)W`Lbs|*qv{oi%JWey%wob<%=g(QK)tx)QD5Q}!TsqYB?=6skdVm5yF zhv!x2Ty8jFREOv5ZF}|EoR8(Zf4tC>o&*-wLB%#q)5UlXURR*SiO5W8n6|qzoTaS2 z=Ag)byb57mX^P{4?6MVX*Wx|;P;|==TUO6WJU7==5WeTpz*~~8&b`vbASMe{@ovp_ z{lklG@4(nVSCix_+AG*oF~?9*zVRlH?|#UNqnAX&oc@F;#>7l9rNUNssM#7aJTQQx*~SSOWy>5m>qI+@k6`3z2 z?YB`>%y56k22LZIK7W9N4_Uc???E7+PlpTvLX3$wK_&@)8L1LudT1_@I<|`dPLCrl z;?z$=T&`V2Gyd57_o&Gz|CaBzA(3}`xTiE?K{DJaKJP<9j+p+WMDjsK zHj5Qi_EVGhSLo-EQ=h?UNgk~KWMt#ZKr|*PylFgLTghTy1w&IkcMZEn^uxS3GgZ^3dJwWjuO|kSeiMDeh|oHQd%-TNKc^25UnBC=s#mcV$_lsnM1Gj6aNj%^` zbOWic2XCD}ez}`18M9tPJ6EG(+}|_e%Mou=%*&yPbBz1U+ng8-I&}|Q8mt2xa$vqL zq$Z;W=v{pT(pt~@5%oC+df3|K6$12gi~l_ntx%(|Yuz+NAuYatAa66G!z=yEl;i+9 zG={}=GqpdG08Ak8v2UQ)F{;fk>h2ID>0w6x;86Y7A5F&JzJg!alZQJlN$(Y-HX6&) zirb*;BpB7bXh9Q{;EFU+E3KbtA`IeH4sbzTj>|w71OTQ^sU|^eBc-9x$Md%d?l^QE zJQvh)?rO)1SuvX|zN6h=kX9VQzmBglg^y@lA4muh)-Z3)PA$Jb z{M+GPubjmCz6Ypx&8lGiWu%h1615UD5z@~&1L$uFK%8XqAkZ&%RDkjl1B(<`DPnC( zKw`@!?0*Z)XXy#m11L15YFGg|rORN0PP`wwWFlC3U{Sq8d!*|ph+yJ3LqhRbP!knb z3`wrs0sc@aS=ZdmBsi~SYQ)qXtd*gi*{qQb#CXv2R?3zn5+uD+sB1X2JCB$l!lyqD$#a%<7%20WSKjfh4*H`!6DKZ z_-82ljbV?%)+Ko;(JNATWUv@U0XM1y++*4%q(LrIIwy<+v5;gS20FJwcnZtQdD?%t zun&hi=$k)4!>`E6JBRah@6}d1KIZ)z_QLH)Vjv;RJe|jcFX(T4q$95awV?rRx6gpj z3|yHtouyQ$^74PRmaARWB_DPCHRzG+Y!%iYJP!SSF)ctJgx=j4P52lb!A(zhU6-)0 ztzLTPgLH62x#eeh<{}W-BrEaJPWt$q*&+wb9!bLd7qrV# z)XXt$ft6M(L%)-CZV(-hJ^~s?eq7+-^IguLg~){m4#ljiJaht$A zf5_oa$v(;1`jK7luup3*L|@jq=C)f*j{|79LH5j9ejDzw7aXTb}3aAqPTw(oX z#P?46LoNONlSCaV1wK$}8`aC-hW9DAlmpk6~U_KT|4qln@dK}jRtvH}$HLf9cS z#G%~_0D|cx0dx@O)JNLRjCA9?XjzGzt^@Xxt{wXFZsN%U`)bsOar={f?m$)Nr3Yci zlK(ve6UGjk@i+7jfU-!#qxWa}raYFIv9F@KJLJ-dMY7#7I8$wR2MI$-1}j)NcbP1h z-i)oB_-;)mtG3TojVfB@&~n2y9&v$xTgWRn*2!23>9TSYx;nk^sqPwivl9$vGnUfA z_(gCb`YJwWLnT*)4yqCf_+jH6xsb_DI1)fPUKfLso=6tHyj;k73HVx2;`0f{83zM; z@rAq=hF0VGcW6?t#IGy|pU;~P>EN>?f+#TZA!zuF_Y$iLFUR<0 zV?wVhS-X2+o_9?nVYDg`j$0Rwt#V=Qz~H<8CCT=k`j3+lxZt4&MrXrSi=!cSm8L5k zA8c{IcOfZ`j+`uCPII~k__!U5KCU1ax-jc5P&T#Qp#Ce`V4|as6pF@frI+qymrCr` z?|iCd57tr2QZX!WI77Zu6$Lordl?&~0{<0-5|fY~vm-Hg=2tD4P>~iZb$WnuNjp7C z5nGU#)dPd6fL^L7^FgA>^LCXBxa7!1>!zyr`U6f6DTxIB?-{Yy%CqMly*1EtQLQF} z*zXn5I3ZpUPjOTNKD)Av;fHX500mGR>Z!!-BMd{Dk6L@h9_{$N<&?+y16R9yLV^-n z*9`i)Jy4ZBHf&lORS2E(V4&%8QDQ&~;AJrKsSAh0O1sn}d!5+z&0CQ+jU0orSYiea zh;_Ug3sH-Z2jEz&z+(-OfDrF|y8*FL4KEc)?RL~h9F0&WI7~CFyOAOpwWmf;G>YhC zRd0Hp8eftNL1k0V3Etp*fbV*BkkKqgg8d-b6&c zP0jeCI|WEM)cU-EDGDmSH>)AeoGhZd(SZK6iBwluQACwhL?0@65Xc`@qukV%a&~Iq zi`nVbOx@@nqhhnaMF_u0J!EN|8}-(b4Ux5MV*xw+&uZv3*QKG*pKkvrIzR`ey^8_$ zm6H_!&_)O)l{h!<&r^@Cd*l&gC3A2lSjYg1Z!yEQ&<2>%U2J z0rn-1($;2XKd(6yxc~FEE`fu7;M#(L?708qWXNXMc$0FUfk5Bl^h@C~1*MW2?z&(1 z(*mOSQAfAV^q-pkGoO&MGir3x6P03q_O8dc zyU(`=sTd#s;EzI25!-{}Y{``d78ijPgKzM8pLWD2dyh{18w=j4OR+ma5$bxehco0h zlGs!xsAM?UKD%+re6g1P@XInDr|6KO0Q&8?*b|sk5D=v2$!B)NivAr=SCkH z`At2_7iMg_n<d zIKr+mR2X-+WwYkl1l#UY34jf!Wf_7M&{YQuisp)WhpcXA7cIvT$9nGK?DeX&xtN%^ zdeS4UQQ#YP1p6?Ed%KAEl4K^SFbGrV8ylu@rEFO7?Om>r{+MASt$*jS*Dqu)g*;o# z{q)%7544c*-0ZlekTet&e?B)p*k-hePSkEZ|EUIwOi_uHu)NT0Xu277U5@C_TYEwb zERf8AHLlsy z+|;*KVV@Nr6}zmPdNiaGiX_xA+HJU++pZC*L6mKzmotTwWD=IeNp(efXmR%>U{qLM zS_8Sn>c&ss@_yqeh=hUn3MMBDM}z*Iy5`|yAocN;g1zP><-bD%5UqK(wRZ1V@7U#4 z4>=NMDw)qbeShYPry0#A;hTU~>{w^C`ZuTeM-tF>;bRcJB+Xa9UyEBW4{MkJJ`kZV zST|Q7#_2|jgP9(jsbk^l6a$db+ifEIMJl1iu|Eq`xP6FhI;sYG7AK4F#lwg6{S;Ff z7H3CT_fZ&|`SnB!^GlNhBCN5uHE426fDWt}z#e?BljQAx{W`B{yYJqGVtD^le|`F< zqVM3~>;t2h!R+?$n~Dt&^tq=;Sp4qXFM?tw8nSlp$c?HOz~*gwj2WgD;}`jaO_b1S zW$0y}XiiA*;4HZkl2?8MuH8R83w2ZP>6nK=fOEEfrD8hi{*0UFc@Nxb8y4<= z=ZdI+-s|?awaxSN$O`ZlEV>ToP|c?k49MizDgP>ijjFTHqko5@nN?a%$2E51)6k)! zPicR~^3G~>2T=CwJ(M{>4q8}kn>(IKI!d;h7Y+{#svAeUZ|otb1#?=h(4Rvpuk*5{ zlbT{EMR%hhCn2oP_b|o8kXK5{+NSqYExF-*qmO63g3m`OS>x~RQhPj)MC)#mL*_tz z1YOo?A*X)wT9?FYy+DPh(B>Mt3?b`hzfB;T%2)-T97<;5N*aPj=4avr=|m6TnI4~G zNBeokL6gi-B#{70?-;};>39UKDU~0&Jj3THOe{7+L**gkaDx)u#k_3Pg+cyqbvYYs zAuyOVd2EZ2fQ&LN%6B3UZzzH8Mtmi{d%Os1k}x{cAiCs>c$&1`2NVlY@)`@4T=w%V ztNjQR;)N@G!i3F5+mKN@Z=uT(jal=zNl#aP)0n=SA6TD{9o9W2zJ6YY{P+?Vn0mXT zEmyd?z((=s>`x-k?Jb6%%vzPOg3lpIU_nSa5Sc3}>x&(CG&a$iQrjv(WKQCc%Z3Ec zNTNCx4eTLJyPJG}!hxrsv2~dW!lg=#u6A(<4$|c`LKDvG0|N4;8SgVOYb-Gfkh?Gc zq@@UW+#o`syiNKHh+`3KUfc9ZPiSQw!y6vt0B&ft3n6_rEUtclkdfZL@wUy#H9lrP zYf>MlMvtFYX;=AI<1%(%aH8hBFVHk$$}K$@299QGX%t?b}0L-mu?B>0O~OCPnXdi)-s+wpu@JaB|1?czwbyJQnL6 zGJq-YF@k2cL-`_R0Vi2sBk?feL#Hj!%5A` zKH=UgL5)S;9w>I|+(Sd_>KJG8TwTT&+?Ytl0Dd5a&oPlX|F$7%$Ru=8hmdDGhL~|< zTP4yCTE`eizPhtR?%T6mhcrD`;<11mxEpmbdFmVO-0_4Wdt-5TVAwI7bK{_5pw)Y> z2edHCAD|A7+d{sm?wKt_YxX7n_Sbx0)27s(mK>`O|^Y z(*PjvEODg2v*KwBZ`FRxISM2meQM83^>&xDEG$z84xk_hgcqf#?xF@3WdrTqYjS@P zyRw(R4stwq+EX*xbf|e+eO={psPN|Nio}PaHI*oMtD+2Ak^0oPqOanF_&z5po=PoD z%eGuaV;B{K{Mz2SC&oU-^%2bAf~^a+=|T}lc54~x`lCO}42Xt@rAN5F9*Y@$eLeym zoHYml=R5EIILr~{fVDy6O0xW z`F%8hBFos!IHotrlh#48@@y3WnuNXSV3_IQi9iQCdQ^R71Po(n;Gz>KL;T5p`#EN$ z_+MeswY$aubtr;GF!7R0W)jRgVC-o|(erjVMelY*lRgUX3tO`$QQ-BVoF634+y4pA zpl@@#2JpO-RfE{uL`ObGu?XhQ`>W$N0VZ2dz$ z%y;XQ1s%^@o?7y9!;=^F-BL8-DWN_H$`DB#4YJYddrQ#4z>6ZiWYx7cDdW;_n-WjP zR&Jq17!I87zSt320u2G^@KNnf$u1OAegp4J?W{w+h3>+D_j5!?9!8{tN28n`BAx&6 zH!|=-XT^V<2$=61yvgB8$m7x=`_19w7a`|nq)M)UWPB99y4=KiZ-c+r@*!X`n6)^* z6N+12K@lJx5AQk4Zg|nJW9} zqU-sMxb8i2NgaLB5@ykA%IDDvLk10j;oNWG|=8bAuuvk_6#uYnA!R1`N_uuo17WUY@XrR;r5x@DDTGt}X8`C3gNQJI!2 zJlLQq$LDMnMxa9ns80l~Uh$oY(aHjx5iOF^9?A#4@w|35{A0%XTwio5V<3i%l7wh^ zNqC?;eE$H$OF~|*p%VX7q%BEU#_i8$1B>+?>YL{W*$0*0SZZeM*1A=|(do*c})y_*7J$O{hw~ z`eyt64U#{68@zGgba_ISG~|nP%HI51NA%zX?myev06$Ac0?RpFO*iR5>$asFXQo(LKPtZly z1o>Lyzs}gy$t+{_Ad{9fMyJ)t7aDiXdw)R~%t~^s%?P>@oh?Z8csSRWaR!<#MC$+> ziY46_W#GNMMlF>e<%CXMF8K2}^m}C*0Y@G3%$8JdVC> zQj2Q;;-_Ljl*4scQle(V6;=>T;NzK^l^7i-xENA1GN`qmI=t6JrF3&{Q&)eYTIgDu zUhtxzC>Ed9Tl1~`z_Ik`XCuD0haR#+-Pq+6if@JTvsry#l_wP#i4!kYB@9O`MeVH8 z2HneR9ww;!qtmx0OEf*tKdxmuRQd;EXfh-;UG}~y_rK)>h7(LiKQSJD?_fh16X;*b zgkZgL*PU>TE1`)x`)x)0im9vb#xBD6?&QPV(@2Ye*Yn%{HG%$;=ervMkPy)+KFzeJ zRd17_KhW9}CGp-QiL$w#Hb-qJ`1x=~mPHOZD3guQ=Uc6Bfh65L&ay9M{)?(PACy9IZ*!QFxl?lQQ$26s69 z)TvY7d-@jzjJ52&_O;gCvuQs4TF5aha8s~*2ZVhih7H!j6MCVdNGs?6!q(b<^xg4| z(&g`c8grs}u>Se@hP>B`aTAT@_2eLdUoLB1%f#F0Y=9|cuIF?B-+UvU45I+-Q(ok!$NilHG||5XQbbH^ z*2PcTexSx82)Dh}i1zjHJ>8FjvCmF6Jh|{yTilSbabxcHBR! z$b8-c#$7(Fu0;Xt3;zA5_iHGi8SjQ5#Us{)tBQ&W73zb2=v2l17Y2OA@z}fY0TR|- z-`kj)h3Vb*ub+KhFV@W;dbtNTxCa6HLh^$!^Kn}c(CLwR&c;5^#BY=nFUyfY#)!2$ zBtu?VUvsa*{~1Vu1EJ81>+K8Q6gmHFfEodLEF?>>S8O+(*LuhST6U7ys|x1onV3&Y zmQi3_|YI&5fV?1(1{j5fO2>xY8eyNoW+kv|kIVMY0c$II^EC&@KdYh`Gg zY#$h~J-$@|%=i70^eKe=eM6on^A!o8ENinZ_wKol;7j~Yf@T!;*BqhlwHFw zysPX!N=*5{6%F59QPBh;(mT&PmvVi{jr*q^)2_EZ)Yj_)CR|=2FrEJa17Lbnt!L}< zg{TS+;QPOy#TcJwjZ+DA^i{t>hzou&{^yZtfLEGOv+%e0-VeES7Wl_o-I}H|h)*8< zG}??GUp!xq1pZL(525UOZn+yAj2L(quzaiIUZ0Fli5Y}0YfrX^Jn1wEgjT=uez7T- zx37J4zd2?8D6(OGequJy{HvfklOkC$PnFG0n;-8JS_;kr859!CD8}{b^O44{twXvJ zhgo1v`&&Ie0P;{IBsVIq2qc&YO?PL|lVGYg?iXdLQ{T3sZf{E?7MJI~090mb@bB4q zAKW~zELVxvgF`|s^`-cQ+|2s`+EV-riqG^ob>f|m+G(OY#wFTsbvK?Ky+HfUL;Q=K zhl~<{WUtV#XYF9 z@}B%B1-hQN*HBy2%W9wg&c(`%{`Eu9FdK3o0Y!R}n2KscQDbM*9?8j*p!a>PFXUeT z0$%6@_|?Mtt@fY2;s@TXH(0p*_e*@?awGmoNjqmv`In+OFA~O8e zU;fbQVWr$j_;0XjX=(A7aE z)qg3mK5T0$ZJ?6*>0Bv9Pz5@%Xobe0_Qv(Tqg6YnZ93oRS#L*CQNt0bOHwQ_nZ^Cc zc<*$pilZWGEZ4mlI#0E2SKS6DW4(vTVIN_oLX{Dlj}iBM%XT7s_!u)MANnFGm_rYu z?2Nd!!52{eb<)?2v1c)yh}K)Z7>)9?Y?H@^e(c*2X*6Sb0}e`apW3KlLKR=(v};Q;2tP zY)={G9SqYTk4RVrsVUlno({D4m|J;ZRbHJ{jF%noCC5$E zj`76k=$BNnbjlHIszvG;=L-^K3ihutMTaNvqDT?I&PvC-AX?h+VFdEQHe9~-=ED4v z^4*=`fg4!Fhm054Cir2AM9ezGL*DqePa;t@y7FU$uehn?$SVwU*b;?ctp zX_LTI1PSJfclxYg;jf zP1V409m51iq1iS?iLnWprHg#uam`lQ^$y~rx-C3q7BwetXu|LgqL%~YL0VxzYW%A! zhD}AE+8LbnB`z!0Di@Quf6Kka^C4cVSc06(x9xliozlfG-|Mh0^k9~Zi!SeME#QKu zFg_cfX`)!(jX(Os#YQteldqv2NFI;M;&mlol*7=YtZnEzsj^W{ikjz){1Ww?+#{q8iqZB01acL7Mr_8i?0}x@rF&9T=FlJmX!L z3_3zQ@{ZMMs*-=Go_=sP^r|;%n%v*dDj_Jc=DmJZiOM1RYgGT!adAjO1)1MJobckL zAKhVXmshyVi_a#;yQx&)W5-W`hj42w#Si?CZmq#@^TW!yy^iBpfI*jcn$_xxmP7%l zN&$a9>vO~FOTd*q$B>u`pk_{VpB6ruwNra;#dZai6bCZgpV8_l*?GTwu#HX0wojtV z8Hv+T@=mDyq8^$&!)hH2ebfs3vyx${(@lLH9#U|#IvakH_>L`_=eJIg1CJgCqYvjtubq15`v0FJ-Z?8-%|1fgY z4f&IRHKdr2bkEu;kb(Hni(X=6hZkxlmKBbG5)kx~Iec@=gd-U5ewJ7DMh;E@Bk>34 zf)L#>!Lao;yE<3x`#L$&MCeI4heZ;NblT3#^D*_nL=d_nZZfGiWKG zm{aoJN(bvcKl6CGA_b)Mg#3d6aXW*!u}q`LD`}`Mo4+{p;2m(CEd6J?u*kFf!k^Bau5-MQJlXK(%#wWv-VneVDph z)Q@>tfDsGr%Y1xJ0bZ!V&wDoqE$wYUAvDYwRDSpg-y}+!l_dZ!)^<8{sL|&oukUl)n5cr7Bb04$SX`9p; zoLQMP9Aaa~r*G#WY3-bS6Oz13@3N8_yiX^*mzSRU5AScErJMc@`9H%7hSv6w@bW8O z#4<9!$PiC&X(95!g>Hz?PG_AyZ3>DI-fCv;W$1KGxUS%)B9-ZuLNMeEj24U|yfxsu*_kWB}b^$_JwG zohx&-0C&nYzt7p_eUrWpB5mVh=U7RpO$n5%244%Ix8e^K<9%AEU(T&ir}LO)cv0I} zBvTd5YT9ip7X)Rub?tRkICmAj z?I+c<%H5dBwaC->BY#jvzgSe_`-%9IzgMtmPHW^oU-MSkEiT5--d?-Lx-8~pM7Yc; z5J{e1PjELfmT!f8u8}O9>ofi#@X%com*^&znF;E;Q{NW^c>gn+F0c2xi^y_5*^fu~ zKenbL+e4$QBNJk1)-`z~5?oeEsoxl&LSk<7Qn(8aj4b&ZiTF9}C`O|%M3t4$gJ*Dp z9A7_gbbGP*xc02B8XEoI<|MkFDGfT|ZLNN=GN#qA5}Z7w6VRN2*10>)y`F$sJZ-|~ z4O_6a{Rzoa$gjUH3@Mt9cBN-8^T)Y9^2he~V?a?f^3QderZvZq$Q zhC4>JFEY{zTQ8YlbM;G=dZ&0Z6H*Vgy-jo_q)en1NTI-)%%_E;$iQl!tgVsiEZo%h znxrZ*-rd%!M44ex;Os*wHkpbr&jAUK}U>B0Yt&5UO~?&>jzw!aAYSb=qUqok z+5tRsS}Vnp$48E8qj-iEYoDQYz&eI#bYO@%d^{z1nQsRsh5gX(S1hMX`jYM&{`ss% z;J+e~=8l&7Mc9>)CTO{^mt?FsdtMqpv0jJ3cr(TucKLsawCN$!iT6b@B6seW=#_Z3 z!i4Yhze}}=n#bLF$@B{b2XK7Rbq-G+J{UHly9C~x~dgy z@vU04-N0<+wF;0c!`I|AW&DS{^=mu1Wryj3dU7l295TeXpPK!1OwE}xf z#*;6JwuMgYqj_oNY!7=HZw^8 zcRKn!P5X7n9tyVSVGYe6b{aZR>AQ3hP%y=P$Ru8Eb+AWGxtk~dZ4(QP|3%WMeI|Iw zp!;+N5~VvVG{@LYTXWCwkYCZh<{CpJJbZj@^wm|Hoam*b!K!%9r1Uy+`lXTSC)c7 z_|nB6;%e3$pxlgplc=Fh`oXswODZO0=N0pdlJX)vM@M9xV|tKLbzChseH78fpiy(p ziKw@OdfN!7gci;#TX1l9$uRxGvS+KAR0i+z5`p?{zXZ8sD!P6~{;W#^R{3X_f5_;D zptz4s%!;75P$PW$$cXZgNm@6j{KGK?C@%ESA@!VC|F7~^etF}^C2JUEhStz^o@<8- zfhehni}}0hM(DIh?xH>Sk9r6*%f4CUKT96Z&k*t_hOA*s$i5}HWFP*cm*EX<2S=_Q z^cyvQSyUHa+3~*QdWOiM0#EywOqRxyoLGidlr#fwwbHDw6SwIwOqA1R`q0Z(na!wb zSZ6e&V$%-A2NX#n@>7S>{e2MLl6$p($)A5h*C5s59&_^L&Hc#3Nyz?sQx0mY;mBe8GxW$nArD)_vQc@N`4RqZ>AZ zNZN5$x&{vB8bm<_LV`cZ?CAD;xSsq0k1p)`uig8>yxS`tm)EZ8|L;dmaZOgN`O=3u5wnaqH>Yk(aEPxYnY39wk zOb{gC9iLsoxM^Lvdp9ZYyZT#=k+8b7Y3tLg^9{diwk>Ky{d-ERk@GMnDm^&6FXNwn++_r$+ieXBbT$A20Z zTFApdYh1EOzf=*u5pqu}11bMtbA%QCt9Mdh=g-Cvdrmp0tg-)BZ)lhMx(EkXNB|%g zEB`4UTt1#5VC-RWG>e;afd&rE8Zn>93H;sGH%A!*&&evkcWKUWFrQn^Ssn_=@1CB# z`i{ld5>xVT>*3Ve{h0WZpA)))=&#P4wxGW;Rv^C%6{}8Djw&k-9aRu5dL=hKL}f)+HI|-#IiWLr83+%&0NNddYsUX zT=BbE{c<+&C7dRkx!g5uTJJ_;7HJ*?lL31>V7+7#gE%&KA4yZsEfWf-+4oM^O>jnQ zKMCk2c`;7|cf-`qas~ti@2#UzSp+0JSdw(5Eft-rXXQn&moRgu_F&~L`ikxW&W(++ zY{hj2BQlwHMJ6_{{G5kH{uo3Y2I57@!9@5^Hb`V))^x|6Y%I3F$D@}7PsHgkr6&4E z)o!eO7ky)bU9+!vU4r>fJz8L3Q~9|96Gj41>ID*kE4ESre>!hzVCVC}9j%){7qP!H zB^~7O?{UL+*=0gzOu;^;3n8nsbdn2pr0zMhDg{>#*)*}C&MeB^S|mh z>VibgxUnU@lg4d!db)piq3-QX3zncRXk>XRWP)zH;%4WDd%6zKOTpN(;6|s%Y0orq zJhTf6b)^+Fbuk4u84utkwBh-P=#yzZd{2WA~Fv^V;L_8yzY8 z?e0H@u(_Z2G=TH@dQ3mdN&#ecjMB;bL(`vx!$3K4U ze*-h&_lO0M8W~erjzEg-vfHaJAEtK7R7QExfHH7?M2@}9k-2~k+s@NN}uU0^os>*y= zs6F>lyGPUBeWR-Go9P$S;z$0Vg$g=zad_kX<4`4$B6~FX1FFv1Zk!a7bg_up(f}#1 zX?1(?xMUqg8b{^e748hf0Mb0VTyI{}gbn~QlEH}!gKml0@@QSW17+Rb;blk#r*9AF zc=jt1_2oX-EubTSpk%&YRYY|xD3*4HguXp|I!58ZccyGpm{ig0xWbv7c@08RW!Kn# zad!vab5f)2Wl71h= zeM_LA1dkAsooT>?sj@k6}|yxv1ZcMhWV$ORDUBNFxEYvVr-PJnFk{m*D^oKSH!T6$v7xfa?c}Meaz7HAG=PT4H0>CD= z6fp=X3pyL8Me}cq=f}>63>b(!5}+LEZ*;(p!I^>Om|R4aHpEbU*j448_d6EB z17Fw|W|=nsHo?Ny56LxiE^R$cw>(Z)VEkkFa?@vW3w-Io|N9*QG@U|i&}|{7P1_qk zguNJp3wi@i|DaFddc4s>(~e6vZzFI+kWUKs>M>bc2l&IjEb7k4C&`L_*H!Z8;&M;@ zpUp-v!ixDsbP7om@r#;H`6pF)G<#+(t%$X67^NtiS8d8xwm1*lNnSybFE*=mZv5L%fQ(|1hFQH{@Tz^^O2+h%RB9U|LROj*vgKLlIYwsR2fP3M z^Y;vF%GrpuNFK>tt*>Q2c)#Red^vIau|*N{3&X$|4(Jv(?DD(>)I5aZ5G=&U%)C?( zCU&2fIoY=l#vmo84`kDMxKxwTKd*<7$|WUmoiCAbx*Y?r-(51te7?9x16L%T3yC1_ zWRZQA$)P4!sQ-@OvXIYDm* z^M(*9U-&u2A0p8CnIs>kmJkaj)1?4&@Ne6O+y)|UFG7W5~rF0 z+aFgl7{kDs65s)~@t$?H>`NBV zdMY%@U-YX8KFIJ60!`5Q_(GqI6%DMnLs?UW7}*EhZ#U)*=#4kqYAC+@`Y3P5dZr53 z1Dq+R*dh9DW6Az}k}e)7k!ukYI$?@p+_%9vQ&*mLKxT>?x`MB)i|yM&RoPoB4~uO} zbS~DF3Hcta*E!x~AmZ+EQ#0MJ$)IRE8eG;TTOZ)_01nTtn2=T1FF@d(I)2RnHL2H~ zTz0CmKWkaVCUa)89g5T;mhzAjx0+bx*(Yg?2jyCF)4P=)2jZ(wJA3M>&VNiJz@rq( zl883#u`54JOI@Y?{TURER4Nr1Hg2Y;8@Y~Dq*lClzI7%PaYN zAW6RW1>iBVa1A@|ZD3Gyi*014t=~|2~adH5|>a(%Hva z-^|BQU9O;w@|JrYN zbGY#L+7Mx9*zw6wDYPf z%pVpxirc^dq2j!I+eQzx|#)eNORZjM-|QEka<6W+-?c4oi8abWvM)t%nM%fWmTR#l%On-l|!mElla-8g&%8 z!yRPTwAM@*iF{ehf(s#({sQm-q`XXn8 zH@)h4rO8V}P?;v4OW(ndaXQR8Pmy*J4{N=XIu>zhQOw2xpQNW)kXhd+3#t6yYE7%E zE7A!TW1q_LEKVB5<@pA7tM=qw9k>j5PbATLRL=JACf5fRo|~@6fLnj0(aqkxJn-lii{vrR*Me}5#Ua@zTiaX{Y!DoYI9MAy+;)fpXSx=*Pp57D0?Q~C*sd$< zO#ivJH#S~^Gn+JJDBoIJ>#H{NNJ_Lht^kk7#jFN)pD1GBujcj9bp!stLlr?L`)pu$ zUSQ;cKV&Cf3#p%JWtAtq8YW1S@?t?vknh#sY8iG)JGTD+4-L`L5S#qu<^2%2gOTX0 zlRM9UYLCN(vlid5$mi~>b_GD?bw?}*Xq;>!TF*A;oHMS#sSEPCr$?x{j$h-3W)zdo z-8G!Yh|axIe?Ch(R1V^_17S`sgnhR?YIOymahV!THMG zpzvNYCBj@uoA|S2(`MCuA`10a->RHVkT!qg`oIN;n)z|>S2hi*Pfhbm?lqtEAgSG) zNSsH@92ox z*)lT^r@d@xLu_T|*`muD-Wk%{ab-TqJkJ4m0>1y*E5#q&jp5vx_mk+F;c*W5cZ{!* zrdc#JFdBxwxWAmkGziqjVgQtp@#WgFNoW=P{Qgp~m??f>9{_kHN8bCaivH);i8S_4ggWx(>d%ON; z1{sEVgRAc*SQ(lxaP_Sfe$mUH4v;F;?|0%K^$&rTf&h>QV7Hr&yLlWKF0vOt9hiX| zwiY5mj4IO@u$7D}c&{^GKyewisEv7+c%n@A@#*1-X{VRp=c^3~rRSeWB6(?9Qzil(V#+ zcCwHR*!ggut8#Ih@+iojPl2B)3o4xyrm=&UU!w^g$J=XpY%7WxWT4vx=cH>2LXh5_ z64r_JsCcqAXPPHiJq~t4x-HSLc zW;wXa&6ZtU93r!9>=)S$~%IDJ{#*GCt; zrOt+oX@ulVQ=yAif81Dcw{weiV%&-#B}L=Yu>hE)_)>QhqUAF z_8gh3vY0t@nIc|{fC|@_n>>zl2tDOe25nR1BkqITF#c~#lpm5vUO)si#@aU~8bg~g zM=?w|F=;UkSEV@}-rD9LJR>Ic$~L6+zMM=Kz#R$oW~JoE*&gcc#3IE86TNFSqs{%F z`>Ot%vnb5BkvkXVX9?xGUm7E?jb*4NABO#?CQ(%UThat_7Gt}ok$|fquZ_I_^?j23 zm%=@2o923nW@XK5k2)Dl{eSM&3H)|SSI&u9BK{e_52&aR)rNdc+fKtuR@7HDwU0JgqyjR_VV|MU+Thj^Q}o-BVLjf zPjqKlE6+*>%w}P-AVaFjSjTg^Y9;?%6yYzU=NSNl9CyFiteq4Jr`rXVU;Eq=f%P{O zY+SN;Rg-l2wSH8~BA#>o=)iz=c(7eutwSGhCX3J?BBiJOXid4N?E#NSf=DT&7#Kr? zi9NR#afFQ)Oo=4~I4HkGmO89zeR_L!oh$`|#nq&JmA_3Wwaw6&u$mO$cDM>!xj}NR z5%Vd?5H_pm?94Rfm1{Z(mOMhXQrdC(IK*D_sP24^nS1oqBF}bEc$VIeL;+WH>RlJL z`fY&CrnMbc7!&8opkRDw2mKg@-SM4RKxRDKOH3ISdd%&@q{%yB%qL;&R3^B~omFDP ztP&>mI41*jHe}^1o!X5HecjI+EiMoLc3M-b`vq24!{0|13HcG(2@`oZh;tX!Y-Bl= zN{70ZebU&SmG&H9LhD!oSoX?<-|}5N;^xC-WMRMZK|11-9XWDx>jcO;%B`0HkuJwo+4JtcW1_p_2N1OSlvMDJg-nx)oMt(rT~tQOy&?Es zyvY7D6rB7pI&n6KAO>7HUtrjevbHB}*OEUr?5g&Q2J0hjw06ijCpqGJ1t6exsHpeHGGZ;7=o4zM)A?^lgEhXaCJ+_Y&%@$krKsyg+`ys(*qX?$d+7}^6_hv<>fdhG7dNGxG7<* z#i7`>V5Z4_v{$2OBuA=pi&G`AVE2tq;k+3<`IK8n*W*a4r&xGH4;&0`~uBZWPI#<1uBY#>MXBFEtvLb* zG{;iAv8jAq5!IB-0K;HB`{SP!jW}47Sl_MK{#c7Ji!%uIPu2V1+@sR9EK(*f+9EC)Cy{BBc}UiU&JU6F zE_Pun&H&I+1Akq{@!c}kqgF=rO*rosT_Odz;8)&X^;WiqZC!%`K&dvdT`hm87ht0> z|6+=G_aT{2l>g~5b`#MH8*?g}{nQU0dr2t^f(TLZZd35XS(nFd$AXPBv7G1BPFuL0 zo8k0YkDf5#)xdRCdek=K1UUele+B-%g~gTh5oU5;AXD6vv=6)V+ee zD0>m_uF|?LpL$l04qJPZjg75(1A2d3a0OsJE+2~+X98I3hzg4{bJf=FKX&KjgQl1j z3-G)@cORbY6J_Jh}525txC&f7!%viS*(?n5G~3>Od3g~PgJJaSXeySmi{`^ z1=5y}$%mw6WEPb(4t@3^!jTr+8B_QTgws|z>`s$W>I&@{M^C^&VniRX2hVcN6bZ4$ zp`5}26psotm6957Q#bzAwnOI5etcY}s@LXphPX7@0&89%gcg2nTv1G+EuQ4krMu)V z>Z$dlPghD&g7Etq#FVw64X-9(zMt-;y{+At@D`Y5FMtAD9@IA#)~uexEkgX)1Py~POOGvUQ@SN zcY2OvOZReI7zbd(9>}y&vyy+|C&k9l@ar85Ph&Pk&V;-Z>x0GTNa%UOMkEnJx>>nk z6(n@bh-(d2AaumBA_=QT&&=hR*mP);8koNcy8Kz)umP(A2}7#_n=~X$ ze2rL)+>)1Hh-9QGg)`pbtLcR9DbFt;k&z&zHczBUqc5V}0er#B@UIgx)azbcVMRy> zU=VlTmX5J4Fcj%7By+?-3D2R44HY>Rk`Hsl>M#Xl`I$YN4V6Ue2~JNV0In@(tS9FOHh%ppwi=-^I)x|wb3uzWiy7D z)&`~ca+bTn*_F%j;#mnx4&zKIqf;0r3rC0l&o;agoafN!cZ&c8r$)!j$^1J8QCEn6 z*Xc_<&2${T{!eowCTfVCDjrROf|Vi@HjXjJ=rm*lPd*|lM7sLOe5Ke?ii{g zESR=?3`lNmF*kn~)cjJVw&j-VR|e#+#ZlnOGp2qjTO#aVIfN&{j|PnYTHZ?T7gp>H z@YT@okSle^Y-M9lAv`N2rKKN$pFHy4{CEx|mvtyh@i5FoQ_r&UUN6_?&MH1)UJX-} zrE#~F113h4z5mmw>CsX8gpI*h7b$u1sd<8d5-JwK&;%ASR%jg`ZaQ1KtNKhQ@s{LA zgQwL8OM>dS%$WaDp#rQZIi|td1i!{9H$j}(&49Eu^1)WDf(ht|FaE&cZRPkt0h{;I zmM?DLBEh6TJ9Ke{kPV^BiAh(H8mAJ5_b)(=bUo6euC!=2(%!SR+I9EL!WwzwoGX<% z;Ehyxw9Yam^Q+Y&d^_W?A5fvqCM*V!Vd~lM*(VI1#l_n8+&R}9Wqg%PP8JrRl#6pUYiJ^zp`rsJz+_^<$(`;u<=-czPJd=@mvO<*p=E38 zvF4E(nUuA8*7gLSjo164)Vp}TEf*JmzF$xwIQiB@p zmv_Yp&VMpXzA1|t@O)%=?f5%l-sVDJdc&1KNRW(D$%xNzVZR0A|N3xS&s0OdHp8-S z<*QlN+kV+;G3}t%{$Yr+9@A+FuDcrlvAc5Y{npd^cx1n>))~m-a`thKCEL_6RaN+~ z4p#U-vN67{Q0fZf03$6vAJMX~nrz(A6#wA+fi-d$yHY~V?VlYmH!Zyju-e3iV&Jmd zGkQ)g5HM3uJvJ0h{c!bWhpE{rbW?&mN~Tl`3~Ib>HFu4&)$P3vf+CCg@LF!pfbd{2 z02((DxLclr7%4Ku4kY;iHC`L&5KIt;9bW#2B-ZyWXzsL3ubr9hynE*J4p$rXZ_~jH z8zPseR`9*uGeSa4$wc^1sLqW$yt2D`=YplDu#e?_l`qIF z3(mz9^oBS0$WNkH=hK3{sc{sY&vO)=Hd9c(SXG;O=42=yNGV9tnBeSR0^Iz&#GMSi z!1W$yrf!4yq?pHT8P3C0wXcb2)1l@&LZc4;KRd_x`bvo8T;?dVr?uw};yE-Ia-$LS z);aS|$zU0urlf^N>Dam&E8;=7Q?^aN=7U{Z!KX+Y_UICDwD_N}7;qShWZ9ZQ``0(| zI%z4+@I!~BG9(qC=LXIjQsR%YUM(ZQFd^q+v42VYq$;k5&S}{>qz?f3AYFP%6J`-F z&gl9P&m9a1Ne#y@xK^BXm#+d1t)bG5Xc7q!m*TZfVntMG$WsvLX$Lt5VfNsWNRtSQSB z&h`Ih%8cq-7pJ7;KdhCrap6+&3yPNJd99HWu$8eptJD`_d@I+na)h)F$F-I5Z_p1E zDLT8f@t`j}teISs&_B20Dr4spP25hBMUWX&ho)WRFz`vJsj{Mr>H*^<6ws3+?5BGK zL^=QTY}Xh$uPhX8)^DQ;|9pnwOFK^gdARt2ka%4bh+@oYlzeiZBxwh3=*Ho3;)C!j zK^;If)2h+^sy@nCpd_QDemM%;QW6HAY(#2hXE=Hkx;jaTx(JJ9F!sX2Y&LXUwtQaU z^$-zm{wtJQ{yB@V5k&Z6SHOCV=!;E}UHs=cH0dKCzc|&pi zopme*vKU18pEj9cvEsne#9H=dBKpqDQ=mesS5&|)eaKqA4YdB(>DzfKa6rOQg!bEG`UxhMDsOV_o&s^|2sP9>-JyK?#Tc;TnD z#nQ+)5&#&hYzm=jN2DnDN)8p zqJ!Zjcphgpc&`2__v3S8>+$*ptY5FuM2P6=z{F7TDev1UgXHDpWPn8&f9{(TBF%Z; zxT;yajDBMncn~hpF>#Z0H7@FMcDU*TnVZ%wp1Ht?fjh8XJ1Ep7`Ja6m^V`%raLi{ghgjTXCW;WG#z_gLV+ZkD6OBG zf`QdD!5vm(^F!)Bw}R|yT54 z^WsMfHsBhp@jh$tEiE|Z#nPdz8Tt|*0619myiaWhL-KO#@|vgEtE9~=`?^1ysG~|I zBFBw%Ug!mKiZ7@Ifc>r=h6xo02%z}}{x&3oAYxbx{ux*V-Pbo$mw5*{jRemLpGWp) z|2q`gbQn|L1)mLq*4+fD;L}=CZ&R_+<;enF!-A`yzlH`7jJXUWu`z?6?z~Q;iy5ry zJU#l<<4iDWHI~s#!(x8Nn;-?)V%bZqud7jj$ui%bRd$7PsB5YMl_U`qqa*uG67r16 z`>`|YP+y2?(ZST5*<(T=B+u`DmgXvuugHvSHDJ$ioS+H^qHe{Y+M ziPg~#+Mpl>C@XRlLEY1mMr6XYncI8sPh{Tyd5M4TW}3dK(Q4}?Q`HQ}*Kqv(i$oU0 zgmTq6>5~Fp!7H`-H1*aG`V0vkr$k#krsU+8w3=|>%sI*GQQ7&6kr021U5Qf4ht_|- zCh9{gym$8@z}64eks;X=!REh-`0Tg0S-b$N8bk8p8d+|x84{2zV_jkE)U<2YD0V7A zE!n6uTdEHIB?e^Uj5y^<3x3`&<8V>^kKvq}YV(n^c$0CN{rJ4p__*ks-`!cxzkYik zN{`TwALMb z{q7WTBs)8%OGG`VKfE|By#Lgz>b{^fi>sYESicB&Du}y8KKrDJfB#nU45804NsL>Y z+2$a`Voi|G|8FGPpPGN+<^L|b;=n-Jm=C?3pxr!fD_j@8o9M|-*?sJ(omYcqiXj&H z>y(amBt_r(mRF~Yvn0u9f;OjGjHwiv@I+@7O{sRES&pTpl)r_)YR|TKmJk{~Y!o zjluQ_y=@gY!*HV=kT@gWnwSJ6mq<&SPc6UPIpeM>lz z8$EI-v+r%rbGvHIe^V=Iclc9j_f(cTjVPngP?CJ&Bkn-D_BHQb>STNPFurg@M3{QK zh@hlkGMG#j;z~tJCbennR}NJ*dk|YVF^;KnYlp82E>r>S`oT9q3~}x_D-~; zeJ=<*I1#&D;WYpc03`ZTJg-GN{8tA;p@%K;@1r9x206_IAoa;v-3#QSR`xe4p=@pH zgi3OR0dGUn9Nye2&T5BFr%Kcv*IWQNbEaS^X5nY(kSywd;x#GIlF+{>IhrWOIzS;j zp~fHodA;~=p}mGT(#_&X)2j>x4vN1~A^pN?drT-Z?-@QtdXgHQGX4zJu20$U8=dI5 ze&3}aOLFe}qdxRX#{-`43H_4SzR6}5E9(8ac%KJqr+YyM0(4k{#A^>;8?|v{^U>}j z%P}g%$Q3bi`x6lT2l8?a!H=3^0qGMYd>hS#20_-2F?0Lq7TiBzFk7BpD-O%!OVfeb zG`kmaD51S5mtVoFk^&wcV8vw8uN{b`GcmW!wl9kQ2`p%8;$I$`x|ig%i(Ie8F(}Ds z5a^A5a?xYk&sC!gCHb^3@innIifaHLve;v`+R|2>MvGDL(^%rWAuGS#Lnm!==OIJU$-kwo$FTaF?UglkALI4Sqjd1cW_5hFpo zcfan-F~X0=iZ8=nJJK-1U;Zt4JHTZD5iXNtG%+Z>*|ZMk@xySItFjj(o;40TtNZ!N zR^w~%p+&i!oY%4JWWfK7rQyST7{gRwc=1fm$LJILFfzT~Tv3EP20v%5N_u^4^~sMk zVeg3vVo*IVH_=aR4d&qj&gs;RMz1u^MS-S*ADr zG@m8YOV3Ls?nZ{}0HZit*NEX3g3mOsquQ6{1+%Dmvi_deSM$vjmaIn(7{cjMvtUuD3>jXJaB*7~AQgZw&*ShjMkS0` z0}_g2L1v$)r?r?4+|;871nrLt|NZw{1nm- z-}3Op!+WvlFG_tMS)FsBt$|wpBR8-9lWbM+Zd-v^+GN*%r7oA>>)tDeM)<=p=@;%z z(U~UJhdG44&LE#>`z{$Z+puMZ+r=!_;6NDtzt32TsgiO8MOHSu=N&TQFT$9RniL&Co3|h;(ud&Qm~+nFd#!ujEA~Ec zzJu#KZwGXPmojY)wid41h4Wf(26I`@?!PBNj6_1qMisi2gDO|6zr5v3l)mVfP0V*p z&K>igur~93F6lz|mM!xQ8@Wswg?%Vd>;RC&x!^eYUp5PTjs!$#xN3 zm_nGNB;{tbc%hS4_r27&G;o31zPMDX=<{>Tp^IUB(y(6+c}U?(G=dQGs~S9LBlKM* z=5_<2u7sZE!g)gOVTu@vYPOpZYw4@0v8(sNGYdKZLIYLS!19coMq2ZDOM7g+gN4qm zV^w9}Wx9^q=WY*Ua2LRZ-VfZ9WX|>pb#qM;3St$3uVqI)o5ULINa_ zP1u1EDESQ|)Q9$sY7j``MHmvz>n|9em;8g9u$FK(%iV1(hxdo0_(k`@*Yc-Z(weT9 zXICki+v%APmS(kmE*fG9Dq52emHX4nqfssKPWQ+0g^YVF`s&UC&L0zdPQyKhM}`?N zPlTQF3)JNWQicjQT+_} zqs|ofD|Wwrd4C_eX|gfA4~Ctt{0f2R>(lbqw#zGS`1D&dRv{2r?lf zblG3M z+VJ}k9^y9l&{@TNZ`2@jl{o+0mt!sS@%i2+T!>N7xOhq~=XiU?N^);W(mkFe#*44G zk{HKJOzI}uX#R(*ljJ0|{?>~f(!{9!V!;MRB&%?0gSGj?w&A@A>r6yS(iSykdu3V1 z+d{2fpR>u}+bfwvE^%JiQmM&XWsv$H8@>ZE!RNG`Gz!!?W>>c+ZSfA~eyLHS`Fm?N z{`#vH=jtD55v->t&V|GFM8qII+#tEXOssWI!T?G zJE5wxdML)8KA~8Pf`ge^v#v5_4VT8D=A0d0zBn(64YrTpfke4I2KyM-&61az#3p9a zN}v^DN-T=L%zFd)hkI!a+}y>AY%!EW`lsJ_&hR0J`aR{KxO|k94!Ws=tVNbU!RaH! z`ICeBoJ;b8G;8dVb$apJHs9`*eChankK;CvOsS3ox_EmZ1NXS4)`c6tg422%aegIk zedxSxHHL`$egkhh;zHW@){^>NR!Qv7KKm=7cue&?Q&Iwkgw_0q6HjHoeZu{ZX@!@) z{W$cTar0T5yGAl@9MT`2M;>0Y80nbb-}2OXt&f2AggZL%2ZjZ={n63RtzJS)F14h^@vh(E*uz`@T`1HIuzk7 z6Rm-!ZOxb|8%GL-Kz`gF`O zrl!HrVIU{zL033JqTEk%@IqTyOO0GJS3b#1WEj~|AwFy{kIA09&% zMw|V-$QPRW1DMUG7r*?=L*KFkpR#bS>~h-S<3)kal|a-Feq4iow;5%eC%3pg2B?H# zGtnC<;!W-Cqhf})83cKVNz7>Pr$qfYmdW?Vsh1DK-YiCjd6(}}{0nYK!6x;mWc;7h zC1@;9;EUd2Gt?^Fz-Cls58+b{R~cCGPtS~d6km;NY>1_9UN8D4ii)>jbyW&S2M@dt zGokK+;fU3PU5{tM6HWYzuQG2Of*QD|4vRVpZUpX#ndnuN zk7pk)$cWpV{k11ej&Jep#$RSetERjkx;0O9zn{?CL+nv;z1g0-xb|8tGuqfQGJKxs zxHYr*#@ZceoG(R~8`dqX4%~iDIW26NohrLoJeo_SGT=!jqQs0PJ#BMrQGY|_{veC% zrjw)4DQ=yaS^w(bQ>gs@KzVd|2=Ik>AO}qS4Rl1Wwl9>>*}E zi=s97w+i%BJ+?wdxx+{okF);xC3GR{07bm3=P;c?JPtFuA4;R) zG<`Wh5=goH!&DTZV2-Yy;XH!HeE{yuveQTvhHW+q&xn@3tL?jOkR}VqHccUs?{6sZ z;5cY%2lFzK2kN7;aHAul#EsDpjlSVx5C3nnQZ;8#EyV?1anGT*pCuE)so~)YIeo)>|5PT*h zA8HnJpc1zyx76h8(HCvDaKc$Rb5~g9HJF_s@+UVY34+Jc{V@!H zb->Gx*UiWq&oFYo5NQ8$TfyReXP|#|I;bz^9NII3Dt~8j^Y%tA4`NlKlWJgYXBrf^ z?Wr3{Pm6FbM-Vg_59M3Kt$(ZpJa^_AbzvwRFtwQ%C=rt1IprPkxdXauddTb@y17#K z>14XEul^+05fC2k^LxTKFdQ|w!5_83T5M@w>z5O|*Z;##$jI$dZ3KV`5Tuky2%n|CXToO1}Z zFxBS7;{E^(`AQv_h@C|(qcHYB$P z5{_c$F$(tdNlD342;OLy{Piy!)}h=hWym^ zTlHDGac>K2L3&jfvd_tQ4&C-#CONQB^6rqS<4v?67!+6w;{LwyhbcCXP6#c_>;Z*XPI*)-Z*v3T$iIFSeC?g^;!^7xuDDgbTq1=Rw3WJR-q(;Xf@2m zQ~UZdwCHoky{V|BI*|=!nDc?2D}Yar`)&m8(_}b51=QUyLjIiI9oSL5xW2!_NVszL zK-iP=Sf8S7yVAuvv|;>o`bm-VYCUuqr)Eg6iH<*C( z&FTBvreAYAlhlSzoxMY&xL$ulaXt3pCUXlLvNcs>R&wOqCH6k%K%wFkVg~##g|J1{ zWrAptxH|bug(qScP3(W@F#5y6o8HA_lH;}w z6stMk=ftD0En|?o)b{SrNKP#`t*1K4`F2iSl^=RYalrSF8kSjt@_%Am%3aW@etuSG z*D?@@H>}XB7l|`FL*Gvq0^aUtZGQJ1F<27rNP3y+~<2 zvccL=ONz=%PNE6_UVG0gR_d6_|xa-5thdDZ6ynez5%vy3xpE$?Xwe! zMZ`Q@S&h>vhq!KXZD1F2r9{0iVGAATIW&Zd8JV43BRSEg>?U?MJfpNqEPG#na{(Hs z9#YM+$-Z;QBB_sjpEUUP7zI7N>3i$A>Fs=xKCrAcG<;PX8u)g#R^JDf zYneSnkR>2_U`$q4raW$)UHAO@)4o~|owsysD3DT+XoS__eAv;=*EF7z9S7Kr7I)Pi$oizI7ZU9f=@k_e`6J-(YpSdB=w>4{_&$4*-^hZkmBabm;lh8#g$Eo~++_M)|ID zFl!|>0CuAFIJ&j}$T?u`trM=*28^xT!6dZ93@q}HB_0eE;`1nxhgeWV z`D{BBU^JzHrj&S3%S|1QCgxc(GgjesY)83%$3g^$`uWv$Avnf2ecbxK`3Z3h4x|7B6z7KZ z92!9zejA?!;sG>GBEG`+0j2n*ap~g2F2WK#0Kd3q(a7NOm9vbb2X?3w?fR-{ls;A} zQbj$Cgjj>5VlAaRatZj@fY}K}_R@ zetBb&gAd)>*VcQIV^HLL+_Y)UHlR%G=N13X%473s;HJ0aZk#BmXWqKj7;Lmf&P3Ws6Q*{groQo|1zGo7?qtz zz`&ac)**27xK3`79tne4J^KFk!x{!4^28O25pdbW$gFKB_WGURAJ5+Dj2WFnF~CJI z)CBGIX9(Z*Z@*Jy_S*|bwRJjZ72l-C%^}5dJNq6@qTA0yS))t%8v+c*}8jDUR%hX!^O9QqFI*=sTayQ>Fsg`ZDr~49rsz3xjxTfE7vc5 z_@B?G(ebD5iin$|6R@NkbSuxEiO)1$OzSmAoo8OHx9oWoX00yw)Jbb;k}cDAg1|`#;7WD8%l_#Q{|NK*2;P?7T0yMZ7AY zl_87-Dq+XyY>>QpVv8!awaOMh!X{&0 zF~||Ebe}q^wM>m5J?kC2J$pFfvYUT7?hY2Wo5oZ%lsi6#J`oQ#k9ZWb7;Adu!JgzN zFxqg8w*g~y*hsUSMhvi3z99uE1iFU2u7}yREXE@<_wHcNE(Q1OFN(k>>gcVeW{XS7 zYMW#M1lI1Q^MSzuet{G%J?{lMp6YY7VT*dUOD8KA+cfR-C&)yCR=d5_XiKJ`wD+F> znKZm@F8^L+HvWq_XYW?{?{=#{qwNm%I>iXr7W1O z2TQb8GQui0unLHge5`l1=WUoT#|A8{$tFXPYyttJD>dT1O*M{HN%eOaZwM)0l*ynI z`9Dz|JfxsP4$8-rR~|}9?Nw9HF6NO?Up*-V<5W~iA54qEi^%L>Jhwti4hn<-VW|8N z?Ac$dx3-Z0&+7w#ghODS!Cydtg<^kwrtOl@t#f7NlFe~hSYxj~5aKp{JjNK@ z=J9#lNSs(KwDJ1>9a;qVQ~c>-<7;3ZA7aG@5DMD-+RNi|I(t5zgv=jKma{TfI^EeS zJRD7U!E-iV-Ib0(S=)z%Ax2G@>sW1f6xXp7)VBzA#msc`4Th@auw-bb@-(5_8V4v) z(u{%iZ6^83bQ$IHo%nrB_+nf4o=nxWTpEM#_M@N%&HDLyO?U5WO2I#t;3p_g@GjE% zc1=9JQ+YPK!`3Sgp-zFQp#{8TySSdKoz>ELnL2Tzvc(UVMRN`**MGe2)8$3x@;JWj z1;Ri|9XGHOy0`B~Vz5el=;rD&Z*CfWh5e_l$gy?1`^}?Eq+REww?-r@p+-VK|3GaO z^+=_Ioxe6;@2~O4BIgMVh598N*9X6OVU{GuJxbL$^(S3}`uAxH+MMBpya$Iwd zCw13vkho#dYokhUSVeS~E5WKz0XcJ@33f})+03J??6NNQMSU6lq1oT29_|^I8Lejz zc%6!a&8|+_xGPY_zHTm7c%y=IL+Igx3{vKo*9|d-cdH-e;$Zt)A3Pk+f{bW%ktZ>y z^ZcmtRz@g#G8$a{obT>yP3Z$GC;}^v5St^oNo|DeF3~74q$_1OQ*pJ6p<8i>i&1em96Y#(G7kK)o1z$JbO7 zdL0V_4!hil#f#2~F$(859QpLZ$@IeYzCCGk-r5NH1~Tpsc*z;ghva)jQZGhc*Cw6Z z>4U?XUt3oY}@bZ7}-0#}$eke0**)vWZdL6d#Mzr3QUC~U_M4~7ILn|9= zuI7b?QDFaB&%9??(`kL=QH5L1_*4GvOGUph#fO_`d!={oU21iAnUQfl0{y1x?N|=v zCKZj(p7tg4e+-6HZu#Z-pu^f)c9*HZ^S;|?xFW5MhkXWF6!}~l7R$Hzvr{Ogu%TdQ zluXzGEJAfUrLVcqnZ1N}KXq^hc-qB|o;pubT2YgzzU`+NxC2?&*WEsQ_g~^qtyq45 zvw9^Tmo1x+(5u1OsNxaq4o_K3eaYs3jO(W6$69guxlvgF(drL;xslPVH8&FsVg0IU z5~MNP(N(*U#{zNzMfM}V^zDL)BX`)si4zNzr;>$vRYa(1=hL36?y>Oik)RlUo;tB+ zsr^38W5rSnc(B$}@QF^h&)U7;gmVJ_tp$KS^i#bx+F}q+@8&o>WZUeAR8HdN)ooqbf>Dh|jd%o@}$UoxW}H}_2U1p^$w`N-M(J8bF?<6U1dzlrPS;;ih_ zDZZ*g`PNaNY&V+Opgp;HtSsgIdJwD8>Ek>j#-TjG--=B*#$7pX}KK`zc=| zY0_(A=qmv+Vy;dsXO)Kyf;~hEC7pL%o|jqC9JlS3V9aLWq6d(_2-Z$1R?D(CCJB3Q zA2;+mXr&Z+dx36OeQYnUBm7~>I_kc}!P<0ux$&+X!JP}tF2^UxLO{=iA2rxIM$1b) zRIkk~UoO8rB9Nb|dyKE*lZfJ1t}-Pny~8E;1Cu4~6z$n>)$XjG95bs9ds9z2FHUf0 zz74tVSDAA7&+25isL}8z zO4=wnx?kOZ^tg}AL$hxFa8Y=Um{x(1dY|&F`Hgz~1rgIeld1O9y~yI8D+$q>d!FFQ zAcDl_#}HsoZ$4$TW67T9%U(hm_kno+fd16|gcy54>Go;qvL)i`%nyM-`&4tT4eYX6 zY!QL`CsoLbSWK=H!o14F+W@*q;tG`4bM6-=4IqIlsm zD%ET-x1Xm!z`9rX`0}gB&XU8Gb#SM7nw`M-{bg9!}c|r-n{|>UF`+D|Me$+a?#kjF6Y~I4fqiOX8F~ zD{iwMX_?@+3oCEO$5*bqy15W17 zj~5=M(|whJ(EF&!KDgu~O!podI2Rt=sa1if;bUN-HMjRioVsnUTSakjutN7~#l+>o zz7_WD_)vzy+D_WIVvD#!6WIbBWZc8rYe<#n!x5eExdxV2LfK`FE%dAU6?U&t778^5 zGg#?e5N_IbD;7L~ulx&1(BVoQa&x1KSw*M`)9+g0e(&i-UM_mqosB63;a6JOW6%s1(w>wWQo-_U9DVr80*M@t>3%*LMCG~~+%`d`r$WL>1PI70k{fZpN_`tz~ zXM5}`d?NA44Ex0+w&&DL<9>O~H+THDT9Y4uWXhE2!!UptC-*d>-dI3}%Wb$POi!S& z{OaffllgZJQnpcY%k0r`y~}sdPPtj~IBQ|+k5M@si7)xnzZux(KBjCHqrJWK&usxw zv^bh(n7pI7`D9FM%6|G-C;>;L-@u?=YeR2#- zk6a?!sP1Z=kM4xqm0(7#YEYwz?)h0D(UUJdIlZiax=*zkqC6V`OS9h zIP_e1ihB3?GZi_*a5lgzWX&E*Wpf#rS>zy-H7E9U&p`lFRH_mcM=EQUe3_g> zY^6KFXW8bLpdj8X?`&ZZX2{er-51n;2z-E8nEsWHvnr!_9gc5Z5^-GANdFiQUfFPNSCcJ%>Y9PmPv^ zDjmV*AQN!$B0_K;`NWd4{I}2 zV-~?P>Iy@?)rz*Ip$CS9qf3)>_2(CqBHw6qB2;J7axaZD$4V)Vn;-ws3v#g6r2lxe z|2eeogN}&N@=RA&cC-E0%LSik1xxn%(^JfUjiJb~6f!03m##yK?NHoe?1riwX`_4G zJt;VDi3&WbzF$0&o1_UtV_{|8TrGWb`G#3f=X&!Seidx>jHx6> z?cL1P5u;qSPt%DMMlV3ja%=nt4|Z|zVMs3EE#YXwbuOp9r}mAw>sr4X+-&wX_O!%} zko|#GOH8L+ri%wSj@Z@eI8UN(Ht+t&@X$I2M{-+$&lgk|;4Zv(CT8;TowHoN*0%eQd$7>Na;ZoOr|7A#I3>|D?QI{Yol?p0g0=aHa=d#FU&+K%;ZS# zkekzv3gw#k_}Ly@A#GbL0WOtrZH$_$cY7IQ&eRb_j3D)`jRvy7#j*__iuxRe*XbdL zBkEb!YK%$G-=REHm-O#>?EHXw@Cd1U<;mMikZO^})#z?Ph=uKBpY}aPWyaIwaoBQk$%-!leO7i|R5&Zcawm5zwdj(={yfT*ne#Qn-ScQar<`a>`WJOTqx2Zu6r%&+B9=M53? ziWPccak1`S+${pu1olRG6SGdrKn2ONHV^G{*90We=eiWYl#BjWz;#W4G zUY9aicU79YDITg#4F;Z2W@wb1W7C-mk1Ik(;X&$sol%}&jvQVw0u<+&xwWn7DgW@v zyod0yN@Dpc{i?kp;HV*&$ZKa)Rf9i{^8yEGu3c_sIV>g-3C+rAwZ>;wgSf8MEw@_t zGHqpqg_hxlRA6>o=kBPtCQ45*$l1mg$oocXVgFpKL}`T@CYhCZIPmT7G24HT55B1ts(gO%w_ZhbcH0 zM(SN2rHVCHDJb@}%jtGI;~b|eHL^=Ivdf9=8f&LHPwfquKi;=d_PgV%nV}EJ&)D-6 z>}vnTQK5}I2p1zD{kM4IdzBCRGrB_Fo$6h-^9HoR)j%Wh0BvA$ z>=<|nn~clNd(9vAdq+zyDS~D~=kE0lLn__f={@7KQkFjf=`M`=s{pxI1iZ-NuMy=g z)+swKk=Nr`fFqpeO+XiRT>i72@7-GlAfz^`|4}{7_Fcx03NF=r19zlA>#s5m=A$OS z?nc6fWY06JN)<-uK1TM?I~OErw`$XBvAoXCwlkIWZ^FH#$2cS>ov$HaQF5;A=o!#( z(|MEUozC%Xtp09XDkWk$N9hl2o7Kzs4|PeW0WD>yYd+Nk2z)03VHe?Ku#QYDKe$@ZF_w*RD>bv7M)dBBSN{` z))l=cdh_!j$Ma0iP)n|}J*Cwqq>^WsP}GBp^nmrR1aaRGDxVI2C{G>De|Glc9U03f zYdb1}RXzMdxHDTJWrsx z{-uFyj7B#MIg>XsQI4azFEe<@%t3Xe>0djxuMcir!dM&u9bjl8D^j= zq$47wn~P6*0H;jP4HMoHB;(uw4j>ebR13S+PV86}1&Pi9&f>d|r={Yyi5sQ?{SfZz zBxI)^k=7#XYGeQ)Rt#MiHoAn}V+I&J4_l^EJpIBJ9t(O@KKkfgY|L&}&j{hvuLf{* z$DE37maan-cs+27N4k!sD|CwJjN-u}*3xcOvsnL_abt?rw!e51uS$x^U>i#+8@sKd z22c2AX&>b=x&2#o;byw#nVCS@D3nXp1kil-!(ncL2?JkDlgagxJB$+R4*EPI54yXzF4WC>sa-C@c%ovXQ^PYt<{)r@G`RM~r7CqgsYJyIfQl{e)aEWbM0E z+!@SDPvIfnrQa%!6aInImPE*qCbq60)SV(;rTE7p=rgk%=~100%79B9=Qh=$G!u|) zcl%6#Gm9{9E|OZual)38l}XW5W;TT+t>o)tot=u(7`kc8$^;}U z>beucHw#(VD?CaEX6z%?fw8P+e*7u;8kMw5T3sLr^7ZI@+@Hx2(LXCunNGS7%{;(- z#`V-)*p0&LBA;nbQ7z53(j{NswNb)3U#W=Xd8N6C$2 zq9K;-z|K!Rom0Q*U{u#JMOkc;Y?yCt}N(^1)BQHYH4^JMCvc)A24_36VN z5S-m~Zo6SVJG-bXdf<4|63|VNCSSs|%K8s)35gql@3tRt^n4T9gk`PV)+w8$mY?P? z*g~pnGwJGO7H^P0;z_sC$w;TReUsIaip=wSoARecEb}FC0g?tpd%j#7kOJAEDlSzl zEYK@9fA2IxkvAp)W!-aJd=m(REhB6F|Z_i2H4w;UR zVSb4zg-pu#uQB0)^+vRJ-Xt>>ka6mk!Ol*eDry$);|>r2_TK~&;q<3iVyYsoPq1AG z^z;343g-Cdk>BBo?qYohIL7Ys8roN@lZK18%#OlP?3oS$;P5ZgvX`>cG649+WX9?6 zS7{L&0+=vRrc!jUUbVIyv8xmk54K5!_&FrT8kpUVE#A|FYKM7<$Th8t9r1g*>hAlcZL_8H2#`t7lR!x7^ZT1&o3WuZvz_E(tW zuuAJcsuIH355+vYj40<2mKh2i*LP?*>E-D+jmT`#`8?tjJ?F2l9p3sEi9m8PVI64f z`zY8eokX}OmDHiTDElB49kEP>!eGteQ2iQ!^8xdWYiH*7(A{cHeRyN=A`V9L$UPq+ z)YiC9DZTj355nAfVFh0SB^EOR=TAA);`@!kb4S_&bwdgK8%M<07Zd{RM?g`Hg_%yB zF18MaV;vg89ofO+hJ`y^OQ&IMX@HzNZ@}?{mMOj?h$deq5U?!@f7_NVh-bakKMi4$ zj60az%|(yf*5keaYXv))36yj_Oc2lV5Y4d|lyZ81By~5eIP4ENdkRwjndn%o*TVOL z4+dqZ&uy<}iPKCqx@}mLvKel>hWNe3y=p#&85PWbD zLYkdiopK#^I!&OOf814?RJ1{1Pp3oY_eq-dPV1lqETx5Jhp=y}FXfvq?IC$Jr3Yg_ zD_vY&S|%lXSjMJgu{f^>pYDm3N5g!#HMshb z%>vN*!A+9zp*MnqJBQ>iF_7I33zur=1VV`hFsz2Gnsp(w`dH(tKq0G%SeQGXI7zKV zc6{e4GBPVQNt&{aOZKsWlFbZ*l?@2i@wUS3((W~vLPz0H3xT=sM-qP*#lE1T zZcq#z{RU>ygr?}%OWE|B-E>K($4mS2JYiHssERKF_`mhX2K;HeP~rhjw!aK6(1@KTs# z>UPVIN6u$VLYwAw3rUz{N!Xy+_Z+@TI~8CGcbVyM0j+qFTQH`Zlk8b)j~4sA%YZ$9 znI(buENVF(fWvq|xY^0f1RS}!o)TNw)Hpgtgwxc>Wl0EOEPC5@F&y!hgat2RT9ww< zyNZLb4A12HF!$yc`+ogoOfio&XQ=`<(hm_nZwKNrYCbz=Mvs;n3d92@k;J_ayYD}S z>t8MC{7ArbP9px!&VSVMh?O4}8l2bkJ{?lc6uIGGierY}TW%W+yYGb|al{EnsEww( z{DT=7j+Qukq9d&aGM>9@?kV?^)SM5iLVnKoeT44$g2#G@cTk$xs=CIMOS!n*92KA` z0S)#V_#yw89&l7OfM&}T6y9nTvE0byrG5wl_&gWEAq$tMQ*4(C<@#ycwIJrUp&K^U z%orbLMMetr3A8`dQoQR=>%a7C|I^myv^)_{RpJi9IgiW}&7-@f!$q|@1I8A37(*=6 zOYH8IP`>|FD$3?W`0;$>@k_I>KUIs?v&aJLdP?y4$M#=rXIWvwzPvB+GtXr3;=z0z zICaf}KZ+l<{2Ls#?8E*DdvH|)o(k*kfB8e5m43m%eAzTopHrbUe)VT;!POP9Q4im0 zo>`!h52YkL1qh@c(xH8RyGU;V=TNNHG#^6+jpxnfK!GMqd-c+#;*tB)gwA)`iIKM5+Y2#nMc}fUgYFOiNbc8=SE$*9h3|vz zTUB)>BEy8SSi>8*nUiY)=YptoDFM4czF3OEdiY(@X7K2w(*7eRwuqebyDFg+dK#&c zi*UfA#>S!Sgg^jtvkUc;e~^LzvbDb)z3gJ?Y{=Zqw>8;l?ZxIRoXt1iS%Q|gqJtL9 z9WM{2GbN=EK5n0*?_S-#x%8#U%+cQJvA5Q(;d8^Gcw<&iKT*gRRMMIA0@ZEB-x6nm zV4Q;!JCNGy_BH1B+}?L+iPpGQk(+=!7x|4a(K-id3WB`zU6t_@bNZaCC^hS;NUWJ2 z5$2Ik*6WX@G<{r3p!}oT&#wnPKmPtSNy2v2nf876)V5jkvym1_t2CQdH`P!q`&$3{ z>00GWMGKQx5b`X7L2qpl?KF2jS9I~B{*g)#hRmBisI8mu;AWgQw0}&V5(a@Je%~f) zEqiGD*Wzt)DiU<@2s&M%$lzoxb>^%4Y@$E-uNNuY&iGxRDG!+Ug-Z`5cid~;AZ>}p zOOS?X&*CJ}L<;~kQLN@>Vt&jmBn`j_#y?FRkYwwBr8!tM=yd)_pwXlC%M@n)$qjNO zY7(>kNR>~G#J6+?2<&LDDr>Ew%qJ{4fo^+^N`CGuuFb`v=)ir8jCBn;kDe=i0sF~8 z@M1w_d8hZo4ro7Ua4m(jdh*JawC%6pPly$#Z6Ft6{wPI7eAm+SqZvtmGiu@9qn~ys zp<*YYttEC)+%)Ya9H;$FiC^TcVOFufc>g6|^}8ywEQ2%&LrYDmKCK}MJRAv;p%OMP zSy+B3@=Ewa&ffKQ*`3a-%bVzFCZ90&tK#K3?3FYA*q29gC7ekNRKuJ)HGkQIQK^X4 z_0FVH>pALgRWmYrsPz)UA0TNlCM4QWIb16dqh1VETC@7^-dAPt;G#Li+b`~R7gjNHNaVc@4TQAU~*VQ(Y5*2 z=)4(ccvl7WW*Be5PSRB(fbm$>rPdq1kF)P=+G-rEVt#{!*@dyX*J$)lrzAsUfSDez z1|Bmb%s7a2{!;^o+4_8tIC$Ak$z%m3Iv#Yu4M`uV$$uxKK3R};YP9!4M zHq>ulq*vG^3-Y&4?Iw_u7q!3-rF%mwEK8?O;dd_$>N4+}KKLWv|M=XFGAx7iNldYW z@mK3we!{ndFnimyg9HHS(vanQl%0N?N+-HSW>2hrPaw;@+=8vz@~60bNd`Vo1cX(O z|E_BOLOb>h_A~Y`|5y26q{TJem4(;-dzJrg{=bhULu9A(P~2N?7FXL{=d4PuFZl1% z^8-;we9m4l4=O}N?b8@BR$4AfR9=hpn}?YT1zPKB*Mg_!`tw#uf+R{7x=-uG1YcqJ zh)i|a)_vD}#Y5&wU#kDX)7t;x)bED6!ZwYzFZ1m;kMks73*P;Cj@nHyVQSw#gVF!o z!au)J5j39K2#=BbhFZnmhl&BVY@GkPB_!zlka9a~D;Ab*6|Var^$pupZ!Qn{vM>Cg zSYrBPtrZ{nZySxBnpc^-$i}+#724?@Tyn26I;vSH`Wklk&DEYLj=$Ey@kPOegJE5# zBB@GPQ?AD%PxA?N(Rp@w^#^liFp>l&gkJCN>rA)4jr#S^g#53eipFMo=IJ79B%O8^ zjVl>4SAU3nIYBPza%F=UV_{|cJbAm_b_d>>c;&_tWI}Q~1oQL%B&H&i@scRqM3)F^ zVM;Z5Wh4N_^%%!th7%K++}w;Iw*`y>=Hj(1ZKASQZT&bODZUU%dil2Rn}?Y zU3$qgy~8BnP$KxO&7zEpBA^`MRwV6SYwzoZ1|;L%!jp-Olv@4?(*pD6vG=n&1UK!? zf&!pLwB7TNOQmYjfxA=2I)ne__sj4r2P5j$)?urXV-ez#W!U|e(JDeL&@@!CBG?Qj zBJ&FJ5;AN$hZFRT&$IJ8Ii7MJLk=NkU#Q6(A3OMj+p1*L3fQ?~*XWMmS1Js=J;j*d z?U+9O(eak{Ff|{G1}^dcnzFy&6QKbdNuc~_RHD6mg83@5ue1eGVH<3!lJbe|;SvAs zQl=L-Q@)V&E`7ceyROaHHb?^3VSU9@e=2|G6YkYLpMuk(a+&mhefj@iDWrq}^`LIK zcFyNv4!ayL_upE8MXATvKK`$5G6imUj-|dxaWzZ~hZi$Mi-%7FPvqem{t)nV(J%Pa zQrYpgftcz14B5n_`Ttf@Jn1>X6Gi*0S2<>PWGBFU=JMa-k5=8^(Siv@PpHE90KEuT z`%5RhA;_0=M~}0P2Z={@3Bnm3FD(2VKTa4z%=hXQ<`mD$oZaX&w8+qig^;2DM zhUY)Q_^)#-wYAP2QG_buWO;sntVl&>1a|l8TTHlp=Oy?@!n2)oGGbU3($aWYbC^l; zbZu2niMPw1r~?Vi*>k^X@q>kD=*+ghB| z_W3Wsec4xM1pzdjwCjIR^%FLeL)#Nd6hJk1CNQhG)jykBxu63Mv~K0x!TX0_99Bv# znr6Osi3#h{KN9edrQ%4`me~HWd4Fc7o|h>zif^0x#n%ujLHd8|EpS&<>k1QQy~u|X ztLJP-vhFaZY`H}m3GxY}2>N)G2zQo8K%$)$xV09!HBdh*5(XkmPwP;H&5=0SJh}Wz zz4>NDuCVxNw8O)HqxHW;fzN0Oab-xp==|i%a~7UiWmLDz=T;i3n7XX&a0d4`Oz~VC zELekX9IS{A9yN>?QgpI}*Gj;huo($OPo{p0rFxPFrYoALh&yI$mzpj`QB_9= zTG`yaH6p49uS75ms{NZV``?l>iG@sEHs5K(dkmkfK|P3Wczb?N)uy>b)fLrKVfF-6 zxJe)xVrxx+37;D9KIeONdj2>IKzPM*a|bIz!ml0sPcM0QM()ACFKzj<`YLS!_|7pb z8nvsVzMev{x%;*~+zbfJNKMW*>gQ?FlU~&l7@DIb?uHf0y%g=f@Tkja-O-yxx zG_4s)uO`3TUqcll6E%s{x{2pO<$sua$hUuu!~v52^@G4lDR*>XXG6q^Cv_%a<8e{7 zYWvMYCDUp7>;G=DuxGr9Cnj>!)kTqzRQmo~vAXQEk!$ zY|Z|mN-kg5!rBwHZlYVRu^VCy8uwznWB!V}vOLp`a=EXuw(CuGTE#68)uj#-X?tml z!T$WaZG~mHs0G&y#inwWshwMpW>Le0Qlq`sc`wetQv0X79%o+z_r(mG8WLY^db?}z zsQG=~_pW9FjdwelPAgL|6ZKWI#K%dx|NR|18Joz%#`=cfW-?;VEfl3SsT}66Uvn=h+kA$BIjrris=Ue1p)?wpo*Y z=8Xe6W67}c!vyN9-ydB!h>7ckIQzTT2q$*9wmwSyxeE_VC1y(yRb~t9bf7xua z-+})mHAa52@%^=`e-7PXT*4=XS`n%_?o0=6y((|5su~T5+ivMWbkW?*9F}VnH-CTP zeg*5GpsXelQ&^s?>X6`P!RG~UH~HtODSu%MVP_-Vi)lQ6?Q)3_vwwX_;0rrUkq#qS z8YvDtbEQbrb|D$u?ApA1oD#vT?i+ECe8?R?wJNQlp~$TyLex`POzNljD6ai~?0{r_ zY51;CF4sUp=V!#HZ`w?8jc>UUdU^Jl=IlGG zaJJ3Ayk`kZkYB#^!bl1{_7d4@jDi+^=W=xEb<$5NMdA6aq4Ke5yq3EtqK7~($jp(= zXdmjwAqiG`dCseGb(aQACW*nRK*-+?CaPdfYt3Xs?!bMPpfRo68nQ^Jax@?e3foPoe!Zpd;LSz$A|nD16YYCZiJ74SmWIZ& zuU|S8+e0GI7i-PA`rDUqwSKkqi?5jdI#Jicl{ z!&bunJvF6fpdrmj*u8nW%n9OA+8O6gSgn_0Nr2fkKQ%}zF6T{hnWagT9pmSal2M^f zDs^+bcVgINca2j{tLB*?IPwlB!`PqZEA$|w2!;lIAY#{*_0-YX;C%9lU8t3!Rx%f%x~cfY5;(n+-xnBxArp@NHf#b8fe8g3z& zrv#DWk~Z@Dy3i`|@dvY2aS>F6A~n7pyRSly!8Ey_1Q0NVS)#Ek>Px4`_JZ+;Bh~tBpxzz4b6&d_e7A z@?{0iKQ~<)IklTnDj6de%YDi$92DCy0pIgF5OMcKZWQ9IY6)9y@0A&5EuKEMYOM#`uZS8or|Td87BO13<&Q z5I39zXsM;SjI%DpDu3IAxaCHiif>31bEfM97S(LY(S2s-nkta12%RoR{ZD-z)q6~B zKZ+9BI%_Ew=33K=GDN=y`2JvKemAjF-7wydQfo1)ZKR@850X}OFlcaRNc%=!&8Gd@ z-JZSB17!c41#9fdi*6Rx_(zv;%VTpt`leFIlPEWXAs5Uk)Ir6^#yTIME9!Y%ptJL+ zy*h!kX4Y$G;YbTcDBMws=FORlE0JaHjBY4&n=$N5=`Lefm>r4LkFX!s-*?tPg!TU? zrmd8&3gHxLN4)=(95hR&S)!|KrcRs6B{W`ZzMVP)^rZ5WqK#8PYl|2=HgLF36zeR! z)v_0#bE7tY7*$UfagLo}CVIvj-fT9PT!^xyrlHZ(+~B-!n1Oum>Iwqk;D<_ajLU(> zqjwS>{bOgGid|B>k2q?06Mj!knr;b|R{wuYeF-?!-`l>vlE_x}U0FlOzN=KomSsq` z?CaR~wNiwTy|GOQSsGay`<9sOG8h_+eeB!V*Z=AJ`@Qe`ce&=e>Z&o$=RD7I-}iGr z=RoY)F`gA`TBgDB`Zgjal5m@%0q?_~PC+M8SEF7ZHs<8HVzr7q*fP6g$Q3z=)m~$Z zBJ-Xam{THRoeDqP6S?{3qf$&-Td1IN@|~Vr;*#p}*|Xgp*T#_A{&;!-g=>ng{jzPm z9r;kvC}n*jdYoax!f~JKkeL3RM zxN+`}Rc>GX{|(u94H2vLAB*Xt9p9Afh;KBwvyY5Gh-Cj>u=#Xe77=0R@Oq+1UmHS_ zp!_Yq+R1ZzNkhbJ!*)C`@JmV193$>B3aMU{bl7CEC@C{{m!eBRhJ@}>F0wGKe}hB5 zzP@7UHbuF6eJt<4oBm;!I)&OdXl!BUV~PYdzS(~L_*HAHNTJdm^MrTCii@oGjCd%q z>adY9!=2ViXj^X zN_vN?5T^a*b2V7eg6P3a<=Rkd2lGSynA-VLrU5)P4S71fohgjypjTQ-TXjT|?opd0 znunH5(wvmUM|(izq=XJCrv7g<{QELtZic#<{VoEkXKASku`94m$t-ZiwpBxi4A`cr zXvj%w9Y*xya}?WChuCaG@ef^D=0aeQjt}fdWN31V9Dax}lTD;(^QmPrI zqbnyo8klk3jpu(RoWnbH6Jj`zoP_$qWe*WH#sqDGG3Xv~m+<2?q zSAn)=V^PcbWN?_|w%^a693i`8907+Fd9FRkJ49DVuY9``d*19eR7}U%pJOj8{>Ca` zkTPOXj_^?;{H8^D!V3Yzl+gc$>kr;F#KLqE-=nS`5f6`yYCNtp5tdlmc%h^EQsE^I zZ|CMs%-^4df8wC~`=1GOR2x!QQk$1)tLM`R-A;gFfFcJQwx6Q@zi+n#U}HRVju5Cv z2l<1oN|~!4)8T6ktrw}lZK`2>Zxn-*R_LJ(h)nIpjI$dCYW)C4^y)mK^ze_BA`v`! zwK+zWW;ZLV!>3tOlD8~hkH{|(EGf}p>b0o$A|ki3AJO)-_LsQ`jSMH!eR^umnVcu^ zA$$H)iC{)y?sAZFe#2`0v$SXgD=e7&UQ^Yz6$Z1L{~Hch@1BeoYRJQWnqDugEO{W_ z-De#?_rk8KTbooH<5*Tc^DEl#m^3m5Ihj~yKR%_+e44F~$n0C<$NvRZ0#5$z0$Y`EVxSLn~l&pZ;fYPTXN)FNwxmj5ZzVJm3NOFH@rz5M#-qNpqJJ;+Gc zoi|CvgO2q&x2}`6;t%q*tlpfIk-70F$Kia<4Iyn}6e$W6!lIv@S%^|cMu>(-F~r}j z*PDoZEb6qvEvd7OMZM<-m02>LJDS%26V9a$H9v!H%J`exx9|Ob=tl-@*j^tN$jDYu zqxcKC*l``c;NYMP@R;d-kxXI40RdUg)~sD;RbS)8ty7`?p&T!w(iR-Wq zsdV92i|5F#tAmM#E-z>ZE?-3@jtsq_v6dEedwIeh_Lzc_k|yDCUC6d#x=2<5A~#xF zS2A< zZ6fi#mq^m3VCgD$R&-7?#RgGKUi@?G1|~0)6*g2N*Q(Qp9zp(1_W!K!`^DOR^(zOj zr3c5W9BMsg6hR_DBBh;ORtqaqYBuH){I~ujSlH>AvU=nDigGJFpB&(R|8CO_J7ocD z*mBs@k~0*l`_q%H%+=I1v(r8i>abaL3)$zzJi(6YfVDxJiAfI#>&DHGxM*z0D;FfC zr6z|~^D6{Qk*{UZo+z{UJ%IT)@Ep76hUSkw|7xv=EIcu{PmD z+AXlE{pYv*PlA7M_VmQHr*#5@0UMn2Hx7r|Sr8igHq+*G8&D{%9^<7;E0!dQ?0L{!4RHaGlTct!vL2cgAcIa68id)iqV&7s^A+ zbO)0yIUTX-S`ReTlFPjQ^OLoD?>H9GAtBQ4=P!-J4~bV+R*$MwPW)Xbo=L9dG8~_~$kK!aWSe^uFR9}+twCb;R@Teg`t7f6zh9CAQ+z2LV zkHlf%4Ba)XV~c#e<{zzObsqHseFHC%$9Dbjx+06KH-9ocieYJ~G8~N#U_)!6!*&GH z`{4!6#c%hhRi22^flPPhk)B&Hwx&nS=lNov+WnceV%kr(;+9d?!jKA14de~v}8Ld)G_06ZP^+_jXa?|?!UrF zuXI(BR48Gi(?Q?r<8Rfv{beH$r|yTDxK5QMB3VY!X}kIH#E&clqM%n zcZ*aOcZ-u7PgBb)!_J5eEF#;ZsCF#R6IvEp&M_C6owxfPWv-(<#h?z)C2BK~+1f*T zjTE+SRxeK|I6O9&mlyhK!g}`Cv4?98@WtQS36ne0Iyv%PrRC=@)p;Ip(b?-^XJ;9G z-Y1r&7$ieSD{C(o4L)+k@vXN1CPF5VPlL=zQsm9TmPa!n~sZZ zH{W?Bh5kN7g1+wMfax&#h|g09j}|GhKmxclC0JJRNc48W4$t2d((rJYjFeREV7+#5i|ZKGN#N(iPs1cxVHzolA$H(?z(FmvU zbtmu_d4eyKn$Djr`o|<`2dSLnd;Q5RxVa=WNIn$`YMG3w^c7sUS=c!7_=PI5^DeBD zv@V-C$wUn<9H)FvJUCv6HT{tLeQ0jaRyl&9zg#q0i^*EDoIjbYx}YK^vVO-&B#ueQ zII8q3m4OAHZ>@fEdHY*;1XcQ~I>!-J9o2SX{PypG9-l0SboV<zQ<_FQi`FU9L-q-NO={DlVtsnTK*p`pyb}jC2onQ}dUB7bW$~%;e!Si%q^YpWm zgKhZvoF#g2@MWF=uUTEVmDfH5YA2OT+bLY=VLuNcaT?^ht+>!>p9`~4;iHVCP zZfdmRv;OVKTdJTuBtGFSnh%j3Pjyv_l;(wxKk<`-n8P#9qD@npl=Y*8LM6UZrN6&Y zEO719vb;7WaSD9-~Nm!=8F@(R~2)|^pCB%Tzmd$)hfEA z&O=M|Gf$ZfQ&1&w|BsddLq^jXd0mSs+!$r!h&E%nYqSwMT-&qa5tBD>tm#c|q!ql~ zAzI;to?EKdF*l$5g0g>YR`yL(r2SwxB^(vc-gtzSfhqWN3@BZY2nq^n&Q8?DXAa~b zwCo?vJYMjSfRojIgj?5swv}ja5aIPGaW}R4ZJutboK~T|S}eg~E2^qE zC3@z^J{G=qyX{zV4WTVxkXu6TjGUYEGiwfrN5oS}n%j+cLnLc@3lInn$cS5TroSK^ zMMYRUH_xnR^TF5fd-rF$9CB3Az9GsWW7$^LZT#X~(Msv3BF~Z!OF{Hg<(y6sB&BMe z8kovJF{7IU5L+{&vgZ+VvTRc=0DAw7V3nC1LV97;Fj79|?P5NS7R1`o)0&=IKNmhChtAD2Pc^`=h5pQGOH7ryJIrju;6knhW0_iEB(CPrHn|9 z4?0!)1tsKdF98?3iQs11((%9k(^oyBr8= zPhXyVq%cgg1NBtb-^tyy*n!cdE{18NAQ5?)c$+#7Ja%OQnTDtd#V=6;)Wpd@upt0gn;9h9XY2NeR+^If|T6{mq2gC+mYG=*}c2~qk>%*(pB_$-6Hn`_> zZCVmI;Vepp5ZO*C7>J1KNgb7mvF10wTQX}cbGI(?Pw3dpWLRB4QhQ*;_k`{o98bIn zBF6aYNs){g4OWJ0R>4Y2e$jX@*JD>axP`Rsn!QR&N{dSn9Dz9s?R--7!sE$37Ruwt zK_`b>?RU(Yy`syZ$5%Adgxi|>{0u7O5D}}kug_9hQ}Dgp?QCOB5zQO@nN!UrPQs3+ zowNfjK9ggJiTOF}(GCf?N}b;+MT73Oc@^&&WPC?Q7r$4ZtIf{9qZxc-7-LA7E(w%8 znJCuOSkSlDte58{kZkx3SdWknB9Z!NNlER2c$^&;4*ra6_NIjnBuX#tRx7z1%>-Vr zL3JZaN{FlBtKF9?iGdX3I$)>f&8DEBFx2Vk>e|y;c}Ez{ldY4a!>gVt-BsQ7lqbye z?eaSNr_$2Qm=fm)GvdN(youFal04`Rxmi=7{nqopbpAs@NtGu+o;br)kFXgxtGQt) zd?~!p=60f%6&7vT)yNKd2pC^xHa2UI7c`9YlXLvAO81kn+iBHgB^$ii>VqSb+OmoD z1>z*978I)7iCPkL(cpVdu>D#5s}iTBdT^0cKnNM2PrvNkFqCv8hIeScB^T2Oa7!eT z<9z6!J{2Fo`|I3NPdxgFJRG$&uJMnvOZS&zam4 zVT?@5L!)Zb8Ch-@b^GJDMTMu!J{iUqN7BIu8#CqS$10Ux3xYo8qS1tOR<`d&ce%^V zX+A>A2CARkO6^ONX_x3;Fw!EejeGA^2c1rBC&3s5G zH7BN+G*X$^lc;TQL!Qg81d9ZpjHS+Iy?$}fE4V*xe?l)_T2I6?3xinQ(4fU4!Ln2# zEkXQm1ySnXPPTn=9`+;-HMos?>sxz@`=U^fXg*0cUz==*@{sLSrB-?1vig9iKg-Dh zt7fWEpg-Y%aVBipoV34>Ui(uQk<73AL7nGWV*ptTLBTR#x#9U(@Md#gB6pONlhaJs zfU>ro-AJw17_tw=>F$8(PcUf?AxTi#X8z|D7g3`6o3oSsZw>=RW=&piXO_e$DdT!! z66p>(q49-mUO-5w$am&J zPWUz}Ym~-c-+hmOX-RLs}<^ZJvgQ!>v2Wvk1N4ZrlTR-Ti8M z;sJo(v$U?kX|DFftCW4-POdpo1NfE&D1GMKy>DgzXdit02E8rtZ4<5glrHr|TJb$b z=7<^UO)uBuXYac8C->|`y$Ee+WJG)Qa&fVHUS2&FM5geJWtBsevX8*DwmG*3Lw_lG ztm{r)lBaKE;n|LHupe=LhKz6;|CpvN2u)Hi)Pqo(`|C-uqPrTevp!yASqWOK9dW%9 z3}K(t__)br_#%&44RaxKX+zG=4yJ?m`D5!C;OD2N+dv2m=odOet?$^ni3EFk--M-JETS(BGJeMEo1W`Kh1sA)d4hMez`vSoLS(UbU0`Yi)FwkNuvUQ1bR<<+_u5uuf_s;g`90 zuY`tGO^K5Uuf!(-^7)gQHCFpoBsBQPd#^}T`wqR(&IR0wd0}U>Ma%rL92O}TyicKW z+IHaN?7Uc9q!NX}w|f$t>WWg6vwu!cOec(L6^)&2M`g){&8HzP^~~E#f@Q?~XOdjf z+kAISC}Q`{-Aw%W^39|(m$eocCirVIuZwUpsfi5Q?f_B9zP|~|xS3(0i{NbYbql3X z(`pWBtsb6vGNgrQhZVkc8XwcK_u_bI=g^tSCKH`k^4W(!b8mo!xwPA1fR(x7H7hAI zoqad!SwmM}p3D$+dQw>Jjo}w|ou;%kBh>y)6dM@JyKW&ZKYqo?zC9y{F-7${?-#<3 z6g2pT#>d|E&J{{Y!7=EYH9>iIeBUIcl(x(HkMDJT5A8&J^gI1|*CPB30|eEI7x#s( zF;xHKvA04$6^g%;_gf&N@HZCS?r(9#z$j{A`@(|=TY0#Pp3IW<%xXEqUL<>%Fc%xf z;F`CA09xfUPTt+!jUxGMS?`nRj|3PHWMXGy~L(VSIwJ@&^z!GpfU z@B!4TvyEKjI%NFQRgmDDTGP5l94jj0fX}akL z-#z(oZF7cok9VTD1{W5KJ3UU%QVAEKVNE&F2$!RcpAGbZ>`&Aq*x8vs%!c z`)Z_g6ciulA2XGAO@&Uab}KHK)q3PmPX(u^z!t0Ep)r93h8IkoU+`HqhysciIP$mJ-Y9<|6JwoW|O`C==YZr z=yZfkSliZMt2Punx9x@F)};|Ht=-tawpo+cMR^?m;C>zPh$=b`0~To{0~;Q%6*dq)O`L#^{1xBs0=9=vZ(f>ora@u zzNt=xIj8shmX(N^ETEl0+kLAhtsDc>VN~4wgB2(Y@tD-ofs6jz&HBkBU^Y_mjWXpO zKNHguYIS?w*z2--(GUd{)zHXD*CO>4%9lNWjJ!-k2mXwrCdQudC|0)xBFj;dn zlF*AGL4|6H+*{ zJ%|jUEZq!edi2|^7K&juSb?(}-12x+Gj)8YylG#s*fvJxFki)fdB_eFN`HTT&c+LlC@OX? zhB$o_6DceBPq22UJLxL;2=4aYX`+l3D|0l}dm7u>;#6UIpD8Ie&WCP14AMgQhd8nA+I*}6Yda@4% z_$qXxC0q%T3UQr0zNw%x)wa-+&cqQvO*k5_@fWqc=-k{MMh|?@;*$e_5v%;C+W{Vw zkt$@IaE%BF%>=3xh~1_KP$;|Q>8$3<*LEhZll5<9EG{V364>|{V)LAW>|g4>DlD{@ zh6ZH~C=p!4Ob#YI>qvh8c#9eZdN}T4GTa7_QV7`nt^K7WGEd+L4-hUtd~Fufa!e9M z#le;O#7@F0!xguGy+}8EUeofJT)VF?KmI0%?$&6gJE;5ADwWr@(NEk4&+ID^w=+5? zMtNNWPMxMs_H@7X?)t*1zj=%crj?uO215FLYc}OK)Ww1lYv(s+X5IX6nP+F8PM=(K zqZE)pM@T@dejd6FI+nLZMIAPCluj2c&nUlsz4n{07Udsa8EbjAYiDx0lCCmm+;U37*bhhfx&Ctwnjl-tMGf00XFu}{G9mq* zUgI`)ga5Hcy?cNm_ZaxvOH`MdK5;tmf$XwM=rLWX(N}PCc^|yOQI9p1KDErGAwFM? z3OyB;Vcy{P_h}3c4*vS%doVaY-UdWx&_~GaogXiAlf7>r%>JAR1x+-TBmWQ*N!=oc{&JLE10k1F?XEy;%z1Rpp^|m-XWhB66OrI}$ z9B$p*Upq=sC8Y*HTuqGW@~5Jr%=1@a6z2S944tccX@;h(m=3#;!gCiu78vfBs=6DK zMi7TmP*cVS$Cs3(7?14yG7zPqNXHHP5f1)9*?)dVF3)4J$x6jXiE7e2(-G8q#+Z9z zOb_+wKrk#D#_Xeume-c1U4s=eIl%d5hY7wfpK=b{MJi_9Km|}Hrrs$;&%%JDdjrch+*|7w>4A5pn4-UV^toGp5%Rw-z1&Ovr)I(~8g zR9p-zH7@tqYP|%oOHbY-XnyyL48E45J<+{2)GEwWaB zzcb?veBP?6+$AN8mfmYi*TZ(^jK^EtMO`p<`^;Al<-7~Csg(oZmZzrc<=o5+~35hp+ubO4vm>ZCD2kunINrsrM~;_?(KUWZr$&PtDw3erGYa9 z%g=>KX-g^y`WZ5WL^S058k>q=3iVWY0`4M0C9g4$O`DZHZJ}1=WPg1DrE-3~NGE$f zF)m@JKs5ZVoHssB9`Q`Lb4Ha^F7#Luq*}$jT|6jCM|kio?eDKX5V2@%-JU}|yJ(HL zTzP3DA|e88un=WVi}LdM8`2E+mHuwxTXJR=Z85>pgXod2=4?)DnEm)yv_}F`Z+HB#fp*HGbwjjJ#5eK-{FE zuwu%|Gh&P3ttu<;K91t(@MP=%4*yxLrNgf9T9oFq-G<`pHkypW{1WHu2U$vW2Gx=) z>t5!JJ>p>Ch2Wq&_Yb?VD6odPYy=Wb4&E;R@~-bNO0TgUy)UKr*3s)n zvQPf6wChpGbPM1a&co;L6M+!cw6x^34B6)87(W#FdW|7Toex-SEYD9JvXuPOyd5Ok z)}YW>n1sKGak<3|AT=hn9(rNk@pFS{bRR&EYG}!v(EY$h3(*S46!^s&|Jvlq?Vhwd z_*L9tsI+UqhkIP;mg<>qyVq@8Dra3T08JTjD_eMPkWGaiu!9^FA?1SkO9DAuFjEnT)!khmu!zb83@tn`X>pN( zi}q9a%xR#0G2M4xUqeH~_bTpaVS}_x>L99A$hYm{0d(k|xH)?|KZVypK&Y^3P0php zqnYhv_u6%{X+OPzScOX0V_OHkQbfsON4iB}Wn~h;x%PZ_r^O{@e-$;TSZz+}jyJh5 zing3W9^@vLMW@+S1QJgEs&9pb3>N3z#(}fZ{A5=mo*_F@h0>jZR<-}KS@h&&YL}qQ z;vA<8G@ty{DhAt#*%Sj_@@l5*85qQ_*0afegQJUdDs7j=jS$b{N=kOAcfDtR z{Og88rUeoh-!~$L)JaNPVsD`h(yu7?RkJ_wWB=_~C=*y9)SSu!8%>J+M zO>8KVg~c8t?BI`#J!=7YE!95b~NV@bqAM-;yM1P`N;klM;D1Ha&-3yZ3Tr2 z#5|uTI)JtHiR7l}6v%oX^8nh69szgEg=`Q+Y01;|jEr(%txsP|YID<((j~PFB9)j15PA4@$y27mpCM>=_vudWNY_z}a5BhDMOr%{VXt{e3>)D=FH0);hiR#yAfO(#S1$DY_Q?jNq5_Ye z{EGojcJa?@HY`qGy$HL|?z;o1``vi9zZWR@Rk&buID$_l4vAlRE@<=IXgpeE4cTlc zf5CJme2X-^H$RhuGyQBGKnk$)64ZHqG#yM0R4xb&`mi&8K@{5^#iXXB8+$CQ(CcK& zYZyqkPF4!n*UMiL5EbI|?|*XtTpstp64&@vbA0PiqLI+UDXu8_a7OQT%#Tx~ov>xF z%0jAC4bnE~dit11@1V-K$?$_2F_%#U`*-)3Kzni-{W{nBDij>X^1@{FOQl(JNHp=u z0UEFeZ!m3lf++_!k?GkyClHb>sBN`)^P^lgx;dfn}6=8Km9;_LVm@{*Kb&W`ME94tb@I(yOg>)9SJe zoGrzZtr3nJL0QjrI<6h*8eS8$ew!RsT2f*H))a77{2aSNfDd}k&=@laAX!De+Pla3 z!luZq(NQDNc43JFLI$uC0cV{!r>dk;XsD{R022U+yxBT-{O=q%I630C_D$Wr7JHq5 zj|gy@L`bPoz7|bN_7mRawKZULIzA3MLS1ZbcCNd7c)SFRyS0@F3=!~basDct>epSo z!+S*Jk9k!0wzBwN5>yuWf_pOCn0aaaG1|wO)pTrY41YBhGBH%4^SGh6kEBNT{!3qR z*!p$2jg8gq7M&aMy1RY{o}K-(uCh>2h40s@ai4PeSe8DTwgSI!*)POuVro4 zTTLSajF`jF{{I}i3CKI2k?ad;zv+;9d^G6?Mq$T=alGZH+zK-CE8m&`;7N#jcq@l& z*VlZ7mE~ELAG>?wHfw)1d~v=wxy&S)j4qykw(&gEGG9OtcoG6n$0^nUo^_Cwe-CVV z(Cr&P?Cj>c?>cOlEe=?=0`&wedg@fO#q(3|$8pi0lQfX-xXzmMBhKi~ywl&D7i92@ z+1SI=bJtrviTrS-;549>NNO*1r}ns>ZMEy2DERJNj!Dw+8~Xh_Q8dBMba#J0PXP8l z2qW)+?(*~=N4kGCTjiMeS>RnXUS)Hw*!I@NNqwjND0J*$sJH#{QDzszMs4zkb!;EW zrmi`IC&pKU&j5hS59&XoJLZ1o-37Zi`$?Qo53I^zX=CF7#&@wdThn*%kn9q0y#>6V zxEU8TQ7KHtHl}+kk%#8$H{0b(G6}|&`d5Wcu(1TwU!&ptX8xxqQU7sj<%zXUGNY$N z0(7jd9Q?2w=KC^`Q0mP%+|C)gc2_!livzTrX29&tUz8C+O674pd^;mE)1*E`F83)D z7(9Sp>#2TfxRBAd{y_ur#Wq}8+uO{v-;s|eOxDZY!ArG1uM%Wh zG-}I|PB_9|lfFIa(cLy<;Ywz8KsMT%>kOwH{xTJaR@+AF6fgsS}qjk)PMChI#hzb4*iTTrVbT028 zScv%R)DlEzkjul~(Z*8cugcGO$i?JM96mxnynpk9dHqtZ8vOEflT3IA7$1t-5AWU@ zofQu3IKi7#6x`CW&{x{HIV7jPZHH|E!6!a6&= z9SXmtFfaQg8K4e4R}PiCyGx(d?cZd$W6o_d`Co?W$@lxu|tOL-UJ-9tx~u@TM2a@8eCjfHXqHO(@Xu$ z->eDfpayz+uW)#{*flc&rdwHkA30(>me!YnPRa|em$Al5r;C`+jdNua+;ol zO7OsShQF6amBUH~K0!~lmMJ6@ zVb*-vwo)R9V)G5`n%b51s?5w7J9M_j$7-(s=)A(yvi)ypyKg(HF(7LsaF4?{EODHH z&_x(`xp{>(JrJAlAmZ7^S`v6Q)4l;(E@IjID;XY|QJ|T&0AD>g0)(SgQXA;r7>cF! z)zv-~BLjov0RgzFLTOo9mIFLAXO2If&~NI#v&dRbOL6(=N35uxv9XGCaHN&3_zxj+ zDXH(L9hPU>_Ffyl^ZVu&7CKxsU?LSrfKL$XdSm@f*_Duy(JHt0e2V>p>mow<98#Hu znqZd&kC-WGZ_rK2gZegt#c15m=k%EU>G{{ioO9S~Q2qV8p1DEKZ|*2i&OVoyyH7Yr z#FWeuPCVGs9fgAo?AS87hqwMt27rJRhh=%N&fTcR_1~Y$13o$Z=qfNE=82DCp${(Q z9H^saq}#ESu;NHfq8xL}kw^em5lL(H7EnU~a1T_sIdAe_Z$0QsR^LbK#@u zKMhMC9mpRs*NOOJL*)!=H-0T)DG>uw65aIgr{enfl=gQLI2GBOvM1)^w6)8^r!O_1 zOy;jm5^k%iM!ft%y4j*B4x3I?lld*~prd?GF;U(2c$LED$Fv_2#DEYnn`XCARkv`( z(j0R$@f~g4<5ybn@s3!=XB8nNE0-gd3!P@is4U9U0||Ka@UY@c;I*jsUdwM>mV6Ms z;*ye1U=1nZWt$FDSa5cQp&}B(<6kv%1T`QkJ(itECoZloq>j{7H|c?kagIEzm>2jI ze*N)e1Bfp0EwGS>!b7GW+M`x3>e22}OIYedN!IOQJRs z-1`Rypk<~E4?iWSxjX)VYB7Kz8s@W@0B!e1gJSL!$vWi%%@q%jIewoXwi(~~n{gN5tRg~1 z6&2SdphKWBVQDD}fk@@=FUX333etgOSLC1uXm=d)nF#`SG#~EVNi9|9O>VrHYB*gn zRzcwp2y5P=Pa%+OT+RUA0SFvys2PBCv*ge^rr4xR`2>(y4IvOK6X`^7Rq(@GI1xb- z*aoftgm1G+Ov!J_n$)7^Lx{&s8o`FI>+^h^j0Ry32s|i_^>bVPqHmUJ|KkO47|6** zAaWew7mBMG_m5n~YlpOJ+W}w7-G6$z9-ka9ZLa2*)CUcFgEkIuC4aPMx%wXK9~elo zu&}_BOm=*H{Emv6mOP4(0GNg_1DMPzdKMLo-nj&3fp6N!Icc9{6@RoByjGC2(D0$q zK?l1M%t`cOIY#O;`nC>-!b6}sWV0K;qo4$2_@3=IPApRM*1a>GVrToU9z4Oo#5{Ij zv#7$3>ioq^aEcii=yHTfs9c=t_y1CfNn(D=4ZrQY``uY3@I7bf0cTy%(X1r>)-jMP z;I84B+@yXxt(^`ZarLhCvHx>DqjgDLKI!hmXlAL8JdDNFlZVIiNq(|6X_*{K_Ofk5 zOXK`?v`W&>gQ4@=D=REUF03w^n@-zt7yjp`xC>GS z5ogx)yNLP{mhe_xLHg;1@{m+U<%^Eh{cDTF6H;-<_3}iw5_6M!9Yc%8(HKPdn`;ib z-W$Vu9AP_hD=elv*d~*@w(Y!q(FSg8Roji(ANJ!c0ht$63+-&)Uk?;Gd@Idu_q(^66u_Tq?JB-_+ zD{%HC2Qxn;ARMGYI6xm`X6&B_{+(?}B%7JTT5Z(g-yiM0f!0*q-?4%J)eAxPZduq} zHfY?=v;^8j2WZflG}_+IK;Yq~CMI389h#t$e#)|kbr=$s6LjqTrrnO{@a$4r`LnLZ zqiajGL2o&mj)~9LaOb+i!^81%j~UUDzrop8{t!LAuGgb)Q_|Cc7Omm$FXO$~%f43+ zbUWBS8rX8C_kv6+yzIhoazN7qY~mUgX#!kMK;v0DR{v-MS`6tT7CamY2F8{HuaB;6 z9l5iq!xi`e^6@j%<6^Sjcr88MZ=D>|Z2jCXsngcDqrRa*gV$gwNsrbX9IL#OhgC z+;ziI#>I`3aftv7AsgVKLan&Pm4UFy;4=mX+4L+P$ocL5n$LMdR+}v51P|;+Wa(Eug5-$M&rC~gvjbhK7DNSU%;l)3J0HRZ^P#Qu4$kP;Nx(JBbNe zoOS2uG-R=>2+-DlgGV{w!W>YP(`EQMGk_hc=*RV`nWoPLM9ZhOf)zk}%fZpn@yDgX z3Q6t!Iy9>h%4(Z1z>68IXi980y)@&QvnI(k(cFwiD z`(D`i&j!r=PPX8mn5~We_Vy2hs1-=`pe>Id%q3=uY>TxFf{|Q%uBIePbG0&PT^`8C zOs3M|t)gN32Hib^j?PYPgOrg`+-v8yjMy3|FcQBmKbw*%{_-X3+o!r4UoEQA%0u>C zc#<`MN2Se0<@nO8doQ&Ul9Qo!n#ASyQk-sR_j4`YN?}n?FY?t5ih`iJTGlzXS0W#Se{2uHuwXmh6+Cy zy^{ z8d#pMM)HCUCt(?cK`;Bole69sNPln0BH?T~L4z+jWNq#uV!Z~Z!Q+*uf8af!++K6B zkjbXtm!h!In2D>~Jor*t4)=Y?M@>rCk7Y=4Fnq&SU=2@~qs0fuel4lbxX0C+t4bQ^ zg_?Vo_7;OL`1(DyDCf_8cU>8n7U-%=KR1mBpiz^HhKr5Ldwjw8+e}hi0^t{NbYUdHi<8?**!btnW2!^C#?<^BJt0vq^pBCL10P|NA8(z;7I?(Db??_>Vll zsDfS7xZ9^3WMgGsj0>VEK3i9%YcAp9^{ZE5pkspFtc`sk=JUk*IFd5`skwnF@DmNJ zg=Fll$_x(HItw}}W_E22X$Fs9?DV9hr43CqMvgrs@js}3e+fP?kO@Y>BBRs}J2B_c zoXT5Dd5Hp>VVmyyrlvBf0*%hTv@WA%b{FUAfs3$g*FTMKR}n3qD~}gHcg4&kk4y>o zsM^dq82?NV6kA$`UBpc6>;(;_$=ma? zGahduBRdU_LGK?qY7`ksdg&Ru(NBavcd9ohk7R=t@znS;F;O+786=}DLhbAVo@5hYFE&9rv*V%zQ_U&RJ{b;!8 zoIl;HG7(I81qZW=ZU#pK6obTt@s~FpF+9i}yuEFs^;7J6krk7f?}*eqArQ2z8!Q5H z+(QX2Z`!R8O&eEE!&JbbWtM?+nM*5c(~K4Km0YV4L1A=WQ&U{dh8v=J z@j2Mlw{OdBe>>u3m8ozdFmN0%>y8}^Ss?0<{}}YAnxm{jLf+5J-2CSi5ppie^At2u z+S^q@LaH2RD}r<4z2qLNsgbXKPO7c-mfw`3q$RewPd^b`utYz>UgWXS@aymA$r(SA z{JR0&L(WPSkAJmaetk(CMgjKG!cY%ldfXw$elutCbhRZUxu$Us3N{r9S`yHS#mUV; z&Wo*r7Ci9bg3ix@9?)8V`Mz~-&jXAmJ`kXrjZ!(}czOs^fZ3Ut`R++ovnl*Y2-{WV zI6sO|JR7EccuTLd6ZHl3ZIJ6V5|WY+O-)ysv7!v^Vtn?R=sM)PUvEFxl5Jc&$}Ep6 z>i5~1E0kB(1pcac4*Ax2wQxTRR$h#Leh;|M@awD$Eu+ ztFHHuNJ&$u`*os)&1sgk(Eow_ny#;}|6{vZnIn7+`00D<2>lHMjzxvY_=b%z;wB{} z#htAIQ0C_ASKYa8!~s&JmcTKCr#?$TjxxB_Zri)n`JP0_m~Ft)Z#7wnwghgTFtal+ z;x;d2n$OB{JZ#Zh$eI=~A><5>t7M4vMwyovegFQJ(SLpR1lPd%a#6}nv2l|Z={DKPdA5D=qA%mSL61Qf&&6S?=uWH}=cQ@TF1TiPlu=q( zm;_HXt-W7A4HMGE7J1)=O)GDT@1Q+kU$~loF=n5=BC@k1+us=Ps~T9F?_l%?I7vr7 z+x}p~T=8H{LKdMKe&PAt)bw3?3Jq1%UF~F$u0Stc+G4x~{x^5qL8M^4?1#jcg6bOr zXSXf4hLaWS*BU(9&z?)Wj{TZyYB=hzX?Ya*hy*D7?Z70-F8?e1d?~8BriMPgYg|)> zAx^M1_V0t!8t}YEJoRS!=Tl}*+el{!e$-RC4%QmHsL=OjLo{JIS)BPLz~!?yqFReZr+IYTHnKXPx{K} zKlfUB4~c##S01|lwQ;9A%x^O+k+^&VU)fXMDn^d4$@TaMb^|jjXMUOReaRbgHZ80y zEMt|vtYD-9oIMmWWsqPQ7%0aoGOo_UVz*Z^a+$czDPfYC!om3hUwwWHmUZ{*NBnDW z%7cPPq?7PUGjyUhIv96>eVDID#SuV{^}8CyJ>h%6TD!U-Bc`mZb4#yZ6ds%wAMYox z@MpY!U7rXv;QU+8<9^QZh7edSZC-o=9C5tXi8kHBk7Vn)(7;G(W!14R%-=|+(5l6Fu)>6Y#W z>26RIkQV720RaiYp&Q8|1O${CIvikNh>@=UqCW5Ue&1UEtc9R1Chk4=+!K56Q(QB& z+|$-fy@j$onQ46{uh%sxeD~hpM|@?vlG3C4k%^+DC6Uil)S)jN!(N$zR)JG7=}a0z zKl!PrGCuIzk1qD07q8$JFxOFQA;SvSsR^|2sDYim<4U}2(4fxwLe%Lgl3;jZLe4E9 zGv#2*!q(;8fI*Gx0V+5&CPPSd&(m$CD!~H8=>dnWfr&7fdeEtfB<2CEl9&BK!K-FP)HA^R@&4D$c)dJwX7coc8KG zsJpv+BIqOwK&yrUN(^|1s3z3->;S&-tPCSz*V2y5361yg*jQhJI4zRO@_)G_ypVyovd9-w)0w8}D78c8H zdf;{vb87Y!S4I1TfYyUR{|FbuxOzzAV2*G)Uw!kBLV+0LGxTbqubJI$E@ zxp?S!d;jOSVL!}5_Gqv*C<=OdC~0R{4UUz<6%YX}s$QH5RHC=AgSI*X<_{neOS>SX z?cGOgWmd;bLKzGLU$a35`+1f_Vl9t2WL z22uC(7Znv{P>vFuqQeirZUx!i15^DpNq&1aa51>Gu_}a|EPGBI8OCLmM(5hsj~evA zlIl^YwMDw~{a_=t-pzz(VaG@1*e!jV&WHHyB~;1c)c>6w%#>v)&$y>*z24g15$NL; zuYOw!y)H5+>>=hYB>#`lfVs#Hwq}mI|a3;?5)Q&-e2rSlQnBF*w>zGY4brKLC;o% z`zsEYB#$g}cK4$i4~OW^UhbiI7N$@NI5%&TOa<*ZZkcw3DIU%qwDh}!yJmYq8X#2f zLWgAa7}^R33?}MaF%+9+2DPthTbITUe~q{HC8$aa&N%x#Xft(rk@emO2bjd+S&)Ka z|Ms!UXL2&!&`-r>1!iC3K`3_Z{3~1kBU+x7l_Y>SCLJRPM;bB>@_rLw$L4-GD(K4m zULvwkO?@!*=}fH*Lz|IzbM_95FKGK~Yl2ej=-8A3C~(r9ZP6`Nmp3N;EXgYK#Vd8-`{DQSV5m%PW+8Oy342mI664yHq_Yzy+!7H(CA@Rdf++_) zxp#7js*OC})4syMOYoeX0VxY0ZjzA08E=ZJQ3PSbtg4O;Hi&nb#Yma_G?==&tW3qZ zqfP@}{W(Uy$mMYV6!D!S2hM);pT$2FXPxEc*_fE}-Svg<-nu-@pu5}w7N<>`;5_j% zI3N@LD(YfZeCw-QOr`(GM!?g+57VwL4mQ2}T;zDLh9ci7t6|#(32&hSI}MZ8FA}+O zj0%kW{*sDqo<`J-6XU8fGM4pRB5i>$rlyXVYxA%Rt#g<6^M@yA+d=Wn1~?W@Z`LU0 z1eKjpx}etvXg_THk}+uD^?ycpFKz4x@mQu`M>F7cwH{}*W_V@91)g3ejL=Nj0HS7Y z5I9Ast1l<%lCpCUhqE8X07-0d|L%O&*0Ja8d8{`d?{`&D%LNGs@N(B)eXT;28a2kY zp0%1}!v&NiFgi2M}T=14#2^#C+cf&z2Vr_zsARSw-$jUWS`JDHdDc>!Mv zI8rn*?XPhxHE5)@H&-|~XxcKK#kBa_Y+%+)%2&Ww)}MDWBze|q9plfO@Dq_D0Bh%s zmI^sxcbY zXD1N6U({;q&p|rp&Ic}jjRx;b7TJxaB$$;&V;z|5BwFMar=jW;E1ZE)mRw@O zrQtV~wVana0+`1AeqJ|zcLsWqG-|kK%CCSGb5M^T zaBe~dF1yu}xGEWu;YC|1yQtcXEW3$HB!_Bsl2aodska&7pcP;2UZsG0sl{f293f8* z2mN7rzw5(NMe4C%!{NwWz^`06C+M<>P#nZVvbJ?W_!FQ9PA^;@s>?^FH*-P^=1Afw zAgDWX)y=7_dEXB}qJn<~pY~qJLZBx1k_Nw7mCd6??$kTn8E13iuZoIV60743y5TLF zU`8HV?ACDpXT#iZ%X!|SVuuk3MRyEkmNS_;C#eDYZh;b{wK)?9{h;FkXpLM8qBC~h z(LfsFl62yCu)bJq%FMD)4`uY$av{4{|ACmV&1m_QPjF&r?tJCK($dGaURuvB))BL+ z+S-qrbK|jE`Poks`}eKC?eXp6#Rnc3Iuzgg5n$H(X+~~Xfa3sE5-x~96OSX8zr`%I zUq2rxG`%P45)J5TT0n=O>gGdosL=iGp408*f1ar)(N>~+`!SuPk)$prFVp6;u%<qB=x)6oFB(68hn5gT%3ic*%pP40$?0(me{i|q;NdpQ%SDj9 z!jz`OFCrqRr)OR--SDAQzuK>B8cQg-KBO_LmV%lb>pmeaNx9jQ2 z?9$7`hxAS91ARtYM>{hIhs@pGND}uT)-Frpa~tlVBQFTF5EPT*J z5#ebBgj#r&XZDR=+$8GVQ~;X{9-?}@#LVhi(%uFf;@)URV+|=^DS{*uTjrrRN*#vD zm`x-!I2(Y52=n<~*caa-<->VI9mNNFHvazDm-Pmhy08K!4Gk|QX(f^u-OUy= zZS9Dr-Rr4`AQ-&3N9Q7W5AqECSF~T0aKI$G#Dz=BKIhezBsBAET49n0fU{UjA7*ej zN_o!Sm7ofV*qrzwSlV9U(E{S3obM*;^|sVoo4*hyCyQ?3u*D5OG~bK$^iRb`)zdlu z4#?Y5A6jUft{ugzS>q`LVzSwWK&ScF!+x4%&TAd4N*OKG5yaQ8Uza%9aQ~>uHYQZg z{^F-p+_)kyF@2iS$n5MBD=V$xspLugJ9mJAz64}ZIy`P~kw3P}5oxC{ldG;>ZZI@_ zz5I*+fm1Av_%lsSB4uUeA7f)0`uYmMx1;vBz3cd$L)WLGvgWe~Ey<~9a>~o0$;qU5 z=pah6vf`l3#!>5N-Z5n@m1C-25}2Z;O~}EPUtW@sCGM@EZu~@AT6%aYMIe9FE@;0J zIz0LFDKB+Fam^h~95it9(F`ngQ2R7j@37#09QFlc&WkMr6TqkAk~hgwdy8;tjOpiT z%^b)Ou5_9a1L{IBUA)#gRS47u+)OYSA4uXsqksU^x_&K$(-nZ0yu5kla>E@}$o_-b z)4@5dpZEXSe0=2>&L|&wHWIC$9#zyU5pX*Am9n};T& zZqhBB5v;4bYtC%JxWg{T+*1+A&6|KLr7KS{KqWLXGu*b5&3$}wGFj_P7t{*c8Gvf@ zR9PW8f2Co&Gb((d(qzw|w0a8^YrgB6NK4RmSoretM((@+ zf;E-uS0)cHnC-VV(Lu-i9cyP506?OQf+TIJ4v6IJY{>^S zB1UkD2AbY0n`G?c z&}%e%fNdNE`WOcQ9R<%v)ByN3^ZE;W!0#pR9vLF`&gofk`@O#hlmY0Ceay%}R?D2E z0Na1B{Cr%PxNPNvy{p^RQRw6P9%7!h87>Jc?=pl^%b+hJs;$%2)iZz;6g&YTEx=Lz zM7R0{iOJczPW@&Lg7il$Ag0Z=WC5x&COr5sJYe|&of&`!JdJeoY79CeS4PzkMs%lq zl>E=$G4Wsq3@t&tZuEM?%_d{IW}_^iKS5%iA})CO*5XM3gBSoB0JR|w z-cGkogezP0sjO{qGXZkP4?)3~SGfSmY-&m+I9RgLI3V6dvO?x0R$eMZn zXYJF>$bpt@?v6f)+rT6L{kla2XT&eZXEz% zw62zkvb5vFpIR%4N!>VM?Ws}QA7nrm*vwNP?Rn&2jW%t-Hod-qe%)eZznz2ahpJMn ze!*d*gCi;$s{G2zj6j~&Z?nxjpd_NgN|_HUO7pQxb87e#6Mr+^ZFB1ogh|i_oL`B} zg4fVYlc>>*@Z+~HTmgJ8p={9o8B`>RnhxTm#4`2Z#1DIArSH>3D?zK8L;lK)b6qrT zi0(r{OT3zhl(P=Y8T@2*9ZjDwI4{y*Ty;0hY<|ZNC$t0XfQA;JC|WVSG6i8D(Y^Sm zYRgy$M*;67ilQ5pq~SL76=`^_hm*lv`X>Ve1MUh=k}mUC=q?W7zT0is6m)bfuYaF!#y*PrpQinSSEKzmcxxfo2*jT72F;)~TSabao2`pc8fn}+n z2;2LtT+9sxpK&Dgi=N?8kf# zH>A%oD-yKcWvo1Ux&;?hlAw)x{8d$ukeN2-F5V3w&j;$T?LVfTo;QQe{IE~vFMKLK z&bE5+hf< z>$x!AD>e2D8X{XlpQXC?^Zh0!kOv8$N*ReG)U=J;CRT6NJCMqbN8Q3|BEMxTlJRC+gs zXFQ0So0~Pa@-^51hHDF0c-%I)Kq|d9r}Pkq?PM)qL1-WnaOk4Gm>sb+u`#p9INrLi zLt0Ju*WlUsjihuZ1tDY~iR94`&VEj%99p~uk-^RZQTzZH)@w);ZPasiMfA1L(az-0 za>N$owN{k+^?y)pf#YGU-#rzR@ir-O1TiD;Y$Ev?K#(x?Pf-WvX6ek3R;Y`hf`#KF zt%sh8iA(?-tw{CuJwit)roXRX2fVtTS3(4uv;CVkW(B4Mm_0R{^F!=IOqa9b1paY zlU~q`q2!?_$GykHVP$Lj^7o;Luec=A*{mGixvLA>F^0yyGzpyjopiVEaX zMRotFXuj=v+RdxfG%IC>RX!emDZlXm z`C*(qwB^`9+1AQ8c_Zh>U&GY%#q0RG>+@ysy^ROoTbXv9 z0jPx}TbbRwR#yfM;0||$X3j$@O~1VieAnImY@+rc^ywxL{;{wzLLMQZP)!2>W7^FeD**xasNd~}AiCOVQR(A&@qcc0 zVDLc+mG=OKUeuWg_Za6!ppS;0lB)H+Jfgp!82lL@_0$#l&2wm{`kmw6h<)<-?IDSX zER*Rq7XmQQHHxQ21SJNdl5|Z20H$%*=ZTm5X4h;ka=M<)gi`$P^ZoDdSdm%tL1oic zn?~HGCno8ScA9k2ja!gzINZh%A|WAB=*6E_uO+m;wFTaG*Y{zu+U0=%c{l&-hj{ZH z;zA1V_14fTmkL86MWGD(ECp`CI*hguO?w62Gx*3dX5TH`eb$9K{B=3n;C%}q^yxV@ ztTDH2hw`{|;0tHM0?KgEfbO7zs;;TY)(p4}N)57Z0f}lN4VHnC|7A^ozLye{xeY)L zs>&-WYy-4~4nC%oO0Zm<+D2m6hzQgTeHoWsr^WfGO&e`z|-_t z@?%~Ew=_&8&HpJu{TG7&_g%5@6As!&03y_9A$h@*?Q_V&nBZRGz~z>M@sXJJLw&9+ zOBg}|8~~(R=3W->_qpcf|7R8dE@@9!$y*#Wcirf?%Md7yY{2J`!_YI9Nv5*LToohD z3;50-YHGa3JkJ+-&O?Bh4Y#@s3m(C~W@<*8?rzK9Rft?LPp5UwS5{^#bhA0EEyd$L zrqEv#gm7elMQ|70JIE~MJU-H!92_5VL28!%_Yp?*e&eEfwgO)TUyPTJ1UGrZ8VN`WVc&A!__n~9_Ytns?vOCD62n<*XT>46a6T5=xbX7eGgPTbYf!f*tWjh(2Ut%~xGq^EV(9qiopWoC}b zA$>kr9l9=-$Y#^;V7$=B5j|=H9JIUZ2aHJTNf#ZrH@Qu<>(aB9!!DlPhVf>nsg-)e zSk<82gn)Al)MRYg>*aGd551GW3-Z5?;~!Tc>&jjS{n%O_&T|e`b#JQmAKN=Mjw;bf zfqfns8qhI%=Ig5kla7y4V^09Jz$%U|K+qmWosm0?IOT$Y0FTYxT=kx5uI0w9L zJuYco{GKD-Pni-(OQ-pN@AKckiMA3mwKeDMtw#557T9f{987;jnN$WPlad;D1loRq z#>dm=4wD1myiA^}Qi)u|FXH#B;n>*Vp7MPb7S@Aw2YdrFaxiw@N^j|z1}nJ_!-(+4?_cU*w8f=z?+eOTOp^S0*e{XTF%bcz*CjmfOglNT_Nj+%dSe!%FfonHUsXB?6tuzOAuwKmkU>yeiZ*MTY5LN0zNaC7SR-R zVMi}+SxLdaCU_K3#>$sP5W)c_^PQh;A;A~aD-EP6>Gov{Ehp$Dnk^sf7CpkAKnNZ5 z{C8pfT0w?Szrm~&dy;_K^%EB|pcGt9q}H7HKNdKGt8(4DG)s zqFB9sTmE}1KjE}ZLjMYgW3a`&Hs&j#XPiJSsdf_VbSYxm7nyYm4?e~Ap7A8BapY0| zc%%6LxvTga9fTBZ3~rxzNe+EilT7o7)Rj=ta>T#d3T<)(a!G(B>iR4^eAU6(YH3Wd zsKg{@s65x=uRCEePzyPMJvfmsOc>?%N8lUOo%DHrYZmf%wT~9BQ5H*L%oun_O~*tX zp`np}pE7D`C)SX?^sfdj^7i?^9MF@veFbzo(36|6oAb##? zq|r-!9gaP5b{h5D<6wKyUEI|nBTQ@H@U(%4NuYPu!h?zV5>vQ(~+{QNj7 zFNQFXE7TOJk=C&RP$1lwwt^~-9qevtcr!*cmLqHm3jLoxm1V8x+uq3D~VNQT*a2}(2EZlvn_U&yjJYlIB^dIrx$ro-PpLQT=mp6>7|t+K;nv4dqWXvw^W2ECi}&lJxZR_K zUPk9Ylz}LyL@+TiRhFF;1|Js&oFL{3s;fOCa$oC~{@&pDi^4O!LJiMpEl+7~%+3Qh zCUAFB3wKG9lCY$oP>)-E34XbdV|IMvx4O3e!FT57y3Ru)JY$KSrE6OAlPK`r&s{*{U1Y~qIyfUjEq9dI zyACH-BV-P2@yf@AQ8hPjGBH_I)l!47+x7SNps`Yf3@>pvuXWFhLbaccKDIB%EW$-+ z5l4I?d;SWDWElu!lpTSU*og+bd(IAIegL(1N*-=I)+u`}`8}#@dHMO3me#G=i(eETuWqh?C~SOPobDI$>aOEw zS-=-!5`{d2Ks$DQ$X6u?8}Ktem6m0QMR*ydfYk*ypIh6Qpu`+%mI~akUxPUC*RN4^ zAT|d%ZGH>P?gb)#f&LDiPg=_?x7#FjGQ8cBni|fOph6VUjjOdo#yY>JMvFfx%-=F! zldJ*sMW7d_$fIvI5CN25P%CuqC~Izk2qfl&Pp$8A$aAWj{Pik|L!L%1m}QKepTF3| z-iAAPL892O`tx6?qT(V3%BY1M-?q@@Ly^~Kuc-r8t{Bl6g}Sd9#uijl-D2(imm)5Q zAVowsPDQ+e@Zc%}{QPnVm~?bp%t%#D1OnagD!t(aD0T9tDuCjG)O&xi&5o^d_|^dk z)t@0?+G0}%Z<7-VBRZ|O4FC9nWd^=-EN^&?oxQK;l$CRf*MotdR>-k=LTyBLX=HY` zoJX9DMW=awsEqgA?+A35nVROfoI!uQRQvJp1Itm0bxIx3!^nmao*quza)jR*{W+|_ zNNM9~^Z){ld(JPfBg+ByW80_6q2;$swSTMR*D3srHCtz3?ir@6N`cZu=Ml?W6}z|$ z!y=~N5i_qgC!TAMzn6P{^=_;TA6_0WzCN=w@U|%fS%f-520pQwb!2vtg+`}@}gFQm> zu1J2QpFzKw*i_s-ys#pZaV0^Zjz!I%CV2k%ZuyX8`A(*a^wZNOMHlSDLGKp#F)Z(w zAUSjIC7gaROinvwXe0I)d?y-QSN7VX5Vpza1sPafy~_hR!JEl?RBAl>&8oaUWZUtC#(UtGD1M4XovyE5{k-mRgz*lOMV>dG%j&DFSmbM>u#ad~8!|k{|r|F-8<2 zljgea^YS-dJ_HQugU8%5X+QR5IEp>CKq#WAHheHv`}F+EfW5GqmS&t? zIsh941WEcE`-Fl2pv)K}j3Ig76L@|_*O;EY5$u7h z{L`n>9J_%qinv~-3t9@=?i2;si-DW$>?IL004^sAW~w#su|9ZkY0vi}fCzdxcu!(e zv1XJvJ!1w+^;+W}-+z01*aG|YYmSY+PvCAptJ7g6x;z`8xg(2SNOT=*WU5A@Iyk}&>kd)dLsDc{+LB# zk`5t{C_Mc9Us7%v>Uy{p-JeHdQ!FVjs|%x_p85rHe^qPuhIo8H14SZ*~Gsxkjp|+EOK9 zJ#jbu=V7T@cf{Px2R{8*%oi;$0<@W9h7`O@r@)WdN8!QprY6f#X$I1v>2mPoaI#aM^9bhU@U%&sV?W1R6 zS?LP*Rr3?@@Th?Z#bx8QDVK7TliCS1f$j7}+f3goiFM6?-ANPA9_^UK1cx-j>}X2T z$28JEeMMr3?#RCFQrtcUfC9bUBdNUukAk~M%bzDe-tiid)(ZYt)SiZ(mb6~3`BV^4 z^awM1ufoz>0A{;hC+-IGG|aPC7%vPRN}-T2%o81*alLVQMnbG>ubAH6WG}H%t@)dA zikj4w#bnX3WYFBtfT%za1ZeUdpKKWhS(_8S5PHdR04f!7Hj-v_AiPC>cy<$FvaoVM zh4uR8!k1Tb1SDE34pTL0eZ>mkDqr11o5~j!{i}4vKmBEnC~Dt(^Uc*XdPF0<`&mNR z&4gn11k>+dw+H~RNuHHDQ?tal{1yEA`AcYIp8_}-y*ujsYrhxKgKv5b8CMuTE3vR3 z`*1(fWs;yj?hNaGR!Zo|1yur2m6(bE<$8+%?PtVp^x{ZdbgZL$lk@TVgtsvao!M$P zGukrPFB(vHpi3K)b2r{L)3)@D3nP$J%tGvkJ<(DQG(*_pJer{a1oPpU;XdGX0UM~H z`zO#h&{(oygu}nSR1#BG^@g)4D>HXAmUV!O`deUQVL;mOM*j>^zv}S{X-tY*YcWNu zq>BPo@=6=Ok|DB_NDuUac6RviI_}@aC5q`P+#HoCihP8Y$tZa8)QSt_puau6%_x~k zw5k)C*l&eCD0I@qO8H#G_QGG$jypI2ltYo2c;k>Ls)u{ZQL_NZ3?4m;ZmyZsUO~|T zPFQf2g&h%@rJJx+dHIMZ>}&i&VhVb>VI}3Q0fR|n)Nr6;n;oWw58}-4bK@PwzdR2E z6ftTQ|1ug*hVib!n1p_OGbH>LmIEP9LZ8BG-EUtja6?xO@dD28Gvzbc*llBVT!|~( zen=PvV5U7tw+XKx*#5J>_gs_PAP)Na^+zH#f!!xsuq!B3AClya!5bUV!Lbnd?%i9V zZ)MCo7n$BXfE9J_yOYGq=v4+iV6wt#5Yt~+B~U` z;|_Sm_&pS;Vo~qq^Iu9;oH&RJ1`bw=ceL6Bp*-3i-|DYW`Bn|-H7#a6U7oOX*Q-bq zOtxCU9P@n>aNcjU@$g@~&>A00P>30w8CLK|@PXJ=?)h_dV|D4=-1lm%A!dWEglD~k z!*};qT&Lm)$nu*j0T_0nHV9Q)cbNfhz~G0MVaHaDg2G_XaEGT6sGcHc;D){u#_YxG zWX*p&De+y4<`&3=W%s;gOkV1EWl(<@BU+gGG+z<6luXg1^e@ z`Gx@I4u2YB5;dqP|J{Nf-$75KjZ^Z;=vPaO5i%bdratE8@-88YYA0?BPsEIFH4dq} zqTm08${FeoK5A<&x1Tx?)`pW(e>30Kr3J%&<87mLn-X1sK&U`#=Y9f3fxNHP!(m+< zNI5i5*4WCy;|-`wD)bR*{v1*sWu%TJj7m{K#M-4NCNq&z51G4P&YAqm`zz@!ZA6z| zt=Vl50nDQBgx$op757R#pQQzn@#vR^G&w=zDjy!_GQIa$2aV{4sNj>@;0LrkouH(A z0m1M10Q5~tQJx+irmC2C@-VHRg64Y2Qx2&=c4B$M#nlK~TvA17Cft!_=ftS5509M# zUqL~MnT04LQ@&rY`MGu$;`K@LjRKq;xwmQ}Zyb@JG2hSs(9$efgpAC)OG%lHg)f?D zG^&xq=2%U%&66d_3!M8z|B<10-8L&})O2U~`bEDf%vMHh>PXNM=Xl<Kd2LBcANr&Wxg?RVX>kf_Eo&f=whTK5(xnpVgOz&^?B~>=$ zq-T4+YOA~?(;&1mUqjA;fH1a`l}#ChP%zR3%kOlzzE4zzouAW!qL78f1Ayph0unt? zg3*dk#YHwtzxqGOk@Tg!hA*`(?JZ0Q)f)mSg2B>7G{2+gh5ReEw*?QWxg!ie zF`JxMh;&}p$*kDZ{z$Y`+2q>u z+c5CiW#f<|1JV&;mD3Fp zlU}5en`n=uqU9Cl#Sz-sik%rAo;4UeQe^qw((SbKxGc&75sgQn zg1ORZcVa~el6l=)GXW|gBZa1_Xb<+@p6$Dn4h6OrZocjhS76(CCkE7XM?JDC@=n+j z4W1leG709z7AUJ`jrvJm91S6Vp4WfjBv7^&;_;LGo11i5BNIftaN)h?dO}Q0H%qkj zevGR^r;XJ_%4sMwPf88TZpSVyHoTL!0nGs-f^eRIF_FIpcu((UnW7LP&XMJ6#t8rG z0_LcSinIj8)sQDV@t;z%%OH2?B!p0})5;9woK%^Oc70bJP#uau0~)kD`Ql@P3^6Z9UE<23aA)N8Qc*N;+GOjvvlxC z1(_fiKPjFxZ!EVDU2SvivEmo05%`&9MwytHeD98|t5J`Y01*zl3-s@5jiwB%_6ywi ze(I|ic*YtmC^=81po`RP4*BVQ<)%@Z8G8DkV074Xk z`zT-`X`mrGuJPk2ub{}cG9ZWkCHUR1Y7`rr^87?P-(SCo_0^r51K~vr7Zsoo|8+pj z9?P?AX#WanXB7b)Hp!a@>e0Qs$fsfl?$qJZ<>&{5F`D|?u|vp?DhVQ%dcB6mDe&T* zOFNgfyFS2O0n`FF_mN>N08?E0{3Pgz4M@x?I6?LF zEN}+!r-0WA3ck`0F6%IW1H;=#lG9R}ez=^}6}_@Ef1rwaez0}}QwV@`WD>N1dPS1- zv)aSE#{KYX5Wt4t3Tp@95%?7#?hmGPEBYhU0T*{l=mb#23;DdV4ziG~Hq9s6C&pci z#?x%vgjS9<%UTN5{qod4Y29_N)4u(_FUOnu?Q5Ho@i(gLSIx2TKVpxLuA*TU-Znsl z&OtPpq+g#il7R^=uE#mnGE)o)U^Oe17jG5SEjm5Sp4j=!X9GRLF7W%68C2yH?qAr}F1tJ z;Yk53LRTU})4d#_@;|bSd;OTm#NEQ}8PRXLL@@G+{m&hnSJIT;a2X&(f}N5Va_$-X zuLy4h1qc^;+*B683E?=yxgCfTyA+>ca;ugA|IR&C##MvnWI4`PTY*2?!6fNFat=GD z^`BohB4>PF3R%v2(I1MJ6*})3A!;=uH#YEIBZo}G+Zi<}%y&dukOC=L1sdFD=|V=$ zCAO&5?i%SUjH48OemYBIFDz{eMUT-4Mol}0Ve*zO&2LB-!*F!A*7%KSDk=lHd_dFe zSR;~6O(zFdS_$$`O3IA4@B~Z#m~R700-_KFnA-g;yAQCUBrW@~x$Z23^Eu5myfb^@ z+(dJ3@qr)96Hqy2@f>CWRK{w4YP)vJ*Ra7Q%q<^?-Z4@t&NtktuLn}d-+zp# zDB8nEmb?mo3l&aQ7bLt!%5JR&m5ccAbAskl3;F=28x1{OW|6o!#Q>_)Y4XX@B3WyX z$=OennO!e;clXmt=-H&~3)H4u0o5AXzfbKVzo~P^3W{kz<;z?rUaMlr9{J+ns27NPCCu*o4C1RM)Np9%e23V% zIS9xiKAWuEa!uFQ{~}E?d#2SD}JaB_NZ|j{Fs7Y+96*-6=t_y)D5Eto@`w3eG#6~qmtDP;7ua9 zX2|eklE?0VB5sE?SsFQ2fg!s(J1J1vMBEw9v@6UhT4^|;!7pBiVjxm~2k3 zTJ$_OuaS&cH(6OnRkDSS7ve`TN=WCWi_SKl{2aUWvV;qvO`9 zwU^h6h4Yli55!@1Bg0dQ&KLTWl<8Z2?(_Dl&aL)W54Hlg`~&t%Oqv(w{QUhV0j_lJ zXwdsGqxFdDnQXap2WV*=CP*F;wSbn}^cVK|pCR|>fpGXuA|fL1kDGMXh(VU`RY}k) zhJTyie-GD2wWK%9+43LBZNZvGMW%mVZwz_4YU~QHm{2VMiiq zgvkMc>}8QQq#j|_Np6MSS6gk6mz5Pjc)e)C>{Bpz7ak4=ABls{y1KDOPh7EM2#tWb zTHDwRKg_Ze8$iQp3oC6%6xOg_DW#MBHG#JrP8{=PXqRhxGuR7WSB!)wnjD2$pVC9~ zG}sn?yhyEi%1HQtRMAwQR5*$iz9cW?G&R@|V^E~UAyUnr;{tMFzfs34=>}7_=aw9k z8xjD@Do)Kz9BEiN_i8{~x7q8Zel-}ue*5Z4SL^2N$uj;yqbGcppt&{6DA2=eZ|3*b zf=l8cT5J4Nkr>J|WY1N5^WdHXheyB50i5sq%(q{& z+OY)6vpa#H$Sa9tkvziT0TW5_FM#OY;aF`;S8dB47m)t$`TqSbpdKhOgOHcX*3M3E z%r#&RnK5_DeDPcL0t_??mWKI6{zTQx?k)ZErJY$H5>UL4Jm4DEjqfg^kt*QZTcf~bv}MVUeO|8 z)C*}yeF}=~m2X9riBVdEnIg?qF=cCjA3a9kU_M%tHQ|LdzNfCx{yzt~8i89k*9WKQ zZsrMl`7lO?U6~=NWdZ8!N#|k2LU>uebF!d%tt;_F#4W*5Fh)&8iIv)TA0o-0e~Z+H zY4y08q$P0ffpChIlNY7YxE*RkYCHxtWuE%WGj47Ma$w@`Cw_qnK1PbSnB)_iTpW)d z0dO)l==-h_G&=?dOP-yb)doiI?6|g^@0DZvILZS$wP&+88?$AEqy61D|LFrAiX`HG zO5~0oqP?kQc0ijzBd$akv7(x*9o0Wv&%NwM`H-b+a3;=W{&R;V^4DSG))^OmjIzhU z-o2QvTcJJpD+L^Ywp-Q9AYBna|)6;^XhOuA0VVoJd4DtrDWRzk* zi(fDKcpo_Zn_&^P3IV)?oOd?r=tKUba zo`{Wl=x|id#nPN@2AF?H5mvb~vl9s9EP(93==tf;MW*E0s3cRo+;sfe;Ls2TkTg>Q zkm7SW&)H|<0|B<*9UFDiYc|0G=kIED!t-3RMBOT}aZdTEgx4j`szU8TP~7eW3OU4y z{k$Tp0uS@A07or26ufgIj6244WBcAN=4ouJ_r@9iL;QYzy;|1?2=7h$B)fLc0G!%O zf$u+u{s1SR_{sdcj7M*_$Z*0JDxuZ91BlzTs>*EK#=nc6KOS}5P$NptvbHO7_ux;{ z=1&{5uPN6~p1d47{^tn@_;Bi?tV*;wqVEv!Kje!nuuBCq!w^4;wXV%w7aYM?2DLm? z1MU{bW*nq8Tp9`gB;wst`4uDa2RGDuj%xiyaIsC`yVFHB3E1e4*rz2w*;`Lnc#d}B zg1-?2A4>oF^$YD|;0&}-X#;m}+v*2q3IBWXy71^(pf7DW%32y2u>$4LpDSB7X8EbJNUCgHNRHu9I*yxz|S$BZ4_U zi~rW4-wpdZdQZdV^hw^Q6u3~b+?N-dH~I0EiKBe`x~{2wR$xz}PnP@seL~7xRWeL3 z7{i?Yp0DNjx6t_+&z;$73xL9JIoou`0O%ypc`*`LW?4-3B@KK4tlo{)6p@>?Fw8S&sic zmellZ+@S$J$-SFl_rACng2^q+VX$wXNt9Hv4O=!ei)_iQsl}&5%EH&JL*4)VlF!{A zCWLy1R%X7x{q9vrS5;L3hI~U^;z@g4fgKpNTYw@Dd-ACI=!J=&!^^Y6aM2*&-7-3R zP(J}a!`N>vzcHvZjwAks>39oLyMf}r_(W0Rh#14dwlee~aVVvgI=2x16{B1F#S4YA zxKd&6BVrmL@%6w{i6er>NosV1>W+;4)MhC1e^g%8TLa3aT+gvuOc>IB94?YMDkXG5 zUKt#4d>gzO9gUT!V4BLe;Zpeq@$WYlx!=9?Z!UpeL%$3wqgp-YFDxIYkRCsp3p$WL z4{trfsdw|t&(I|En3*rKG3l(as+ait`DL0leVnpSH|P`HCToW*G1jluZb>-%`m>Uf z71yY$u!nqYzhm`fL(sMWPv(ElA%O^qPu(Ei%E*m&Gf*|;q@?nU>>`-m?u*ku)Jq)V z=!OTlVQ^>OS|DOp^=)%bGm0~woUPQm%|Tq~p3=l)G~tjb6pOH=>}QRI#n4Kn*f@UZ z0Ka5PzHX0zWD3)*YXOpVQJX;`wlAGHfA8IFDTem^1UM2f8IMSnF@ohiV*(pxdO8RQ zt@j%6!4<2okI-pIyPa$-zDui)gS#BBIPnOhZu}8vSFDLav3uM1+;5FQf$H6S3 z-| zEUej?(TOYd(A561zK0;6Xt2r8`0sGk5`$3h)UG(cpFC`_-{j8lRPjw?tVlVoHA zYrfCPz<6p_+Tutk=G)M~$oC&g{Asx*jo~pFHKuw(3v%Q}<9q{Rc=U75f^XprSBMpp z!kMqHpFp16ofmmXUHGg>jZs(<{=ExB?Spwp*h_3b=6F9|3ARy`0d^;GeYvPKC^bl2CH z5q2TS89zwf5-T&yb!O&k5_9bp{HcUaWKwSpG+v^_u%3L~_(rV2*8Plo$)DDuLmJ@J zkiG|u^W3yb1$N*a{B)z}5ajd70@00uj<6T2%>AU>mkZ?@&Pp;b=1z<$#0iz~LJR7( z&OYXK{-Af;tja=Y>2H3OS40QxS?BGl~AiMfnM;L7;);X_24tUrJHC z?5~B3fp0haiivwdE_^fO-gMnLB%lkub1gO7_*SiWER6S-W8rtEX)yY5yuO0iujn0e zQ#d#V>6MPX=6FAK^S2r$Pw9 zl!?YMpG0RXYB9~B2<;LQwMalVnZx*OCIuI0e;z@!rYjY^s-_Yio}7uY(@#x)E^xVj zotv0u!j;AQuTt{!6p@sv)Oz%T)k`SdVWs z?T)DS3=A!Z-Fb!Uvk_4!&zQhCY6mjN8X5q60cE-ZEBSfd0M0P84=Aw+%lDuTBR2Zj z#+&D-LK;ouz6N&+IaU2PL$BnmbIFTX7skHZJm(Nf%C)eYzULrh`lQI8%R#H3Ua-@8 zI>_>=p4J&kqqp{Jnn-zoCg3=<+)Qs@LHOyvK-`J#7IpE8SzjpTja1}NAh(QtNi2%n z`NYACe%iPUTyS`!3OOkLTfm%!^Fpo^YFjMtG6A*S>9vHH&nz?r8p=i|rojj~FsG>6IE z#fpx@13vl&aaV!0K0@3MwJOz$J@oL>$w>Gl;=0)Dfw$JVbhXhN;o-&Y{JvnTW7+cS zX%mB*Pz@Mu+i{=%F@0xvod&)C>f#OS0v5X$c1+ZO6F2+h|6}Ssz^RVk_whm{J3Cus zZ>Q`n$;?Q$ka6t2N3sc(l}$QF5|X`TCgb45!LhfDW3OZUUp}AD_xk;>tGK%2I=s*8 z^*r};-}m!8JqvL!(llnMd_T1qzG)L8`oXH0@|pnDQT4EdjP>igqgOIY+u#>wC|%)Y zcD*+9FE2oI(U~@M=Up#ldo8ZK@hMy{@K z_cM1ucs9o^cYm|3{Ooye_VmL5kBBCLS-h1o)Jvwy@F4j9MiN+2_r0_w`*5_Y83x7V z(L`n!22>rK%@;_?m2K#j>R$(E3JDQS;PAcdRue zh8%igU5q6KuM<*Pb{_hiNMs;#K2}4CO^q9rqHi(Ss%qcor3N4k=$58P>}^YBiwAu2 z27~89UWtNpMV>GNliGjt5v3iRjBz{M2)QKjm8*Uc)7bADuOF8#zr40KM<-9dpI!47#NjN)$ zwQtE*PePVQSbEtvCv8SRTI9FZVVR9C=6=#}(~B(%$}t2fuH%cSt7pN#A?~>+-ldoe z7`>19oa_JAVHNc@ktUqmPt~}2mPJJMlKXA!dRJG94S4->pUz?Pp|nw9&S+(8cinZO zgaQ69qW3qu7SbEaz~%v4X)Qh`&b&ThuU(w7MYn~uK=8F2lHh|4IM@JeedYBPn7hfpbI|QiCYRfqM)%|pbmR2&C@=&)k>!#&ow+i%Qg6OH=0^9zCi5t_s)O zbR(aB|E)$bCQDCkcRQ^1x!S#06=9;BM;njH)Y)SMwEj_9)u-szC3dXs*mSEzU*DGB zt8Na}SuWrK0vT9eQb|vpkTGW(@>t9|6J;(I-C;TAI{8koRQQoZ7<_|4_T+IUykd2? zDDCX+lBhO5tFp{{f^9`p8#}w~7n<%Nejd5Mdh1hN27Aa89{R5!E#TFKzW={u)^)6= zAGfM7FoJg6SxTmk`t=iMdvQ^A!s!hr9NH;d%HAL_4=TJ978qq1MpR0stDrVi2|``y zJL<3y%f2Dz4DLcKHf7bHlJFGv$D=DK*SIup^%O5GsSG?FU`GLE^+z=@=GOsu?>}!y z0(R8u2BX>Zjk-joIjqLJ1do*^cZjAnvWAgM?^)Y_c3O(TQnX7YpTHo>9JoNRhKOzS zO&92BWrM=!pWd3&$~?;uH!0bNm~2T1>dF zR&#@OH|4=&G^;PXd7M=F@$>g~KT(2|k3FkQb$gLNBwTiLTtjlNu*>1+2XhlP!8+f? zf=ljWY)_+!(xyC{o95(o_q za5XSBY&cT`2&m&@3&yx9aCEDH)cZx0_@LY@n(^bYraKmAmQzly2lh){L+f2~PENrm z#G?PUX00%P{K3NBI=}N)mA4l;$6wwuS(_)(~Zn$s3-mypEDA}zQ1&5Vt*;zycnAeP30(L=Z?pAAZMxYOOHk6lel zUfidz*QnR;^kxXazNAPn&teuKPQHA!fv?|&c5RB%jXSM30(ceZkwP%rG7w%}SAxLVmy+FRdpJgJqNMod&pfFSUbU5{A$Y>8&=pHbzA=Dq)-)R?4B z&;1m_)!}OC=4Q!8UqK>yLA&kUxmRs-`PwiXpWli|jkM;YI*_KkQ7tGO*Quy{xvNM>hN|8t!ZrR6?8R* zwynGg`}qLh(3DDmFL@mR7Ff#X_lS9aCN`yX05=4KmmS$Za<>=kl=`yBesqAfoBB{A zJfCqOzldZ6&fJDkj;ckvv4d3ll?ANhfCT%OLaQWEC~~Ioy!z`R~==gM;AXT^wc@rRRi^R-SmA?#&XEGmF=# zCkS(ZyX-!e4mk+N6uf;iF#&a`<{38Bz`0%u@UK0mbS@-I$Egc@h;s2oM|Y+6JYmWU zTntC_R5K<7ty+ZU<}ph49ft&`)LYps(;c%qNp-@vu;UH;6tq!6z5lBzrt)xR3k>cT z>e78FzIU`$Y40+&+hpP@B}MPH5P>+C{!|kQ&l0(D4eRD4Ny;|fXXRNtSY?Cwr#;K_ zasA->YDZ@qCxAL*6_E?Z8sYcU*ED2X(q1#rQW0<{o`QU}G0dRUw9>;CoK%XZ`}#ao zV=lDUyO#EG!`FNDGs|*i!9loR9~A2a4^xzlw#)>h00TWj|5J&C?leEB{v%Gee{l5A zY1W0$@iLGM?5Jc~CV!J?*-gWNAY|>-JZV9U|F!{lq`sOMM(M*<?&Y zE1l#fuE-Y>YNj_}V>fZN;+R5k3&@3oiPM3Y_1#ng0I@xnro*K#|8f=^{K=N^ehcme zkl9eB8a^8r+-hA9R<-h)1g3JKPG3r!lXG8`K<({2e{OA@HHU*+$s;T)*}k?zhSZ}- zQGa*?40*8A&graC`fl8ObTQWe2RJ2k~N{q42(;^hAeCms6RuHAex$5slZvly?=MQj@Ol_!zz z)s{2b@R=BXs0n_~#bCL(BI7i9#O1^F4jx>Uk^kR|h_6E`?VGCxB}0Gv;Zxe1E7M&n zh7)A5I}^y1E{MhBNpw-ZQ7=ob7()+G1LeLy2N0K=+!7PAYJYmK3V2!jW9kc59TUCu5 z8t?pd(Q0YG^I+coUB>#e_77k2z)oIJx68u5z9{;d_SD|~IT4W|M2y~4jv%PHzW$9~ zQP8&+k(S2xnXJix#bW-mZ>p6i4Z_)|BMO%+p&LJPqcI?`;`!XpFWe!0@q)CIb{a9U~F;FqWv zVi{Q-1h&|4YQNWjL7|QoldX&d_wa6l<^g5yuH|2ZH=M?swpy|dz>c7WU+l;PBm9~> zna}b~@S>jN-&a>SPF)gUvM@RnxivRvj9-JL4U480C%pRhX4y;NJ05cA^l#0mbhQmt zITQWTG8>J!4-}^wXTaIs!Fu4#`TKMoZeK%)5B&dxclsRZ?=Ob9~! zr=VfHc|@~;pJp(3rN4Ob3zB$qyg7aBC^0Y~sK@;iEq#}_S-_dWhnx(KysV<~P~x;; zY?2Kbo`$yOHL!ql_6*a=`SPPVkVC3ZUy4mPm#D%=P?2k?x*%To_(Xv<9ioqfwLrjN z!GErHja1X1mG1H0n#)p}NU%o8o=;6lkD|s|R8-~(U}Op_v5Ru5*T>$EA0xM39j6UpN6}mm<@Uy@Shb2&DOPRtjA7 zr?XO>z_XrdJLP-xIQ4VNXJhXDBl_~)m6EIW%Dhmf4x!jCzUu{yXxEm+0{YG1^Jfda z%ZEC56xz;%(!hdPLCqT|NP?FVF4|`sUQ$GZ^5$Oh9QVPOqHHK5?b(+GDaxL1_w~m^ z+$ea7C&Xc(+S8|AyyBKT4*maf_MNDWem#B?%e9ARXBst5M&{{} zi(Dj32N@Z6hYl!xzEWvc-o;rJs5QiA-PYEl029Q5@Mn)Fen1Jga?B#wKBT&g@e`ZT zE&Yw9_>?vP+Evnc5~l^bRi26;%`{el`Jp}?H%gCxoNASJFRRl?92}Xj>v9JKV8KaQ zE=5@^7u(5oWO~!PNG+N7uSx`-vFlMR=2OxVrp``EHW-Tih+Rpmar{?E+;EQ`72styF zIgM8xTFYtu=a>kI$B&{Z?j}_`I!j8Wi}{BH1X%7hEv|L8KPEkAX(n4p#19G;W-qI_ z_%IF1YRkW&l)Qj1K(*Rdd_Hb2eG?+LFP;92aMf>d)Z(YhD~de76+PPSb_Ztdkbg*E z|KA(D6oY~ps26bl@xHpTve9oEngA(gn4g(}c#Rxm^g29Ps22bR2BAk13L>fSB3G(i zWe@J9?FJIPWD1RUiJ#Z$7|mn=dK?1C7}U%AcGTb68xuPYmc#)RFhJWzBN9zzH2<$04SHj z(#j-d5ww?MRar8Fc+rIyg84hJHT)G&Quf@14lDU_||Pr8Bx!8UoJBinZ)AIff12 zIaI5KgfJBuG<%YMx(=7yjtX_jTW1RmiG=zgnM@zu zjaWN>asfDaYkH_+i!8HjRL^W6%fZQIzP9BY%RBuJt44+gc;j8ct8?-Omz}BAP{O{S z>9T^LL`#y{g~*-#^7Xg7%7Q$u9h#Z&?n5Mlqy*xRgYYXb;Dg`U`Jl|07*MznP$NGp zHBdrAc$UdG9=m{$3`igVg&E}bn2^a7Tre)Gc;yH8J{CjFWP-s#yJpI$4SMLA8oV^y z7^w}cmBKc}|9%^V)m&3jyrr@@+sEggIvrwwcaLhObP`L6F8%iDTU@c}0hZ-eaI3EU z$)~yid@zI1nj)WqmLsvo@Iy~YzB?)6S5FWVhvIFt-o2xvr(ol!1(XQ!@}#yrw|Tn; zZi5{E8)Xws9il-mMahxjz>?v>p5fB=v)n7&ekAOFM6F-G{~*KYh!9-IYJe_2N2=7s z70)ksAwkUar%@zS%re?!_#K(*b;arO?R}rH$0>Pp$(d2LEq{ey5G<>Tuh=VdFxMPd zqdr{I=bp1%)O!pPUT=1XEstbQiRi^#pCG*f<8;y~ir8Ch#mcsxbs?ZzYwS$ge2#g* zoflhi?+@%jn_^_$pul678AXw4P-56Qz5e7;uk2_d#qZ3h-j~M<1ETrv2TOp7?44W+ zN@|nRYJ46$&8RKs)B>92=I;TUjLhu(iuy>y&5Kp2NUGInX7xKFvxTMMj=pa(*ItyE z=x~#)u40W>MgqaX)FlS|DVIjT47nBpndVhr7rO#(oHehbc=UR7(ZXFIVG&4SHFR>ln3}hD?bSpHZW`FAhfu-2z zS5QT-0z=jhYSu<$-t}1y)rv4vz+jVqy@3=0J5`hmg^Bjh#B(;pO(jDUf9=~%{9L>z z*%(;X2m(AVC~!SiI^AoWLL*kv#z@VC`SEf7z{n>uGGMb41wtEl9)nFwYPb3khyA zD&W>adfl!1pU%i6sdnq{H;TVJY#^#h@5Lxcm+_aV_3yZ~Wr*HPwEpO{_Ec=)_YI(g z2Z_%f1J#V>IW0Ukgg(5J7do4)T@j2b6c_p3;M9Wg+*`XgbE#myh16_MMb?YIaW;B9 z-5l%``dZAj`I6^O$o_4F^znqvp}JOL5@49pFGB%`Q&gUmHuiYM(_bK0s;{CW8q}oo z8c|z~M>T%^SrQi)bP{Q~#RoVj+`u#~3d@mZ-s>T$p2G?_ zRM5_Zn|2rk&speLES>+YEkVTV62SiI9^q=1VD}%3N%fToUS$Jvyk^rcq9^Z?^2g9i z?4)4muSicj!&-L=Y;HhQ@2+qnV@Nt!`YS3Yrp}XUiD=RO5qxYeLY(l9#9{^T*m^wF z6BU7iQa+eSQd1Ki81S{N+_^fHdzHaqfn5oG`XIyjn|R1sr*I;(fBNq5J%Ur|dACnd z-L@b#STCkILmr7)8;g;~l^l~sY)ArkQCzyk8TY*EJHepcC&rVKGnlLAaUh`ff@Pi| zOJ*tpq&g)Av7E`k_V{N|CTV1BIM)5p;kBBMK)QIyfearSxYVY_qQd1Y2P?M;oTMY5^G}0%_Pg&?3?)Wba z%S}z7j;-7x16~|Z^;421syq{e02U~BwLo7UX3CMC#fcn02vMR&pi)=&+OM_+{F6#7 z2qfeVwFZ;?K1qAsJeEi94&b+3hSbS0P{w>Ehg$-hm%W2MJ6H)x!q3OdzAfG3&Xuax zZ@b#Nyuaphk8Ou*u*;ICL;Fo%DY!c*MyGs0JONv{Xy$8=_za zfxj75S&84NO}eQ73*~wzNiF#ahXM=hHK`~RIVD}#q2%Rr3|u-sCNG8zKI)a|@KCwS zFr!KMZ&k}6KtOuV<CFH{UZH;anrGaRdLQ9wWdXt+$j%J7U^nB+XBwAa{mofs}-h&)5U05 z4j;!BUR0dYr{22pZ@Zwf@y@i+R|6hUed5JG`*~U~F(dPXSrcjR0=4m58_})1_;Zn& zlTpxInf08j6NI(bc5uMS@XbW?bphPaQD8kIp>^2GG-cE2#C-t{l?B#-QYUA`875lHRXB?|VEoQ+XDZ1*Y z+#_cLI*VtIin_Dih53@|{0yjSOX9-f}+sQF}y#q)z6 zIrisq!P=o7#ecB7g&06o-yd%Pifz!q?zd{5>xyNrUi3TYEj4^_H&dlpe+d?Peh&bK zy9Bx!L^;zk`hRRVx}Vm0?OyW|bIExZI2Vp6L75h@0B2JP8emJ_Wxgs8jb06G+F8IL zho%AsmM%T&`^!UiMM;_tIl?f=smZwEaaAANDAeV$O?QvVX+I(O#mht2jisK)DHgP4 zQ1pORF=Z_+S+X_G*X6)H5V$%L%>toLF7;66uto8dILw{D#7K7J_`CW#0=i5Uo*YXA zXRg)NM)}9AJhq)+o>URcW@s`XY5)TXX3e2(56_6dPm9a5Q=3eg0!s6vDlEgKY49jG z>3sC2uO?7|sIOK8rSn_^Fxy1_NsV&9Pm8q=kIstIePZsQa)|2$3mYcQCVc9nhaf?0 zRb(zGc~Trjg;>?+4;X5oP!~9?{(gty8rMrMeHOuv#$OOkuvMw|^~cRAX^Lb$O7(~O z`8s2ICzOU*( zWCpW$-DGlJE6GLOW8Iln7e?A#TD}KkGUvs zRVy{NL9;a)Ra&yGBC;2D3ViFl=7Bjhb>_uI&}FT~my%l2H@L0-Ilw!I92xtCLliz$T!PvGnCYViEd4SB_IVnVxZNOh(lRr43-M1% zN&5fO%lohI<%45lQOd#|EMDUspb|zkU%Fzvd&a!49kY{%^b)~);zfzfHmE|ZY*llY zVwe?cE9Ds=M*z9^S|oOZ*Q!DsC{n-)H!n{3Vtl{ee)NRAc z?)>8Qv65=+rD9!hfN=rTQt^WiWNT&&zez+`2p^|TSK{~^K|`C_{iLz#8^lQtqcG#* z=~LX8q$jti;RS9Cc@D6jBLnxCUuE8=GU+&`s-6tTp53RvKR;ERT;=1n7h5FT6~%Az zd$4~eKJ-i&tlXYIpFn;$ZcJ>s9Q8Una61{g3Fqj!&qVin;4DEMtD^?^cL|T38(^bZ z;4J45gqRAi>2Sls-R;VC$U7WyHJE;#0fBf3qb$;9SX|D#U@OvMV53V){_`4ysK)u~ z8r`_IQ@~~Tiz_~}CW+Uo1 z&(M0lF6S{nbssb?$-mT|)yikSNH!ufX>9?qXx*Ec zK8vxWA#;m$m}4k?6yUnuE@Vy6eh0Bd6IW;DpiF0zl8QGenb&vBXF-nto+QR~nrce* zd*DA%18gG?GE52TO5}A+n#^187a25`U}RpHJQag{8|BI6yyf^W!R8HyUccm#!=wA2 z#bWBS^E@P@f7%_5kX2n&%JN7r2(ef2eDJDDq)bFz-c)@_Ws--EH=-!T{=_&&UQ8hj z_ANp`<2jhjS)VbMmKM39`t>5$LA7WYl2Ebh{#G}YjKhX4cEl@4CgRE6IvNXmm&$N? zvqQYJqIdttd_A7!)#Xi^uiyV}Z1W=+>(RhXsrCyIvZ5oPBt98V<)Dnzl$SJ#BwH{z zX92!Th*_h6kSW5p$ga-sk|FkWrY72l@1n(&$K!P534poa0KcvjJwL!)$>GdCMM8kx zeW`+th}e7yahY_LtPclIdPE3E?{Ll zl)}$9nL~cBQ}k3g$LlwQ0Z0MoY-w>Sxc$wS)E~6z6xMqoz`IDdTU=gzP^u zzvx1&ul<9E4m7~ru&L)bXC)>KGCx zW<-$gT$o5dU&uvz6Zb)=%Vz;(rPstoi_ny>|EZmslYJy3p*8!jI%wJA!Vy^ZhP-oD z(jEhR_d3AgE#PK#D`Lv%K{+!#itIU9!UMP364?9HF-5tn!V5hrv#{hO(C zY1gJR0A@wEDrqw~h30Cmgc6X`E-(3({EypA`UeJg+T&Xhlf?8DeDrTxE+07orv%~ZpooZ9 z?C?Bmz}eZ&9hoHX2sDu~-PX)!Mj-#Ezukpd-78uF?XfO?Xcqh(nwR1xb+e{=&X*1Y z{H0(^Z%SRd5eD+CfuMl(9T5CGLwfLhn zG8MysYNR=I>v9&+WK=@A%jC(6qX}*-V0`RV z4B|WXIol;5giutU6gYE{s*egi%JY+c!hvMDzf6^)(OGODs$a5r@-3>^RC>UisNUpL z3z6=1?z{$3;c#On@TZ{O$a>#4IgQ%ch;dR$>E&+W;}Z!Ai;j-Fj+zT7zGPLFFk>@N2|@)Z05c(~rznTjEw022$WJ?@%c z8RkHmdS}Y?834SNQOBE~a2g+=jFOZCCLqh_vvV#AaI&o<>sBQ zwT?_q^md2w8`cCP9|Ot_U4E4*7IH|CpgADD+g}NI#N|vhCE+de;N{h9S@(C<8)AFq zm)L6o{wZ$A#hJ40hy@derfgl~&Bc6CVN?Dw`wmehcsD6QDtDsG@5!A3ZZ!&P)SOW+z?|NJI=?Du< z_rr&%9p+HOIq$B|FQiYwaaRn2r{83+0v)&Xm zsWno%9ZM&HK1%pTL_6~g4I@EhI?nd8?!BJkX~Wq z%|AbjOY;u#L0cETLj;?pZZA9Baw=VYUzQ8vwNN3x>-W~U?9DS`M3CH^%gLw-W{IRB z$L_7PVF;#Vtj+o`v3g-&Sw!RveOb)gOnM_SlR4< z-!ab@y|5|3%~Pe$tr!#_UZPUdGF!w$@*P=w zT$quWrsLeg=&V%vf;sv~wHvE6;k{-3jxGHggT8}T=dCtATO$*#a$e5$77hXr&j)7z z7NdT}9$Fbfzf9FD0hGd%{|H=4yU)&eRAc>cwCpqCmgoXc{pK>| zH>EL)5pQ)~j8#9Xa2EAS{DwsYG0&eImPj$S*8p!Yh?$F=7At{r=fqBElBpDltS zIqWAV0fb=Ch7?i4rV7gYONwF5fLP0+nJovW_{C|_`Bv!3@xdYKM`+*7@B|>0WY15f z&d=@SSjiLi{-8p`tT`RNQimhK7G(-?;VYIW~+N$ z`&HGenK*Af>LW}_ETw$(q}@2ZI#|+T0BK-i29rr|-Pp^;xRTdxG=#yOsfq0~!6}5f zy2aE_(7&^2octce{q{}j@)ND5J-TLMckEUxVheLiLEeoNJDO2^H{>|ui zZ>k8)%00d<*v3D$72DT3w-@Q@b$GO!b+y;pu^N; zhU51#zGO8!u5`75W1y!SbBj%4eDi*{gjq&iXaG8YwlPp@MCctnTv~qa4xgZ)vysbo zH<8@cgf_>40X)(L4@GE zVZMx?h5Noj1-Gsij-(}8)6zL^ypVp8TDq+I@bh?$La}M#$~Woi(U=~F&-daTsb%oaVGm7fyU|xWwcw+@6sH64OJlnvp{FN5I_~i1I!E}pk+W?QZ%U!oV79UXCL1LFGlV(<%YeRuErs-%! z%zt+jRhzi%eyV=xnp zxRw=XUo$yhCsHxy#=VH1Gow6>qUX|3oYuD(0oJ!Xg@x2gO7s+Kn2^%DtlZSMfckrb zuJ<6MiW9=oeDCGl9XtiUB>cB5PP|aMhB9kl#)eu=_$)T}FlX6-$?*xy_Tym1>)r4-Vy3wp;b->HfB}8r=1zhB|W~F>= zBPFI};PgQ7K+~L)RXH+4u`NA&3plx}mPXXNY6dS2{4iV3r&@NugJjxtP%UO?W>iqu zGA3knw=Q5EC(6Zb?zawzKZ^JcsXQBwC1S1dmM+CszEW@-nfLFnbSj+bJBBLwn4Rf! z-Q&umt|#ipzM#P`ju6qdwMwQ`|U;5X@4 zhPTZ+ANlQB7zZv9vhAlc%-Qv(Mn|WJ=6jr_0d~!q84-i)EA-!+)TNh@^3m8PGr&3b zgPEj~l4O*7=ak-u#fqnDOPf093{X35Ye z>KHQOHQ3E_U;Wy88Gn`4ySvebTs(F!5?^*Mukgz*n=xPLrL>+*zQkd0pzs))nf(&d04*aQ?48t2 z$=B946_Jl3$oTmAN04$c?pbXYeaIr(#(<2`R2%b<3r+BML;S<308D))(k{6#;g%CU4JN+MfEnsXl!4 zuNMEd29jX0QC%ZPM&^74bN=!;=Ipe)f_^*CTwbR>w1xo=eXpf*7w6Z%0Gpx?ovH4^ znt8>0jrrRR`n*(NZeCT33e0$=Iq!mUdMLJg0c=&8r!mK?bL>ibx(xO2=A}#ucks_{ zXjCn@!Nw-JesEF#5ETiwjTMi!RaF}LB=S29^u(lmtj~aci6EW5;4a%35ffL2mnP(1 zqGG!i4AUY(ds;&xd}FPlhJSDi#9iS+=%<9HzS0-N-ngr2&rk>o#z=wNQ7R{U2iz_i zniWEF@suAc0psKIfWd!$2|guAolpR!%iWl%&RITXYGKxbRA~^RXEvo>(2p+~qwX^> zErXvw1$;|kV^NaDX*Khdd*HAiLx&I);kz?!alzWCqJpW*F4zzsUK?oDOjhPepnPk* zHRJ!HdHVs~3eK({4!XYa`BV*~?)u|wRlHgQLX@u~U;j*gV>$De*FLs!YQ$nwL{LYSRZBwZ2^=AADT$0 zPM|QNjO*$0q^m2!F@$_2Me&?O|2z;|3(^{2kUAS)Xb6>{+kLD=L1?2}|H#`6t`Ob8869O7a zoH>aUcsKG5N?AOq=`a~^rf%_WmDQ`H^sBhX+rD3&u zVwNXYtlw}tG5Lo8h;$n}*t1C<(3u`HI!fhnN)iyzLB8!fnTx@GFD-pw!zC@Ze_CV$ z8qt&s_0PKVuEFREz6orlL0* z-dVK%Nw?F|DT%T&>wxsqNJ@Ae+yV^YhX+mFz)Zz_dCu4ZG9~yAVIo{sJV)NXzZ))| z%)^G8xvQn8H?}8x!+yQ6tM?a<%c~jxmjqnY8 z*5c7`1A#3VEdH)jtrTV4mWo=KNly3v7%k(YHH_HMAyzxT+~6Umc{LnPp-%J$?izU2 zu43X`$gF^Rq=5tr?2}dDnWM~<1YO9U?nB-PWn{ZUl5{l66QJUf#&pxCVX4ax1+q`y zf=6qODtoVGCmwX(316NTq~C|+nN*pZ@3x~I+IiY`$xsmWmzjBwd4 zl0AJNdX8>oPw(6NLtpM1E1Wf8Iq|rJ7xV-wnABY4Qgu8QDiy+{=<0H(W7Z=~OZ77c zdx2H9uO*NP4y6MdhQP~;CR50NdYLDOy#0A~jZMT#0 zyMx(hDW~+Js@$<%i=7L*ZVMOf(iEuj$H#V3k3r});rTuM7g22YL2(yS;oj_!c{?F+ zqSWdYqQu&WS`nXTd5E_6_#cQB`jZ-6dhLr;b)l*IA)ICRxwEh@Xq+8cERpUL=f9H2 zPn9+?K3QDzj$%*xBu2;^igpgL2Yg?&O-Dj=&;s z1CJ{m^L4S89hh;jR>-YYthf1K5tE)l~LI`=4` z#N-wicJaWJjCW?u?dMa(TA@e6&RY^uD!#50X=NK=%^`3egxY@!Ju94T+6ZCfR5S?; z+{f7SC2ooP<@zH0U}S#8!u4>+W2(3w;9u^gR43dA7Co|)?`7Yg^OP+rQ|SMBNWHr9 zHO#?06dp z?ja=HczMAGvbqF`*?#x>AlzQZU{aXYQm^*ROD@VJ;HOyox2`1Sl}1f7^eAC_rbRQg zJeLLxgFxxLa`TJO%M0oRP+3*mRW1`Q{L_wky?-UB()AS$+)}qVC4-Kc4V{Zl!QPzu zl=~VQ!qoRuwMev+qLy$#UYA1rNqZY={`z2aJv3po<5JwUMzQ3u@TC$A)Ib)_s}|oZv4b&c{?kJqzwY zG|9-w#N)oF(6-RdfGRhA{TdPSvtC*-cuRA|MI(8z3LFhpJ|@!Ik_|5}ANPaKc+hE4 z2&FS?p7%AiFtc$8dbe<9>}m1AKIJmZ%*4vj+*tmP+lT@mbx&2UMXPD#f>Ap}BkFh) zm;2e55tfI5@ohhr2F(w2@yJ|+97PmYoL&0rQ7rpIO%&d8=BT79cf0jx{l)*oWRZ%y z8V_)2Y9-?_rJ|A!LXvc8(=F-l1u4%O&&s!0#-L61Y|(^L95-h9+k7 zJG&I%Iy_2GP=3I!$1OeET4aJgn>4QUus5k`=6*lhCZu`9EU5@u<}l|=n0mi$zM3u2 zjTnp@o|RV37Y`08E8enh?DkBE#{RE{1M65kEq1kL^CEL!44o?rUaDFLbXuqepTq@h z>ifARvEtJIT!8B4r;N-N#HGZ!|$uPPd7oV>+uhn z)K0#hsUni9i1LmgGi?qE({*pIZ}l>vkA3a1FX~e$S&}l3MeIs^f6ir`oPgbeKNGK| z^#u*4)GKzysEzNXeBhlc+lUefa2V1p@Z*~LM;sKIa~YEGOCj8F^K$F0?z6pLcVt^! z$zqQ!GoMK#(788Yoh7JyiqB0+(XoIn07EhPa@&6D-+COm0DY>|5vvR&sq&WjIPCdH zXN0ggsLZ%@}qLa5K2PK5TIP5EmnqpZ31~v6Mdx2Vn24uWxXohQn-(#?umf)DxXDIqHM% z6zhLNpc6GqjV(7PseqX)b4wlV!{v4KzPH9T)^bt8-iW$ghoYP^&hD1xHBMCJ?ya)9 z2^!D-PSXMIp#$>bh47QUecD^wNt4RS7M9b|v&hmK^j=z`+Y`s3Y(EyJF|CV=Cp*uv zjT6IP2U-7LGVmjt`bU)8D9=G5B>C?>V%CDvyj*=Sm$=Sd=`+2~=UB7+`)$*VP-YrH zvBb!`U2Z~wH*z`{cav^fsjM*B@4+xbn=Th+Tv4Q-2pDiBRG@U3Uu z03Gp#;m0UH0C?!riovihgxc=$j3RV5r6@LXcpDg zbk~a(Nd#?1-Z^v0(4cot2s>CflT7u<@Ow~UBT>Hn698psCV1gjvxQz~wG`BlYFZEFYZs{tO)c*{%; z?L^SZrrB)nx?NH@RR6>a(;xuK%9EC-fj~loZ-s?WfCp?(<%G6;Wsi3cPuW`dz1w9! z_m>pfs90z8Yft}&K`*$r!^s4y{}6?}v^{nSpP2!`hZLuG@8{B{5wm7(Z0DV@o;>6o z1$h{GT(s=fNialn@i!qSkP=N>z{X?!>f4bE_Z7s58UnCGL!TI06K@|J$eb)K*%71N zxxBoANCf7}(T3sE(oHaG`LqyolFuj9Ufzu-+}B7*+D#9=ECReHoFA=KYCL~7%4^yf z^g$K!=a;phkdU+oBE%4+8G72K^vm_~eVWj{ryAN?JL#cEoab|S7u3xc;b1u<)R-Z3 z-G-WGA$Q-NW06{W_m@9Pirhp*5EgVukf)z}|Yn6NY85h9>6S`~OtAjVw$S_mkwlY&RT$ zVRlKJ+h-TV9qe?3k>3C$yG}&08z?u&QQPxk4UYaES1HgTrD5J0mGUvDAejaK$M@CB zkvzp+zGMy9&E5(c3yvM!?sBt&?J;qWg@=c z=AE=Ehy4pSZqvcO>51V8SnYqE65VUXZ9w=&{ip;`bxpG{=~%QKzQ7yohm@)JL4IYm42= zGPYV#R+EDfJ#SB0TR9x%*w>k-N|Ns2GmJiP5 zC)z-db9~K9)nst7BZRBB1D$wAZi#w$6H`Z8?X%Fe*XF_qcV-g;}EpxOumEx^QSC)>;}6Td@3M$Gp$%` zY&7->V>a-%CNfC<>A^I2q^i@LE>tFg+JZr9_d!Qt2RpeKWiTDXJB^ z$0`HZMJ>QNss_>xIOwC1o)XWgjvO@Rnh6W9ir52cGLphz&Jl$7$j7!Vu2*R+oe zUFu)WBac<~+mM=lXo25X_>_&hFwn>IWL&sK{7^y;+t^xA(wH3f%Ph;Z4@L$+uoK#) zVWjIbNn=#>b?$~8K5`f(KTRwZaIRMSa7vF9*NRx=)F#)Sx|&$=0&|QU->6AY4u-$B zbs*@8{ehVSJ4hSs5jMLrNve=I8&@WV_?`#s$?o4eI)HqX4aP-8-YPSf26HIdhaSnZ zU2L*ll?e%&0+If+6@dsqe zY}ASbgSlt4tazCRL&MKHH&>SOpB8+K0X3WuQF5Z`n(9C02cUb5{H~W~kB<}h0O1Gj zQ!yflS!yQ zIKfX^I-0qf*`?5I#wkw>d%qn8i{#})e7~23-JH32MX^@$qAo}xUwA&BT7MR`RpD%*Onx(Iiqz z5U!=8cLpns=8Zp^pxugJr_|ICk-L>xdVjb7%R%nEB`rl)K~GiD9^}oIPOb0;I@Ql= zrDLa_yESe*?lS~o=$YE{ceM}^y?Bf{KVSx_ ziNRA8Ii47f3H)o8e)&s5t7VVwP7(w0bToZ!iE5{!Yn2WkHjS2@K{^N@eXe=Ab9_ad zyl8zsU~zt5?tJy??abv(A|yNA)_mja)eEq0_GBsixZdrE=%t`pn+X3~mK(%CO^*>j zf@7!?3>n0O-Xmlgmj87Te&-tm9s0H0a&pIAPXKJL^u4<2gPG7Y;W(9l(PO1U?|94= z(%ij{kbQ`+Xq~<=$peH>E2w4S2bsWLUoWunJIz@QP{gPVhQ`6paavFz0js@AXq-w- zb50?r)({$12^+~K!>Kh;Ab2K{fya_DH6z_PK}r*Ngq_b-=~t06X1C&PenDvU80|I& zmqlWcUsYLe1Hotc{C=Ec$r_$`n#y^NEbUm6e^eMEYrx9tss+vV9RKm1$-LbFeI=gOMcS(R@ z4bcN>f!c5MOv_UNltfCdxyhuJa%LzYOUwdfmP3tR%<&=-!|OtxFs{tz5M@+iWx}!L+?zw9vomm;g1*oDU5G$y-G` znu~B;DaJ9}La3$1RCk34u?z#snbu}1gb25<2_~r7@v~pEZ)wjzN<{^@4PF6e&XBKr z=r_LEv{_cIO$JfIyPZF%nK{hmnc(SC$MMdEByM=4+h?6L8XC~}L@8zqU*BS$8>kKW z;3YX7WDpVjW}fyy<@_{Jx;*$o6EFukd6y{&xzqQC(tk{5PX(Nb(`$hVQ>^uZk$Po? zw$Ue5?rKraYBnsqYIT3DVQ^#tCw_k)Aik!fLop~~HH$TAlL=N-n?6C01OsD*rA3<7 zYe9{`pH8=Z_$;x>ZQ)nh&A!)O$4mz4>9nmOjI4OThPdm98iFJ=-ywP5=R2iWXM^U5 zRc2tt12TWMlxI|AJw5)t2wd~1Ups4D(=yY_F7&3JB~&gNT5|@x*9?Wu+H*w99iT2U zm>e?K@_ZvkojEY>E5d8b7UlXx_eR%uKyP?sWVfB(?4TZYJ9K2+?Mq)ONg*xiLt@!_#ddsk= z+pc?95drB2X;2yorBg!bZYgPy?go(t0qF**K}5Q{TNq%3p*uyo`#rgCeV_jakHZf$ z%rEx2bM3W?dpsgS;$!noA5oLM^@+CkV;#5BZ8@h^L3w+&D++h!M}6!p|LpgqyrBZ~ zdlFC8pWiKn)JRLJLDuNbGEh#WKoz(ceYdmsEGX}G$Ie)X&UHn5CLBb&i(4$e499vo zbNJA;CJFz-W&WPS@|tGfnt&7}R_CzmQ3w_otbxUzOJw9)@65sKqjeoSP>2QMg|V~O zZI{$TY*NU0okIbjYIYC^wl;yyOu*6dMaCQq1oDasLL`iw{G9C!C`HaADVG{p_2z`q zYS{AI{W~SkhwiQo09uLzJwR7DdS!BGWmJUyHB*9#$(b!75h19TMG-$qFui%1K$Fq0 z#Nccj)~Lj=AF*&ld%Jk%o8)(WU~r^!_uH-PMWeRRPJo+Vupx2N;U%f_iL;s+6O5f3ZPsPQ-w~R|w?4d@i4|^>Ry8AIccMPY9>@8Rt{{oT4zNvqe2z`y z%!7rH7Y{bkrhiY9^U#?xgt~2GX_5${Ao^pw&v%wyF`S!yoTE^LUpT&7iF2 zrKBV>Iwr~UxU)TLrX*TQzdx$1R$aImKN74b!UrG7BcFLTN5yB?v7&f0sS`o5zD)?q ztcA2r(8eYtxV#2hi=g43?FUCGltbzar(yqAFI+d1RV2&+NZTU#QK-MEZ3~b`En`}v z@Kda%t67VbTk!U27fz7gL*35)BpsYk{ZbOtevEP52fs11hOlywWC_lH9ZgBBiqqA1~iYC@X^WPU87WA$qTY zXQWCY$c9@7k@s2xEZ=$W5Y5wMN_`BR_cv@gDr)Var)+_Cvq9Nk@k!GpAaa5gU))K* zO_Y4c1dC;}pJC34pfd!aqpx>fqUmfri;*ix%Sw`^9nKIEFVtFHEh@!R%%eQlwa2A)d3JpJ2}lNb?@Wb zy*AbcPvjA2FIhRO?KkV@8#pSsih1lip$)b3k6@gkyo4>3-^i*TE8Emfm|xAnqhG^%T z(&B`tl%$>Pa-gRJ+Ef0RoAElUzIHQ9UC@RNRX>Dx7~P%O)Aq$f#Wr={w_%Cf&-Z=I z>}J6b_0sc6m;xut5S9+kP#N)jW$VRRu?M_upW#tw?t^pxuGSayvZmA0rqg?MyGT>s z^i$p&LP_-ry4exBl0+psKzjy=Mmo?8E!fHW?n*qJbK8%afq%64wbXY&^i5-K9dGT_ zsz0jhDcO|x!XgT24^bn=NFfeZqzxs_oH6H{*t_%48~9`>&if^0-E^|*d#uQV<^sLn zS*>oPW6BC!v&`NiyVxey+=9_N9MJvf#6nDh`h{%-K|fQWfG(mK%$X(zy((D`CUTC%I^XCjpUmNVwDdeqM1*=l@rAFJO8sNhI^S5o)$ z1%uG6rs1=@R}Tr3BEayz!|vw;v`>)=cO&uwC~o&040}9BoAwf8T&Nk zuR;6T4Gu9MT!M%UI5)RpqbFXCMNg=;4U)WX>!TrQya&{Yn#_H{=fBQ6MV~;6LNYF@ znZyu(ks9@~OQIz`LC6Z4(gtL7^&DLN9oH-%e7-9V)+q+WeV|7-senk2oBggBJEF%S z2Pd|lGu6;gfaCf#m5%-UQO=Iob`@LlAIg6ONqD-IZRZ+Gi@q-RS1R-6?RuQwR?hV( zJfE55Y6=M}FVf||<9py0vDWim+^PXt2hu(tfXrcoJXhAYjwX+zz-_R&-Fi;$y^ve# zXCJ{UDRtk(;cxKltJ%Q*^kVS%80&Dtt+f{b`M`YqFle_i+77AAT}$u|FKFC@dB}wry#i;AWn-#YnfV!>YJe`a`|O=S0CW8Fs@&>iLWMKM6m|D!Lh~48k$1ml^By!>U=Z0 zFCNp;_kig|o(iB&Bu<4q`}9$ze)1f18w}RlTzEF*g>G&>|Cv&xNtnV{#YPOJdhctS zIhe%yh0VFVRT-iWs{N>Ev^c$DD22WSgc2Z5rqPcF$Eg@;8CHjjX|kO(4F2kR&I2)@ zY`&u^JnoD@|4<@1bTZ;1TCQf(biecghXI;@*s&N#qwOqN(T9eOIkLu2I!vhBX}!6& zlm*k5^QR4)E<9ID1K%l29$U)xhP?rG{jNUdZtMq-PbbxU%LgB0a3X4IuCmPYV^=#K zi#FT7mwZ`w!Z7~sDWj?CYpo)U*8}UT61BS`zi#;UeZbm9_lbJ=_8aTo?B-lFj2E1; zR@9o(dhqfW`##y3qA&X1lCmn<)FrM?aHs2>IpjQ%z#b9d4aEKgkmrU|gvgkb&j_RU zoa+<`Qf+a=f=lMH(sH?LMH%doDJHGQD>}Ke0L_KQ7$` zQXEe)$pzXEhz#1px+t{WNh0YdoA;<{cGv;bD$_c! z=bW)`*Gxl98m_`qyp)rd1AD~U+S=_vc98}Lp!M&NNUT>gA9NdWrOVCr30dh|oO`v- z;#KLSPw!=T&0j7kzC80*%8Osp`Y@+zJQp37`0b=z)z~v<37=KRo_jKZIjP?FhH2E| zbFO4`j2tA>9o?zYNw>xEDZCh{k9V{!me?#5#N$%a3OGnnxFi+3o&Fyd>CLvX8&P2+ znwCa}kQW)hz@CU`?Yp3(jYsS2&mk#PxZ6I9H&3XETU~?D3^JFlQ&d5lc#F_{GGwFl z_9iQq&ADQ4L>ZGzc;L3P*J7|{!SBs|-)}x1yd`Nc&Cvpjw`(N$WUh#8_NK%OLYv zdNY69zuki-=&dJ(vAkd{t7-V8gT@>+>mbw#KnWv>HuRbdN}Ip4U!-+&?#;ph z1QtLj9*m4mJ$}s}r@rw+>>zz)BJ+{h!-l;pKnf379)b-85KmQZV|h*`GT<2_l9(6`1QSQx&UBf zrrcQK;ON{;i0Os7UOgEaYFVldH9>apmL*6;d?_6F{)pz{|gDC+Q?7ae8&3iSKn3;Tk^H{Q8Esv-_LE4(% zv8u8XIHaRM8WtGwAB48$YoxplC6SCuc6Jt=M7#`p(*E zu~UzkE@h%~nhQp=Sn@Dl`&C{QnR&k}deEv2v(nU-8HUZxNOD3XI-$6!C2^L6htq7{ zVBZPI!Zz)X6=@|-Ig{SX%)mJTxv8B!5r}SsvS>ewe<HL}X0p;0@I?(Wx{}I=owtN+fNOkV zD1ZZ8r9w!)5~t-8?F z-imc)1+M*0_c;mzQv#}HsjjJmAskBrIUo8zP>GfDZi-6>pqg#cy*g`oe5;A9wxCqaegKv z=;5}}q2iEGUbK;%(h$7Bz+YiQx}Wlz;tHUf(-v+`0ZzXa=$N)GCy}m~z*eIaE4fD<4 znW=emw@3wM{(=brPn%esK)?jzR8avj1hj2|!_6NV7gzKXDRj zB8VOZvWN9JCa<3+4|?cltmWJ5w&qp>ewe-K8f6B2C}AoD05)VFTp!!rg{wGZSZT6? zoggrtPH4M%3b5Nokt?2Fk1KlXqb*q8Dq4TcYd}dI)kKQ!A0Fzf>$7>%FoON6a#8nu$M@bOQ z$VF)+I@^8H9uJl17z5P-wiaIS)}NnvHjh$`Nae>i-S(vAsb;q|Yw2!?+#VPF_`$Mr zC2Unxs#Wo;N&L`G2 zCCIExbFmx&(`|K)T#7Nw`=VQCpLtNuK}bmGzSQ*us4hZN*c2RYulazHs>raWi}X&O zSUo_;z<`a9M;Z!xN@p}uo4V`959t0sevbTiwTGZvio4)@=U+L^H@6w9+uO0P%n_If z$OU5C!(44r(3@Ktx)LG^Qc~-hatWpbvD1Z47(x0WlUuxNYa-rE_QoOx0aC zZ)Tc!sxoUW|8a?~VDI-Gc0O0~!3v-nG`F>nADv>s*|U3tj3fHd5KO{PVKAQk$=NAD zZ;&=$K9$29|8`LkAcARG_I@6;oRa;n;Vrh>RPzi~ z793O`XB>$BCWfMpTPoNMwY_4`YLS0Sy7w7c;UM0V_`!07;5aqa?>r`Tp0-tU|30tc zcHm;a!VFcdHCo^=B!=8u0wGozi{!8v7m5_6h00jpdbJt zt!1NdrNn|UQ^()SVxBdvbOxA)Af?Ya^~#DdKI-GQl8s=SL#0q+@rpQj{xjIfN6pCi zwe9lZelcM6$b%;G&~(%S|2YfG&sSb60B#RNM$qVS+g+@F&LIZ=O8puD{*`-*M0IcZc6bpbcWNrWwzAfie>l*Tpa>kHh*K1qc zDPGp!3Wfh|W&8&zha#xRe9zxT^i7HJLGtn8kIDu7GXPFg(Zs^*!~Ys?lXLKpb4X&q zJ|A>F*@V49NMZ1-ky>~Abu;sGp1bY4E`!^tyY6V;D>wIpY93eq=fITeo&}Xq0M}%Y zd7FOUDQMU}T-$<5KUbAmy!~vXO~{G3bEzkj;HM5a7t;pghSm;zvSjKds#SW9yd|)| zrXkgs;sJ`{UOcQ-bT?zqSTLyv^v7nqJs6kBAs*mo*yU9D1{ndOCGphT-<<|*5&)^O zv5CxQQ|yB(44LME``^^fzjUlkmLsRVHel^MuX}H+kdwxd-ghb=dn6b=zGez2<~wt} zMo$Pc&r1TW{`W4)qoRX@ErTy6winI;OcIRWZg~JkVc&-mARvO0^s{Gnfz%Xj5C250oa7{-O0K$f502F88=iqE>u#j+*?rX@w1mcQwl8n1O94Y zeL(vznlM_dTwbsh!3~U@_7`0BEpdSxAf}{z7T3QIM3O4(?jDZ3MwQNg*FJJ=h7P!( zfHK+D^@_-?5GA0!*xBK0xrkWEdA5LKTRNKAw|1D$>ktdjm2z|e5U@1`?T#QiZ*0Bc z$X5YjyYwZeU=wX-WT^n)@*NmJ4Z$QgvoHzN^%6)l1>{Bbx}YK2-niE!-n{GhXA+If zZ>ei&$HE%AN4I)P8Q0tQHeFG&>i>bdt>TC#eDJ_!EF$AKQD&HJ&7E~I{2;^5MLRM? zT;7HKKy=Y*=}#|!0OEb3n%o^}#XYLzIXAcsxy$VARou_ICAv!;-p$Owlm^G08$iuL zCLvewbiNV`2k}Q~F<|@x#Cw|!qS;Gdib;cUahWMdV4TwVukyxHLf)~VAbg3fu2%mr z{-G1YH%N=7y)VkzTF?EW5%V%Hrj&HOR+o$3r?!QyFZkh!U-i>^OH1)0 zo`5Yv>F2u(Z}s#EbsJWn<%g|R8NVyEd8HF4rc|U3jy656GJ;0XGGBLvOR-PPxivQ0F!Ya&F|!$;*YPm+BYY&e!VG&VKW zKRM|Vp1(|9<8@S90^bIctv3qkf>WPY%x10mSkex!ZTL+{cX!fOY=t0}ySvxsvZMmLJ8Z!20zA?*L2S`l(E(P$!a(APGP7MZp0XcWd zFX#FhU?_Cr>GNMwad3{ftC%)XOHGpGrs62_7SJeV41>8-Sy@?|d6w@dh~=uI2W}W5 z#A8F;{uPVIV51kVO3Sp*YwwRf_RI$ZpWHcKvtIutF3Wp9~90s2T=D|nRe!?&G@d}v+3d zI;Beim_ertN;s#s#L#RJJDAkvomu)Xn5~P=Us#GLL^(G^Z{zb*qRjqiDI+$y} zx79Zi02TAD4Q9pYuw_d&SX<~m`uVmc-3EGd_h-({Sr_iJd9_yvGaq?~`={A0=6AEU zMuh2AgGeuJR7UmTvP;4&(MHMhz4el`!&u(&Z9b3wNSkgz^O^W!CRUv>ES4b#w|gEf zbl!h!C;jG@82dTOM~1Ek;)iGDk{`_!E;6Rfzw&wA4cq0$(ird_%%R=Oz=@}? zuhS*6==BV!7Zny4(-Nac+FN=FLyp4EH|k|#qzl5jjgF6cm%e2mh>ZZssq!7vj+mE(Ec!AA ziaf3Em(mqeEDIN>B9BPm3*O8PC6&%=A6N!+zBeEZ)|3lTpck^z(=qZW;e4;m1;lK8 z9>*vt&Z#$E3k9vUNkOuSD$3g3C$+P~6$w_T8|gbKOW%U9jXVQ83?IDQ!oTrpR(Yd{ zLY1`hENQ2=LN}3>3k9)f*Ld@{N;>aSj-lZc0kKBeH{*F!_2juZ7i2SMA~D@Txj}@* zV4Xe0ueFU4&P?5-oyZopAHL?-$7Gf$0 ze`7h@jg1;KRb>j)?E?Y%QGR1lnva*rV&4*A#I8;ywQEVJsHlkO6u7(UE?k!xU08rF zi6iql?>_*^T_^j#XR}rf7cV>e@$UZ7wxh%HrG|ep^nOVWj zMPXUdLA6r1Wq(=wx};RXUacM}4-6U}7zMny{}Xi-g_+dsMLza4P8_*WitZH*d+T^> zZ+oru_V{i&qV>qdwt4%uaIUUlvw(q| z5-wl7N?@lcaf7I~2W?D+qo6)zDkL{sZzT&lNVR|?lUAj;l{&g-zu_j#Yeu^fTGx}m zT%gP}*zpF5fPf^}VM`b(|7(8t+WwMY15W!&8kc+wDs@+%Gni@1U;95;l6pGeG78|^ z@DLj>B^l{YSNI&C#SDU0bOkCGiG!mcTZrO@KuNsaK2S=V&;LEjV1+3+C!pTY%wxPR zg|EiV6hxC8ra7uFabWnn3ku(}8mHGEA>qQ#Kv~t@;&at!QYm=2DLGQL6d)SFw@%cR zECZQr-qt(anG^6UIE5AeOWsM*~4gL!Uoq&m0)}{X6E3!;$cjXvX9~IykJd!YuagxzBjdzspiCSvl^J%Jnu=2_xii<= zT2OXn>J@QtKV(Q}vdUxdy`#4vVb*l=DC!>AzdSphq zwq~q(E>E{KuIXgGkh$`KO(QRUd5h9FNsXz$pml%d6?qi4*k>u23%Y#g%1MrH&;lh@ z78DO9sJv2}jNY%GGzr3j2`DmIr4I3EO)GZ5p45Ze_hszjh0u_lgL`oc+s|6qZ|{E_ zPDh_bm9+I1PR4D$|Jf?Iu7vfCc)%m#WDUeYrntRWK)`WNoZ;}e-VARxf#lnw{&B?Q z(G`PQ$|w@<+%xOxrXZgyVXCCT(b-==E7q8i;7oGlkILOYdkafu{}NjgYi=!#b{7<- zBBmln*H>zWl(A_R`pazYemS9&fuq5&%*QNM3Rg{SteS>3?b&|Y{-x;$ULTq?I8y8pqu>;2q= zi+Z^~Ne7f~<+w$1%R`s0g|U3I4=&udK z&i~7+6?$dWO{0)DSibB3@jhZTL}&%FAOUjE{42rZ0`O-#ELuy>#0Z zG#e^0UmF;I-V0y{|}h)B=9a~FF5H0HMqlf+ z8SZJ6{9j3|dOd%pPL5AcW2FmF5I?D@s~e{xp%J~vuCXQb@o8SI(Eikp-L6C&-5XG1 zIqP>9GSzT`#Hp9t&|ucb;d`DfS$B4eT*iWy1rKozL%h>=sjS<(MXtLICJpOdNe-4a zH8mZbeuZ_LL?Y2A9;91tCn*+Y%q!T^->(H?zmkgy&w994VJ5$XbSXQegt^EYe(IVu zp%G+>R4z3B=mt0L>3GJb)Jf1_(j`NMk*DNJcbD{4JnO}Ed<*lM-9fdCuz0@wbU_ut z(bc-iwB9g|vM${Ev0JL{QDJmfjrEV0 z5%vt9i*%j!B;jb=lZjCTVc4j_O5ZxHh{z;)ajA(}z4>q_^2xgY|e)IAoc=3XDt14Io zzvomQp^IOtS?*aK2IU!W zeA;by=bG;A>$#Hl${drF+xq>*;aZ>=wHQc|-hXiyRNy3`C5&*mK6g0%GbOI73Oh#P zSzO!5ykE*KcO1HWI@S8u=b>;M;iotwUs#J|WB<@GUp|Ry)-W%S^=j;37oVJe=iICm z`k$~9czRt4Ytu!G!o1?0^{BhwEynx0yDX;@)Y@-kLY4m-3nY$a)DLlOeX6WIFGsAC z{cX$oZCb0e({iBdaj3K2MoHuDvN7cqakSte3KtjGihgZ#bB4k7GLiS))q?re=}ujV zPL~uE=$KL7?TPHS-rmj-_f*4Op8a!RUv)sKB`(q;ZkYhXk+<+AigJ1H0m z8HP&mz1FI)3oZ*)7F{KlF9SX-MOQF+@Qv1;W-x(Rf5?yxxaT5 z+OG^0IZk5-PmPGfxvb;_Gh>o`t`89VO%6(~tY_AM1=cgU9_x~d_S+d}xQwkoAO8O;;LE5v_#n}h`~LJ}wUs=J)t?i@23%d=fh1If!-Ooz+Rnr%R%U?}!zOar) zhP(8cr~p_)13RO}O&f5ual{S-98?x_VPP_YUTHgaD*8WN9_<_pz{-Q3`QHJQHKWhA1J1e1P5rn}d+kz**z*`v+ z2OQC9Lx*u$*MUj;o?*ko3Lidva6cZE^w@7lW~-kkYT1AM{rh+KKjppQnX8%71sCJc z%;mT&O1qqvcsPSz&{K4195<7YO6s>N;N`d(57aLI_p-K_g7)m=Zb+Fo;_50G*S^Sb zFY`(d3~;Uwzc}XjoS)yF->hetOwH1WAP-X>c;Vaj&p05npEc}x(80!@y&e&LRwpr3 zeQQmLb%WoTvs3I9%h(qFe*r~v)+d4^ANCaVl~QfLrUbq8Bl$|u2otU6RRE-t?DBY> zEQcNpe~*eLb&xDDW+m%ci^Y=cnLPTpy4c_=(IUcTj$Y>G^jN~@RC_H~ zyI(f$b{1|U6@3rmyw4gJx;Z8HUV5A_g?L;a^j<`?o<}f-U8v}L?rsR4$3)|yO7>`} z;A+Xt$kD$IJBT}F1aDbPF5TPqKbr+wn_@rl^AGcu%||%3YJRqDz=oliBB;H}Rkh3w z4Z1AMpVwlhM*d#tvJ6CVYl4-PhP|h=!rD5TXsyBIr6pN!%04&U;fSs|RX@4&VD#<* zUPRBFMds-QCQC=X+KcI1$|zmX`Nh*j@<9E&H!=>mw4`^ba3_g7R>RML{^)#;fcH zP6hiv=lEHH&qT$hP9gR8hsf>-jJHf5Z;S2n8Q1gg=G+$KO-`FX}Lab*k$zn_V1(NW@Jg9R(M9mCTeUz_q5;SGdRLfqSqL=bU zhD^4AHYbn4FPbf&*CsxWqWkj!{{@Kol+(yG{Eq65F($(T0bi(e28;<$ad#AdmyhNNNBpZ>o)0q zBQKr_&4V4ExW)~xv7=|)e#L^TANR)IYl%*|`?UC5%`MqDa>>%+cIDhK;Abl(zh>uz zQU9Z)Cq`ad?}to}aE9SOP-gr*4EENGk@ zWOHXHzpyX`h%mgwbRV$dc(nGw!j?iPX*sr;K()<57m!3Inkp-6Kf)v1Ph!*k-`fne zN&#f|L$M(7dk>?t>MHEa@)MTTOw#$K#WG0ZlmgfHveBL4_defGezGf@#7YjYfpkRe zuwlsB@BOwm?`38ig~32$!rdA#pDJ$1keIH3=R<1_haO{v_~jO$3s-5e z{Jl}`c!Ew}XQ0Kav>VSRufqTRIAMA- zl2`^L6OWxau|_BkwfO>F3+=w_-#7xx?}o|lg7Xfg zY&W5QU5j!uzhH*71PuS=gx|&GvWzt3)zj`$zYJzi7Ph8+gbQy9r#y78ujS=9y$;}c z%9(ld=tkF+7A8VBrmk*TZ5wttQAyID3k5*TrJRFZqiRY;lm=uJ^qvNFg(_P{Z_2Os+3timW|N= z{qXYi8mRsckkB7-+j2^#^LuX$3l^#!lx8$EG=M?!l>i0Ulfp5uv$dr-t3mKDFKW(* zSuP)(*VTH|WA4tp;%xW%XsP`(RSz0jI~%-GcYI3!QEW}1x4+V<*Q)7Y01XJKecA9m z#gD0YY1?u`A-2?4)h#?n_(E?uCx6hKAN`;G;4L=rfjr*%1@wnDQgyZQ1}a0og{{W% zF@szYI;_F7)a72_1$=t>-AiC;&?ktU=hqJ#_}_({o_w_;so4Q|iqB8fer1M=#d@LJ zJG>B);Td(td!-fpl!bXfxSIk0t1c(}>5p0cAFHkp;0}Eo6?rO8F0UF6E^dC77_k57 zSe$%b{x^U)*r*P4JH+P2$xm`yPqI6jR`1M27&PCc+j*~${+gILoPzqgPFjsxIM2>J z3F$Oub=qHSw=70+vtP)3@&XLYAeIhCJ8rMMh6Qg=DDP51{y*=zLqPaKyFGSI^mD}b zI?%?uyz&ftbJcG$_P||GAE6zaAVGbS0{UewLB+YMI##Od2~vQX+W412GeCM6ybbp4 zA2Kl&9UvnBOea$U%b(oVENkw7-j)2OoY=zwreicza)$gqvr368udp|{CS#Vs`2(WK zlgn>EO6c&T-V=8=)-IPb_%sUvH7({+V!3sw*-K{^*Dph6C?U_{H8o;n=r(t@=qMs$ zp&JL6*T05RBcYVUxY2(tG<4ZnSR_5fvy>Y#jF+|AJ;n zva1oFYs%n6oH||iQ4728kpmG2q(}^EGW`YJd)4NsR-Y;txF-bYmE4v z+F%%V39i-rN*0=}+dWjf&O*);R`;?86S^}c`ynokOAtZYw9sM0sKuH=y zXTVFj5u|msEKx{y0Az`GIN1$i5TlDcG?WXHK>84kRTBrEEcz@cZsh6c+*A~t=qtpQ zJJ@h3<(J&U5Ah5C&j0k{cVLHjkS7sD+ku^(cEoOE?t9JGRlTPjXl(o7-`8z^G(wiI zB_+0E1hb&Y#=rhjQTSqYEs&QH$OojTeG+J^NwZy<<1wJei5{Jv)%w;T{ADpSw0ElB zSb$CFj0KD#fBl*$x9ETAJomLIH_`_@vwi>O*{dbV`m5WJeRrsyB=fY64xiI9@sj=1 zy_Oq(J6pdLa2!F4+JP*JY*tcHlfGmdwAlfjJ`MR!@wvBehpDNvOHJiX{>JNoXy4yQ z0dFuXrqE{$yrWdOgz{$w~u9hv8(E<@J-@=4RAERe#f@+^t~rIel8(1KxUTBv{4%#iLGJTgnKK z7|GEAT_ezXgi zv`D#JbsFl=<%5ZA3X^0(-@>_6w#cGX)4#9h=V{%bmpCew&?G@)hs;1>3#$MnsvggX z^UdL~-WJv03Q9L1UWI{PmVfHA<;xGI)s^PtV_PYW_Ktcz?h~&2nbu5|D@u~JfsL)^p^yV{>?}6(2Po1`gNS$B;B=FEvVf4}EuAOEe zUtlF?ND4uB>a+@9c?UGi8bQyl><#j%>aLd<=N%?*ubMA+JYs|=-C%Z(A=R%;3 zK_;N4<#*GwJ?VO6!=hInz9NZv(Cl|bn6YE?XR0~wA|mmJ{YHRZCc@iSMu*WSByH;kP1$;2C|0`KI5j*7P2OAB<|l`4uQDemKJKiIB3Gi% zmQ^RSG+joI1Gyl@ULam$FLTyli~_AR-B=KPl^9_#WE&JZhQvgx=5nnxezv?)?wpr#IFU;@b@j|Zy) zO=@GR+W#hKVxi1>(rWf1y*15~HAJwgedJGFxi_3yLXo}Ov?>~5rZW;W32mQ=G_wfD z3i-HH!VnA9VkHD+1m_jmi6M|03RuO#RX`lj-dYUd1X{lT1%cF+SSWoTq!A^AYoeIc zqwQ!@**tZn!TStUxwHnFG6#}=$C5DoA*JFW`Del+nZk%!A|Ig}0NV)w0w$H(4~#|` zycQOQreO5itscxg3l4VF_2jQ%-@X^FB{uHn)))HUP&V}*L4}9DyO46oJ4sdO0ysqN z+zmCw?PLLnr>|k06V{U*Kx4k(hYZIL$u;*nz=^!z{tX1zSBySEK0k+DY@$}?|c+2B4K!h5V`_|0cqh(zU>=DLp z_+!BJppACTqJDO4dgMDMm7TRd^?7L7_jxDX7X1s*Zvh?k{Hp$qjR6jr4d>_$)VWDa zE_mClFK@ccMytWuTY6ki4+sf`xRcSSn-ZIS>r+<9itCLY86O>vU1Ki%_M@j_hf&el z&eC?dt;GkF<5+^Z*`!FmtyxNWpDPYgX-o;uZ*Il>J1ku-?vR@rSGd4E|NMQDMwh-w z5&g!)ZbOGNLnzWPRnz-ZqY7(^b8yXs*}Tt@%eyq_*aBSA!<2Tsy7F6bMt4(C1Q<=X zKQ}M?U(%3M6|eT`iV6&2tJ(zuxP};J!+zJT9@YEH>|VCzOfT{W6cJ@NTz!tA_{LF4 zow6Q;*4P2qqjq)p9v`n}q874hsqNd`mXpn}D#%q|}QM}|)|;#Gd8w0`kG zBf`+(QPJpWh=ku4V5y{}AV_6hO~#4?#Yu`ZBH3aZL8qlwGkZ%|j`_3gWB~k&W`hJv zk3ZJ@%CCcGELu&U*NP^TwDrImcL4k-X}d2w;CeIc?rU>128?|KU zW^jYk+pi;n}~6hS{P9Fn;?`zfn(|54AC^Lw80`! zSAR`C+Em$WqxH!v?*|!-Js89N!y_y|s*msuQn#iJTV3eJ(eq^og$!O913RqpTj3~5 zAql3KHcAw^Kk~$YZSiQGjf{h0j=j#4Kk4slT$Wk<0`0XwRBqA-@Q0=+yR0`isDmYK z>}BTzcj(D?Yp1ErPWD|4tyxRt9f2A|u3S32quBCce@^T9%+< zk?J}=n}C5IrC3<>I~g(^v=^x&?$`0S`-Y9zAM$%HUgKZLj`%NUbk2E_MKn=D?(>?9 zq`9Ib-S_Uy&+iu;NY7E;Y)WozZ>RNyvW8Qq5dXPL{x-jB>sT)qbbJ{8y?yKZN;$)p z32rG|AooDr1N^;zpR^eI+G<=Lu6Y?t_iQ~<`=UE;Edd4w=IFPM(*)ypag7fzRc0tJohr5s zc5l(f3ZF}2?ymd_6U(`pj@0>9n1+F#^2b-@3I#FX$4p&NBc;2=enQKl1y%!=`M5OqZAwiFnY^p^9gfX@NrAcC83byj(f_5bE6VP zF08aE@{s9!5pq$Imya+@bO?Z1B|q@v=yi~ySAAg7Aj*KBxr*~SS|vQHhVXWY?GAY; z5`)E{ISSM*ai)Wss>*spGo`HqP~YRMN3ybyIsP^S>SF5^f~~*ff%4<#@*tlbGy(Vp z2vX1yX$Sxy0rgp`^_bGZ)$58B^xkN)oTXpV>#SOR4f1ehFv7>xY2cm6zN27dUV+T) zEmtRH(PzkwPLJ_!C9`EMPs`eh6kxm2#X+j`abTP&Twa)oT#g3mhEaB>0S7ypxPg-N zVOja|!*gQ=#J%Q*ms-cfv5Z3gxAC@1% zw|zN2G{ha4yKa6OIFiB~i?KoqRr%AKe0r`Ni~oC}P7TiaAV67j@x2n8IoVA355HUs z%*gyCs7+gG_>upY#{YsCOdl3QA7d*%qTObYhTfNKUJdOo{xZng&T+Eld%32RcYHY_ za-q_6b+N7B^!}+#Ui5u=(AkzXT<#Tzygf^*w!asa0BfOTcyCOU5O@C;mbneT3{w(S zsTf2!;VH!?F5b4P>gJDpzC@*L6{$JMrio_q;0v=$F`u>u4 zL1Nkuw0Y!SjmT>xIy|r8;pXi?;?3@WRdDWEHpkc;amF|FF{`7yS==vEGkoSC<2F-b zvm1Od$-6dmz-&k3Rn$AaeB)?m{+G*#WWI+^5wv_i8?eJ_RwBHBC#5kQmPRGKbJL2) zdNIO__FG+*tvwnR;VL|FL5O?Qq~N86UuzvdrE$n|ZJV}LlaO3jdiD@>#{F}%^}Npd z?7Qw?3jR=3&ABsE!lvKyQYDQ#Yytk8m+R&-h!{IW z$?7Ju!{M|#D9Q6y<{j_<%tG%mF1{SY5;S6RA-U) zc=HU!W4F?!we>Btz|+1K!qz<*q$0S#e4iW27p@!{r1Bh;{^xvkO24_zKuVR6n`P1U zxg?_!@%$VZmQcEKngU8r>M}T}%J#;s*pYQ?0BZaRy15&lkB)Z%hw0bU%+EhAl(mPj zGu{$29@-6`1i*p;Y%HHa!L6F@oAE4KeECm^{*}dlI5M!@+Q~h3Q=PW929_e2{?tWu zuVLowpfSF+s0QLwyF7^JJ@x>UPe4^)s!^NYm8)#4oDvl~Yk`YJ*ULM=2ZpQD1|lI& z{uWE_x`zeWIb@hZPnbr~R`8MX%pL!~)P6Z~jLgE4SDY=uWcb$u-UyY?!w$R< zeRk0QS%4ULOO%16tIS58MyMaa#gqG6@-&_s_pR&ERZ2)ch(2v`^SRX^l3VYLL0L$M15KnVUDV-{YUpL!7>b8*+Rayw9i-Q87b;Q~?H4By@UE73pQZ{rCh9YEY*k}I z*7PnzocZ7Q=$p2J>vA0`+G#K7wCw8QhUo0{|8;h1Rkxqjq-4oD#X98Xx7EB-e4{I% zC!=dtkgLul1ZIjT{)oa1nFq(r%Jkb`PR`BKpZ)(l5MMJ9>f#g?jXLpSWFFw|yXUgQ zdZwyuD1FbneFc}S6htn#o6#xF8p=H5T1OLzSZPMXVV^0@6!alHef4LnH{E>)STmaN z156_ru|}(1RaTH3SBP)|rtsjlx8T;#uN-*^bE`jQPWtS0FywQz<&&V#+fRKg{LzH0 z_60OIgOVSHay(cN2IDk8eS8~zlL&eL>7wroK}dl#sTBIuUa`E_kVS4*{VEg?hEv;m8$RFI%0cd;H z)e2X?UQOcrC#{slP2e(lO&pF>0xrD+95eDup`9pW=Mh;tasZ)Aul!-K8<-iG!jk|$ zbYl)p&n|MzQrvuCwc4MiU_9a?PW&@Y>)mm60C>x40lvQO+q2c?RyIqQ!6Lmbi1|+j$xrF)XlLq!LG2~VG6nZ0^8N%c)Q6GXGN55^ zI6p6^nrlw@GsQ1_nZ!=;VNxxayhu+cyO9Ut27x7S+@%Cemz!MX`UQ} zT<%$O43s#zS2qxg0-(A5KH(NNnho#g+J5#3BWMfyaqH(yKqU?gE0Z)1oh`FpAk%0HWI+?Tst^WA2URe=uNi+n3Zw*;66o?dkTR}nnQhda&Q z;Zadl;W2Ij%9rDIlhRgBPwg5n@z~Gz@=}F8zIfo1W?1l>0T*Wwq?h;jUg@|A0p(ho z-dsW2@Xg&4({|JAjINWGb`F#pDX*^^NR7xOl}~-Wp!GBy=C*4(dJ%6^Zaj$xc`8f$ zf8KDWbFF-`bsZ&mKf6n9{W?aoMsxGU=2j}kFBb6C^b;>-itWR}#a%{nfd9zpCk-JP5KVGe%1TyxXB;MPN!(z0&q6?PYi*r(Nq4u%1u{1My=0eJG~a zyxG;<@%J*|6Q}Vni+2Oi~~{i zj0aJr%b|ONt~TN^Nyq{(;hBhgq){+oiRFMNs6m~3kSbu|1JPHUe!;k_9;*Pk>;vU4 zX*xVI*J8$TO$ZDC5&@XJIuRw_uT}DSueZQpT8jSu39*lD%?jaG-PLQcMF5^>tW$s^ zF7YC2;ZRL?Azom6W$=vVTSFNhAOlea-K9LLX586d%J>0FfT+Yz}i6FDc=d^YwkOO!t7vZtgoloX~=XMNQKDBE04KO zO_X-E0iqnAHcON0^&jh|N77z)Hv>wq^{98&8(P&b#c+agzFfB3!uMjBq#Tf|uPx3j!W7phrKjZ5eN=5{gxO&k5#l z<91VBT}22ka00-xNS*L`?x(#_rY-Ls9){u{tD8K!i`O-u{X7jfAm!gD04seSM2A>N9vuq=olF;1N?~0NLqlr1gn?*7t!> z>LbqYKjwLWn%X1b&$mxn;yL?P5VH@&C5zl-=@4Q~(HSk(W)nPfS+CtIF+% ziEZmHY**Q}zgR$J7OK=MocZuc*%yCj0A9K4(D2+VQ~!D-Z$RJK`OObMG{X=mO4$j* zptjM$g6^{8;o)(yie}%A4$EedYlOV!%rBU+_&Ze%r?`@iiX;cg6PmDVtbEI3!Jxp> z5*PmtcyD2Fy_&~QW8{#$NcIB#WYREFc4SQY6>EGkBn+VK1VTD#9Y#u1n#ncmNA=fL z?X4g&U_dxB$yLFfhONKl|K>dc%I*#jHvG7wKIYGd$0Or2{SAJ{@*~_qN2?ZrR|*cL zKn75w)Rek<-rIK($Iox`3_=fjjHNh@a=-@5Mq6W+s=p_m`8z;@y#^f=QP7iia3Yh> zl&zuBUppRQORF$2&I?;y(~0Omzd8H4^2@v~2xeiwwIt(bppF$_0J*$d$JrzwvsNIF#Qvhy#{_rfYvc#>fH$3ET+NmrK@GroJ7UvfsRno8U z)}2E`m2lqL)uV*RVe_B5QCVemrWFf z$X1r(pVGRmH+p>cR^V;PC*-*=jlBUigR!t>n+S~CK|3ueH0NXkb_K)D;9#^S&3Fy_ zln9BN>4`WTaDWCxom-kIj;d_HsTsf>mSzYQT_ump#$oR3l{KJpZnV|*CRX)*=KAS^ zXD*<-1@3Dzs=8}GnZrL0$u&?XEngdaPQqri7`@Vfo|4({^ui6lljpHWCh`mvkjI!r zDj$@j)XW5W+^KR%&gSOdxS4f-^#&9AyOG_ctSL=R(0h?i+3sw*rWI1#-JUuK=O-p6 zpPrbsAFc1A@gH1*ADIKfHt(fO1{mIouqjcn313NAM8Op;02$M})0)-->@!{i^`Y;F z#(!~apzo*cGTwfdny07@vHL+z6sXKrYn^=AL=zoCUJC(gQMd;6H}o=V*IanWjl#SAiZrDEHm%Z;d;7fpO=7Qo?Ji! z(m$H*Tse!9A3$EbfpoF>Xw27wy6h$o;`$5H`!-H%0mm#_l!I4%`0sAs=UvA%?pkZ2 z+@!3!sq6wvh?@SI8g4})SHVy(Nt3M!AJ_I?Cn30`UIRwH& z)z5b!q%$6$S*LZQ3iR2Y-~GrZ=BF20<}y(FW!Ti-kkb!Ol;#{jB`FlXC=ohDFa^z zjNd)GpEbCVcfGh8;Xbpb9xt?UI2_#~$@L2bGB+Eu(b#GD`|;5du!rk&IFk4KkM-JN zg73f#c9=SNN-n^B>xG5mBnxQ8)|N}3idP|*_rZ6>qFxa1E_&SQ6c3LaYCjdG4?c#0cQl*;=do4jL`E+x%L)a|J%%yV&z_JN}4&2X`&s%}@p zawUqzx;3iRGzD9LmsHer#q)d#`s0~ zNs~fZAyJ>^8MkXpK1O-1a{Hd>BZ*9%T=;)SRohp)`rTuZa8z!H1WCPHu^|39Os6oB z(JJPAk@oU&^A3LVP|3NB-YGHdNeiy#s~YMS2P%0gfwHkqaE0P?V-1}l{*BeMJpqvo z0gI)(MQp$B$UAyf3g@Sf(;tr1k>I0Dm{I1H+xI*~LQnx~D~u0vZv{Vi`ji`1Sk(2X&fMTh!0wqlb9GlU3f&kA)BH0SxOM z6iM0JqWG3o1+83x15bxH*(K2zK5W|ZqG?(Ki$#75z24_|Z(0byeKdAs-##m)eNLr& zDnt_A`H*IM+*#vQj56K`_d{}uj7F}IBk#*ayUXOsBnv_s_rQ>}dLV?+&hfdr(&=iN z*2HiP_UzaM7vtdQj`bdwdeWMwc@ZEbC5{(}r~GX~I_~I?&0`3}G?M3rG&4|67#I93 z?RiM=DG)!Y{P|GP;@pyG-fhTJ_`43u5wrWa(b3+EUXqS9%eN$b3%a#;OV3HTBr|nv zFpqT@cvG*mq47bSXBl}iDO9r>eYwzo5ZzbriHq3G{P+(H5VOuT65rzF25p+zfbU0=lIK|p}72}}lj*aP#*bB@P>D!s$ zjch*i7Cet|Gr+~r(h+?8DhaE$>J_+O<4moaVly=mo?w;aCzBZyrCGHo+?W{Qkr4_x z@;>=*qXWAagM?VW|7@AKTT^-mh&$8QBd8{Hb7I@demHjRx`1m8w8vrxNdaZiyomC& zM+p8jCb=-S{n6xXeF2aF@(Aq|OzW{VEIkQDF^dnY++JmSfIs7aXmqBlhoLUd-qH0o z5(&3)>7k!Y$|lRikTH_%Rk%45;|2C)s}O`oILwPjvL(Io9jJKAewsR}iR34gFa2bo zJ6+joO&^Zpuc&mpYi+pW|MzOu?6RC~y414o1X)CH=z1QkB6Nj9yu z0VJP=_Ve&H)7=@WCbb*VSQs>=iIFCxI}I4EUk7%~MU3u?)74LZmSFLJUHQBF5%Hbj zk?Fpnox3-upTs1!yEqmyBDayiAnli=hu zconB%WB#*d%6cH>55o5Xfu5bemo z^br@YV4ZF2CS`sWmz0;}^9U6~(?58?Md}WU1RooqO$4I6#2NL)&FdFy zWg5A~+K&?ke$5R_slj_&cY_SdY|i9?ZRAUyzQq7LMWzQSzRIjjbMcSJZ)L_lAt40v zIlxt|V~QAz=?7DJ2M^+83a9ccV#~M9e&s*w_IMa{TN+TD{IQZWtp?MCI{{Q8!SvEg z4*ndx;%J-xuqT*i->EK=eXGbdUzK zeETt;yDcfA2&>YIuR^b*O2?2>&MYspP-Zxe`<*L=yDs6-!I9gD$b>ixXhb?~tF$uIWx05~BGhF|oy?r5;R$T$ib@-AnN>C4LpAhhp72=7IafNGfcA1H z*n!FnUmAEg8*&W{%I+rt=9%yQZu(kFAG@uK!{2aWYdOWf$j|sl;Yr4Cloea~!7fr5 zEjZCi7j$oGLd-S;z=AD1x2k7dh}>qc9(ma{$7Dp6qMnpA7CfEo{N3S7Or4g>=aR~! z>-8{?t@a}_me+Tcgk9u{#ZUC(#qmtDG3gOd!gD+r(poM{+OyvNxP5lbJ_V2dU4kI; z$yZ8!{XQ>)3^)Xxu(+VvGyD#&zv{F8Ugd_QG6>^^86>tktFp z`+Ug?p6fWinA+bHj7-ow5l(o{{%d@$wIgD-qVn1J-rnEF@-r%SY$H_qHTo<&GtU>R zk8pwQGKU{LWPOv5fgVBh%hdQBbwaqOY z64x8OTo!Sd^r3IaOw^qZUGIfS7JJg=w3NNh+7S$cHtDiKn?>oUpWMdfdLUpV=xv3+etXoXPTSLL8jn6ff%d`sQC}OO__EncP)V zbXS6~0v)l5x$~DnW3p0r%1%Q+AYr_>>Zg{N1~s*Y2-F|Xz2&B8ufm*hx)RrJvWKeq z>6aArRNs2+HOHf^(_Aww&#f#p~Fij(j0 zRjJ+8ED-QFNG45SgRV`(A>m@e@CzcL-rpy#7=8<<%~uHN@(nM&ijOYmUM#PERze0t z2c8~|Ouee}$)0kymO0aba{&GANb#1~<3O8)`9zuLqC6oI0l?l$)@kJ;n)DfC}cpC^t+E z!x|RPHS0FJ7pv72X_3s3bFwS&HwFtL*y8 z!adnApnjYS)l0A(OIxY7AZ)9IO^7mo@ z$k#>hy0e4a2B*(!#6*R`b-OYA`22VCLg2P{SUY&p z(bB96H`jQ~87>Pvv>>c3r4Xz@F{qQ7 ze1`Wx2TVv%*@Lw}>KG?j(&Hp;8}Qb5x~$mu`_-C6GaCbdy=T5UU5xxly!mq~LU!H; z3r*|!+F*fgZ_47vbBy_uy*1v0uA6Pc3?gTxde2Dk%2DxJlU~z4pf#!X*qz+o>ndai zL+VZHw3)Mor&!{Tq2Ty4+thSf1q50A65*A7ba%Nh-8Z?a%9UVb`PVWw1a5RCbi9Am z4gFSLZWYdcfb+Ev2SJoyI6jJzUcSVX?W3txh+W-xCShHY%T<%mY;RehC)nL(w>Y{R z;0~?VX9Yp?l$m{pR``H7_wnm$s~1;}^H_{C-W9I9jl@lAEeN*U{E$x%7Qa5B`hXQM zCcCM4hN>Cu%OqJ;B%iju+$?(UG2hG4J5nbnmsN>7rMvoQr85Gh$g;Xy8L5n;R>r0$ z;_T5g=5;1%zP({vC;Q(xX;?Zmkgv>%?DN|PSy?z4L%lYa)*qaXekgETev9>$YhAY5 z-50sqzutfS{w6C+1l^;sC(yhvfM}Sf1wDh7ee?UN)Q@{-u0;34uo58s+$4+kcjpm_ zGLblBTJLTSzvCwb-N4E;*!{AI>qL!jU7lK`cN+)`bTwagY;)GVSNvigdf;94N{Vf=j$2uz z$X2OrlC^TIo6JziViOdqsY?%*ghES8S21Q3(wNNbc#2-hGW#p9=IUA1L;=gGy&a^& z5-*MTQ=`JEqj>M?`@kZLmf|s$hR+9=X~Gh#ZQ-dY0Z;?92A1dbn7%lf$}9H$41?-| zct|!~wQW7&dIpBVKP7l z0cxI?SDg-;Ix;Fa2f>s8KRSxY=kwN_FsOCA_O+i3lgDdBw1akLCCaTSMItj`e@z~9 zXfDba(#__&H7P@%MxQVMga`xLpWcD@aLeLIcDwI+i}aSyU((9zHAx7kX8~toAY{Mg zGd;b&4)nS{+#CP5sb|X&K95CtDyljg&Sd7mLjVxSr_-)ZOTSTf0FT2b6b@OtLF;i+ zb;wp+vuIv%wA=WkNl*0b8G-oye5}fDB#z&L<$g@zigLYPB~@jSRSFx`Xlbl+si<%Q z(1eE&T(0Jn^Xei;kE9uoW<2d?ebgky?*A9VwWO@%gwvnAbn}ZK>^wQ?EjPKDDzeQb zR8;!oQCg2{E{sL!k^9s0e)u^-I*|1x!>YC_LJ!QJ%Uuu3boPCYHzwPs=P!@2`$9W& z%yu>Hj^|(0F?Qb*`}|?d`nNKJ{_e7lfX5yzEwzSsK+hNXtm$-V(FAjL%`_K%;d@++ z4p%s*5jdWy^TBSCdS~xt72|ntsq4{NSFL=>l{t_Picwr*GA zk&Xy&BA`}RvI!0j5*!f#BeyDke#h-P_Hb4pTBl)6QrLd1Om1Ulpkr_rbUi?~wZuBi zUC_^D`p)h9H-g@F!T8A^QHAUvMGnjRglTT!c)-C(YwQJU4(srsz}%s*Ho^pSP3s3# zIbwc_bkYs1ue~I3b1hgkOg{oULf~Kn22$4ifk<8nBL{$1lueW8_JG76^tPIlM<5)< z+c8c2sV!=X-v}u{PDS%9O*$j?32B%SZtt3@S((@5kMl|+h5)~ed%`;zfbMDhGkeWk z#`!KmAO#NYzu8d=d{3M@PBT`%fMP?y*B8=Vq|NK*FD5))f*yfW8-IH`h&-c^EDBwn z{YmzNTX@Q?@8NVKhO`Hk|J~cnh7JLW=E4&Ym*Rk2b(Y1tt=_^xJOAy30P4^{N6fi0 zmKl@ioptFDZA8v{rUegSUtj&`u=O0uD{xv9%B$JOcz>`dTP|LhNY(teZe$o^QJmT; zBrx#vv!P+;WQ19yq0;?Zhb1=MExFh=zROQ(7vX^TLhAep-30FzKH`LW{>itRE4D~J z2l^Eb;@$J6#`eu7*$GiwM|VVkEY*y8)uGGYw#d1>&-vo?No4v3y94MnX7ZJ zE2!_;S-R$n`&obcYIPB4LObICC{U=WNri+4bj)}?N3#@%J}u3Xn>r;Gzd>X9;*XdNN7 zNwbfG#)y}3dAh)bnIf#nL*#EVS?V$%|L)lEgUPHBdZl(*#($;aJI~-7Rf)MV;nW>1 zFy3-?F-GRGJAod62=l~J^6ZDdwIZ5lUf{P7WDhp*l*kG-{`Dw{`&MxAQ+{?8+1rl#Fs0cK-P+9f2j*_(fr( z(egvl;a&!j_h*prMD*^?Y}K({lTi^QGe9*LJ>7hv1=vaN!ajTvuUY#AvmReSCB4zhvz2R7*JEjQHU+YC8eb>A|cJaK!!c!sGINJB{G{8qwvM z+lgL!gVu{$JuaPNr;CvrQ=R*u+o#Ejt`s6wsiY1x$-)#9_{W25Kuc_r1S_R%vb$`E+-y z_TFptgRjk}h0T_?vahz>n)?l_U^@EI}I0?uykO_23C+moMJF4QFn-^=ryYD-Obs%uN39W#%HV;B$zn} z0?b+DwY&r}-WeB${R1yF6IBPMnkpRcdcAbuW{5S=SF}}6%DwG(w|b*K-P$uk*0aih z2wIFDVQ+3hCvjixi=T1axjknCU41K!C>lO#3fMN?y?By)dy#{VIP{$aE9Ivq%^ujT zq#xa#`!NzoB^;cy(jQ&;RGI-Go=j6Cp2zgqA1zzRj(l^||0)KnF}4>F<$u{8DCQ?} zaf+g9Ox3Ak5pdnktM<(n6cAfM4~W3gYxTxo>kD9+h^K*cP-&xiCEa+&nVq z)d5gBbKvr@-zL9W>z;!biyV5qKzC{I64FA_@~&2kPZks|`dAs#u1`QmxSSO&0wg6T zXJ>}4uH^bb``=$B^Rr6>bjVG=qN->cNlSFe8eoMo&MU`z)=N{z!*%B>gCT0Vgu-Kk z#v^$8laFsZk|DwsdHXNDw#=NTv9hM=tLpyB#@)>fEHYHzSAICt=TIGFP_kBa=COh{ zvrp~%VM1{dyf(KqP_A||QNLx%J6Y9bI4@!QrDM~)2wZk(%4;jKKL4s$Z=RG2YfKk* z4+(b|-OL=mp`zk3nAY^s?~UY(5F4#;Uo`vcwiCGU>R^DCym-(v0^qnQ;!V1#n11;j ziikz@N*M0Eh-VbM$v)M&RijEU;OX?FM_*dY7<=*PV2+i~>VJ=DsY5R{oN?wCaJ1M@ z8k=)(f0m9bFyv>^sn`o_&-{(uL{t*kt?l!95N}QG)$oK*J9Gw$AOYIqH3sW%sxuE~ zcw-pm631(8ZK+YnNT1!{lM`R`^SzudD@giP@KskMkzoI4ENyPd%dX06u=#p8@TdN* z)}mLNWkmCs$%7>(Nb$!tF#8RL(xiYo7sf>;vbD&2_m-Oxx!)bOm8k(ULqyyalkdBV zE`;#Z@laFnw%1C_q2;49CNvbEVMEkiD2%-$2;dHa2fqcX>;6gIE%EDrmyS1Ay~u+d z8R-L~IEJgl+&~LW^(r}*@vfs;H~q;z9{PEHw?MtKu;M+kt8=D&Z6i~v(w}!6l~k<4 zw^tm}xXlw3?|RlfNTaqQvSr`aLh>gYzK)T$$Te%J%EH2UoSXNn!C`?zk}z$dH;y~W zISK-k5MERKnefxZNxP1>Cxd6s@U)jC%KS@IsY6-*d33ke{;0?0g|Al-sADq#c&>EWsA+pY z;p$M~4@OK!neA891P{x<+cBk?udA8QBK9L{&D1_sV`_>76B8^D^rof43i&+Wt1!KO zG#Y3y!E9STSujso2{SfD&_LDNSRdF+Ye)xj2hLD|j~obIUSg*U-U&2dyB=g1UA`Ah z&5-8G|AMV{@rS6^i$6d&wN1%&YYsjvUaZW-DkN0B1|;6`gHQIDB|RYXyxTL?;ib@{ zL#D1fsJcemoR`p))_up1^u&IH*-uE4iMDiSFMF>FwaLCI4jI4r+Gin6=)xW=B?uK| zOwk66;}Nr3_r)ir?y2V7LCT@ZrSJITK>4FjPHz+9`u1)2F4dcSTY3!mvB&xZcGGz; zr>?MvL+6vDJ6{~Vp4Bum5-0t~$TBy8#(;|TE}<0;4oS~)uMPD)f=ckW64Prf#~bap z#%L%XPQURo<0&6W;3=C(DNvtDe0?t63KyI-KDy4$h~?djX%F-S-{qn}F^{0@auJXF z;-sC^HYSnX>z;oRUlx|q$(pnNN9o|02a)axI#i~Wtjab**9^_aEjlP^gfkF?>^_!0 zX$nJ;G8&sre$n;GA&}*&Sp+5dzY=l4H2?I+u;^hzU{X$BHQvr0>?zTkW2?C)eg=uo zhXjgDq(4`bLDd*-Xt2&QapO%lGK`&i5quhCGq+MtpHA@nYOjL2@*BPICY`wvB2dxg zG6J%14tFUzT?~%jM@<*mY8X}(raMjc$cpu5AU2YLL|TJ9DDZ_pLwhFkuK*NjQcBvB z7^smgedkQSwvBhYqC_SqD2}Bnp7&($k%VHi4Vv;nd_pnv*mr;J;%Dy-U^9P-*f!X< zIR@6&K?eTH-=)9Rm;O%G{F>TmtFf8-Lo3HqfmO52I_UrWX7%S0T)`@-U@%2a@gil) z)N^WW=?yI+Q2#qwdusZo9Al@DotJ;H_aYai>atw5(#LA zHdXblybzsNNLJK%a=El}SbZp2M>x+wX@2=6rh%>K-JiTlsf&simA~5>N0pePoxX!F zt+{Vs)wj4fwxMWbWWU_ zW{x>SOY>oqdWyFB$%r>PNyAP|NlAS7KWv? zx^U4E<6vTf{}-+BMjY;N@EOM|J}<9}!!M5Uu4Hi5B`^6R?*>=Ac5V)W`Wasvb@E(| zhd zit(`ks}Qb`sd!u0?%l7Z_xAPLL+bG`d0YlRtD^jPc}J_T$MKKX6s%$vjy^nZ9buLK zBl%f%c&gK7!qBX zVRhO`&Y^Zf`wt*+q@N^BUU^~tdYQ+y0o89+LMAYw9N4MSdRyxa`KT6|Zs)#{GJjHr z^-pQ^2PS-AkjQZHRc632K~F4hWIr(8mYes{BD3K zwz)a*Ql60Jz@F-J_ZjDxmS~hjrp-q4F{kdymfCnxgM!fEXx*k2^CtD?3MSE}*4Qgx ze+711_J85eKTjDT#tQ=NdrlTt$O{6nc2&;x*IAv1t36`YOUn62lXcT}OrPnl5Ro3n zSm0frL|^ps?D?O(t9%1=A3G%7nqHinblP9}@62X~SDObAF5b}*czS-pzQ~aQMVtN7 zr%068qtWUO(bL16UGD^CPH|42dfTKaIp)t6*c@{8FAhC)e0Mc-#r_i+`Aj(k`RJvy z<9V^UB)i3cxx>k^Gt5w)YN3g84Cv!<_D~UMndqS5=J2@Wo)x;DwDu2ZKNjK%TdURD z`xK~NXiql?{(Y+!#m3KnUshMjfYkf_OQ-sR8N*Tk*)?`Wmi}qoOB*GU`VV(%C#^hg zjQXdbyPw^(2*5^%uN+$Njqwk^yQs)K<&QeG5b{*QaLdmc&&l!8RA%+9ABERhY~5kUXJ29r2S=K%GA zg=#rQ;^>~BAw1l~}me~nEzCNP8k6o}&JW{Ci&9nR0PkRk# zjXXuS)G+5aa&mQ#c-|u5MFq+!OnTQ6D{-zGFWV?(;ecZNk6p*9FLA3Wa|2C+IblvUqXz#U>pV6o}yW~H^;pXOd>gsmjmex@Bb5&ebMffg6(Jt+)u|*H`>$o(g z_$lw$i5w8(MB5ZjvBgO3kEh_;3nc&yZOd!N04NYePtF50q*R@1q`|Y1rMt}f^c1Ie z<)s?oThP>_LX>x4^{#tYJ}ZGi-E)FFq5przL1DO)%1uojIybjE6&pucFXgJyxp@`G zFfve>xr~6&(caFCD`9n~xam*4090IvybE+nU_&E#9xbvv2ETX-T`N)>E|wA5{kbXV zIDJx3#Yl=L3l-^(lOeku{1n)C2rSw=Pv&MRuvxLa#P?8;UGj;+F9bpx=lH3l zAcWRGN_P}5;CBjJ*tq$oNr4EmY|vT*@9qg0r$K-{Eh^!C5nl%&xz;CFw;o6l!P|4k{{^9{X^PTx)B)lbtCYj{u= zEf!VxKAZ_y)Qz>=;&0zO8#!r`Agq|Hs>)^b=x`*nU@emUaKyjD^b(^kRh(6-&rH#(&+RXT+`00Oy z&Iucq0ws0BF%wXZ9U3!qZbi{F`R+Kk8-e2z_wT{~Y_-hGDER!E9aXJXG=X#EJ#bL5 z3Yw*&$K;w?AM3ZhNF2*a%0^=G_ynuf2fLcS+gK$7ohc)7oOo(6tMIk>9q;PJrFdnW zTSV;iuu2O9TQ~c0tJUm=S3bHH^}TM_v?9n#^_%AI%ZkNp-Qzs(9o1>l zBXnd@P-DHhrAkdLg>f@XyS0U|;={-Kaba5voND_J`w0{CpUc$Sw}z(c>#R|E3SQbZ z3o+7YEdP6AQIEx zyuDkEZ@IkQGL$nO-t=vG3%TtXoLyI47>yk@~gi|{7sw)5x5+(?jb)vs2@LU;U0PO zI<&Prv~Y-nVxT7I(g>7Aq`ydBsF3ViXy<+2W~ZqrDhc5H@h!vzd*>WOv%W_D9)j^3 zv%{Ur%D6TT%#{|`5#7XFa-R<$A&Rw9M&XCze+sUfziXI|?)Bypy-N6!jiIXQZHXVB z*4gd_YXNYIoI%x=g$a9#9k+`z2u3A8hB03`o*492jf>#}MKrNJ25^D;XmgJMXZQSr z8(! z6zd8IdO0ksO=mA0Tk0*;fdXd67tI?G^ts}GIoW7nC6C$b3IVxnN4>E*J0?x!S=>#o zJ^o6l=7o8F`Ug6|uBm7{E=(seiDXi)zn?@(>TFyfXZCZ2O zrg*g`mMSodMrrCiYUJ?{QX_M=LnGym)aE+2YaTS}t^)DYxF64b5a2OSBeDn~$EgT!nJ;XORY)@r?v?uHsn7_bO@Le+e1VD8DXxY5h;tmOZ~z^^{POn+bZ>Nx~$dkAHlPa(1`&b7|t{Mi`a(->Xb z=ot2*7xkY1ZJ|wca>8=(<)+Lzr6KBH3{0@_~h_GG~#zu$QJ*k!N=Dry8btH-}k* zri7Q+Im7xu)9&+q@HrI`F4L|^ZxmuB($Xp z#_Hr1XORd(Fi6{m8TMl?PDupMBd9afSxSr$tR445f?P6($w4?(ZQZ;9T-O0zUP~)e zka;Q^Q1NRMGms@n9HIPTbb zc!JYV*V;(Sg|H#RHJ z2B$gvfctN$*eInE4+}?3@VAI9RF( z$PSVS;ec$P4>o}bsDgQj)&0Ayx>oD`TVc-^l`LC%j7o0{f<`pElqC{e#w?>1#N6>> zC1S?0+bO$wJz{O;OT@ew2gzdn)j3~i;7sz-m~^Z^kx*578= z<;G>}g)l9KWj==u4gg-XE=E1WoIx!OsXa>=$gJ!l#CqnHc6X_+TKl7yup1IW^S4^E zriTwK)oMJsC-)-%v&08mp1Lgv&auAxjraEhwr7buwL`(vrTjR2jg%5&dQ+cVfc)uQ zOH7l@SU+T}{p=HTKX;B89`oJrhxai7gkgcrS#(2MYW%-p?57EW50#ra@wa)uV~@wH zlqa+kIlt`l;w!IL9(#1$>;2y4(2?FPs}637b1XfSubbG~D2*Z4D?8Fr#zHXC!hs+q zFQEa9kWi4KpWnuI+L*O+xVj*=A>%-Q%{0a}D zc}aQ0#~p{Zm!3yrsLN`V>ke?~e^h;SR8(#Ewh98$Dcv9-ElP)UgM`FTQql|^(%s!H z4I&^?LkyjcbV zRsBG|0ot8fT3d%ELE|%g5WCf4ZH1ItONX&JGlEC&Fh%eOaQmKxnq}%>SY~?V$IMcc zrxqt>6=fDk-_U%}<>&kMl@7>RcmUe}>_4e1evy#Qc}5!C>BszRm8z;yym76nfU$q7 z(ziC_%z5bd!-1rqGiaZU-PkqSyMnRT4OaAKDdrTD#;8#I!WWL5@H&-XD-tDmL>_^rj{6o6&hYx7J7V~FK zQw_$`m<}Eo%$<{sM9MG#0=i{dUdC_^w;K3b%RyO&@_#CIpiMekWo)JJf@FD_-DK`q zRM3B^7un6j_{(GQyZ)3|`CDFr|I`+l-N@a=d`uWFAx8hR(2YzF)ZT{i4wE)Ng_YTj*Kn%Z%qO#lk;m1jHTA&cGLl-dBfaxnHN)nT1hq_)F+Pt zW^t1BUKtEjpq7?`ky$2dP~_LU`_Jm3x^|bqw(LVH9a~c`sr@9Sw^H8Jzxi4btsgFS z@0f#^*nLdA&TR3WIg8tjZL4$AU#VdC_Pu*C@Eje|<`^z@L0sCSe|`NLPu#lRuPw^* zjjlmf?AYm;Py1C_1ib0}tL6kVP!bN;)$Vk@su7CceQqWmxR$H-qkFAB)#ggu#d{+*Y1&-)%aYFWj9J0w#>_`$J3C)9^LT^P5`oG87nO z4+Tn9P1pL+UJVr(YIRm#{_orQDFAU$f!PX9HO_8*_Ns=}{~|Y#i1|+|9Ed@Y=UO9c zD=UB_Fl<>}bYDMOcR{=OP=Q{`@!Z6!Vr;>9XmmsP>257&*2hO8#LW1%jQG*!nHNQy zq~iUzR4voYN@3GQgaF&XY`&ZGnIpPjz`<)E;F<#9Mn@2R^0HWHFJiITf8&=%$K8lk zX6viQqsOJ+RIo(w=?LSJ_I5vd+2`(yAUQJUZ{0wq$`_)t;*lbd2Ui21ZQ( zwQ5IU7}AaFz`>Bs&u#1YspNrsbBqp%SVeOfw^n=E?3q2!%edZZM_Sv}!b}Nyai3tX z_P+Z&e$OS-YC&1Q_u{qQ$Fd3A`K}69!7__YMDdPxb!!);1@WJR%s!6nU-AT!mmzO#8b2GC#Dfwn zFu=~QV6gNG|Eif8?(RmJgEVmKmkzEUr{rmaL0s6`87c=ky+~ys(_CdApSPKunK2wZ z?GD-EuXbr&+P3VIurv&x?rLk@;e`RkZ$;`*lj`wK&)H zL{S63I$ZJQ-J<^vueF~&X;I0R@nQMT8c3&H!l?{k*|wENC&)XS&CdP%)6W3g(~F_| z=QK$?jj#fJ1|u1!7RT=vx8ofRm_bv0XB+0eGyhb-5<1xptoVAtunZXJt`AZmR? zPh)$3#>xt|###G{q%YgXt%Oop9lU7SpYNgm*gmCu*6fRStXSQ`*hJJUq$J#)i?!*|A_5KyXiZWhQ3y(We$M#^xb!1asLI%()#A`$=mC96{PR8_6_ZfMi=t4 z7&7vETw~k~*i_ix(k;ocE&$shrP)xb@1E8dU3Vyp3#d9e5;i-owQEMdWmV$I?LsOC zb~@H}gHn}bM+?OIx0Fc%man;meJ$>|&@u5qbtfdT_mveUEB7d1IA3dEueaxLstoDZST@9xk>(*OM8O{n#6>`PWoRszfhI%=fStQ ziO&OOi=2+)=72P?-&x6G%H~xG4|a+ZtBSmQvYtV(_3Ne&Hy0O7fF}ore9iPPz7N(p z88p*Sm8n+# zX)wHh3ZS?>EmMa1?SN;bHHReZpbM{SXB!-L880aFk~ZfF1M!-&b`%oNNBDH=$P@pT7MZNGZoHsAbkP|fvEk5b@`GFu~S{Ynqp2I&Z0 zXWvUKl(aYJkFhvfn;UH3NyRi0G#fLE`0pcCf8XGSE!mvR19Zriy;X2MxIngkc$3@Y z;;M&KDOY6MTo2kOa$)*(QPM$`|GIG;0J%vxp5LDQ`1#cOcZmD*J*%iMUq?Q@ z!^i{9Sx&_&O~>25D6qNiMm1oz9ypuI@)3ZUpkek8)-~@E*HK& z)rgthxG~-rO}@5SxkdhxUA1;Ma{b=qWoq|r_QhBKP9wA0nVVNvl6FqY^+0NK;22U< zleP%1!Ll0l+B~JOM16*uVsC+l>{o%AEdq{-x-(3fRL%8%&l#vG`cIc|B$_mxZZ01k zw)l`HEZ61fS=)(t;7pZ3i&GX4Tk-a90Hr0DdF+luqHhktg*@v{sEsnc{%*b^#qdR4 zQ6TBvx{shSI^iwF2Ig~kzB>S#dJ&fTs851GWl#&`WY)a-F~1}9uI6_^#XoGMNQ9g_ zo!?xbq?MKH966WK$pi(UDomoVCd7P_W%Io*ZpS*1Tazq%xH$r@S zS@|AQWxgNZf3z$eYd^@09Pe%6GTIv1eJxP6p*tizN98%@sgfCR+j%0)t{jsJLs(Z2 zZO5qOipt{efkio<$Ml=k>2ahF;*i!WI<+aPe#>k6U^mc5Ek57wR^}e>rAT@DwUUo!f*{QhhyoF^ZNa&DheV%@xa^wl^+S#E4 z(|ndZHHv6!{e%D6GgG;Y!Hb?BqqOzMhjBM2@F@Gj1}%H*Cok+u5riD+JLTGOx3R|K zo%ag|1N`F92;K&&rTsV4Ilp`i!BabHj&N7K66WQPR~M4;2b8;EBM+!;!YyEA-qt$L zKq3=@^}V^h$}8bkpFvlu-Z)AMe6Mc0$zgusLtG>UkrWRPps)OZzs+T6;q4r6SU7aM zBzB;(ywq&x|1A?<8k5rQyTep#B;Nn)t+UB&+bRaz@HUn~?gAdl{I90}JfMG`lVW?c z&U-mI)Lvl!$zsVqHYWaMH^xg`w%V2AR`G<1?DV|gM2LU7y=kP1KaabE)y>aeAm-^R zSgP)!d*tF%%~sSF|J$WUQi60FIw4x}@!eu~D-lKql8A+P8McFwm96_F4j?ibw)%z< zrIfR!UJqFWtGto4h@HILvFu7UN#biH~i4 zDVE6h+>?f3R z6g37mk7)Uy{q|%_yY_~YK8TZYn>=1SnC86SUA=pD{wYpZ0*RH|>6Qg}b@0_%UULhd zdkW82*ON1$j%%cUT!zF=%WLHoX@1?ZW1brqF8vGIspGLpyGR|wY~7?%r1jv?K>6IC z_U8G^GX`|hf(W+31-?F)aY$LI)9PN!%GvhfXp&zFzGrW48`h>kfE_q|(VU-ZuUD4k zjqO%W-#Qg3w}P?%yrr+Nr>XRm^KqUhF}NcOpGDj+WDMVeCDCk~cv~!C$7@3HP)j3q zzDV~I8X>OM6g=4-O8{Zlm>o#?45Ahe<_reX<_(cC<(wPjH#XJSx*%JL@cbwkxcY2Ea0RkdX4AZ9h4gPmjDuVQ9GjTk0yZkGGDY39rRqXyQ5RcN zn&&!aCY@NQ=C)#h6WH-Ew>m)9J3WFh^#9$G-sR_DnbmoFD)AfKfu!XD@d^6}6P1sC zP7b|l@wq)hUtLeZlUPG^UL)EsuDI9HA14Y=j*Y6gA_m?7lSp2tZ2`jt0SJ>67%3SU z)kk;BC{O05EZJ5bJ+AP>u-*|K6 z@SYj@@nC#TpzAU!<&7&jTE2LUZzMKyu?oxq z4W1D^7ycMAmu}qMFs%)^KES@f-wQ(6noSOSxoqmFun$H}#QtpZQL^OZ%^MVFtHS0# z!F=jXpI&IM#-~?puD2>v6j!8!-_@$5j4_KMa|emk1&suoLuSKUgn9)!$u+AaUj(G9 z+>1(~4QhXbPPl(#76oItX-3?Aj1}K{4%+ab`DB#NKbzOsY$Lq4czO0hHNuIqV5MZL zdwHNjplZ+9 zHx8(sG*ESGUxp@HoTNm2%kU}J+l7aXwGUtwcsnc}_I}D^imH6ie!G5nhqZFOj@RVo zh(#|bAnrxhW(S0#e?0AT7^7r$lM-1qW2u?fFUt>~+f)2zt;`sY6-&Kzt2-W zYVpm_FutKGE(U(P@6$o|2~fRYK*7U#z%{L2W&wN>kyfP9C5qYeEv`HUwG`?^O2gZTQ2R(k*6UHU%20~ugX=u;WF{?-ep5)d#ZS{ zwiU~({qpFhlh);-quW`T_`2qG-~J$s+7;fy3VQJTzR7;FdkjW6zJokyNxXLyNdS~jj#=# znI}~NorFS%VD#*6(yMMKstmdmdK1>VA1Fx<{tUlOri8_-H+T8HkR{ss# z$`5M-m*|~Ww2Y-P7~Sl(0YROYQ{eC48~%zinA~icz+s(d?AQshkDZQ(*>iPy*Cm!&j5G0z)|$Cd6suATMu+dV}2>?{SDmo1 zzd*qO92A_#xT?Ct7cpgs?eYY5txfa1MI@1VgZtRN>DM-AusM8cQ4bxtQtpjI?eUyO z+4Gmrl4Kq4=|nhKxPSj+3S^l~h7YF{pHgQc7ky#prKg8W^TEN5EMaZ2c3#k9$;xTf z1t*AyDpB~_C-U15XZRPBf3x3z@5%YIp)nmc3>#164C%SOA}&%@sf}&(>e~J~4F6Ix zzhm7M;$Oq4wRS;PTsfyx@pW06*%aYAcsxuZKSUfZvBizx1XR9H{nS+QH+HrqdiypN zsRrlg95TaC3*jYFj$>G$0dOJ2^dd;Y)22}I&mJ4i};AsCGgrbB)bX_*1w?Pl`_qM8)r@;XFXPQ|aFBuI5 zDp~YSNplQ4&&ryywV^~(lQTij(L%!&zX>MZrH<;WVu|Q+3YUH?1*=RZoj~Cuqg8Gi z*41CHd&IuZRr&<8ejys%zueng>u`Tl1m|P#m zkMOA!K`E`O_fbWC1Lf#RQtztXKaSjWPj!FzBV;>+3G$vsyeT@u|KXG_rcw3&*ic%p zdF-C6p)hC)M#Y z_Wp^JNAu~B>mV{|XsePp;H{<|A6%&tRQx0DZ5m8pd)~@E(^L{&wK~}(&-d9O8BkZD zvF>yw4ojWWeN0A9Iq0l~eo@-*UBttX!JP=(5)iBx08$5sbx-K%$>auFP#bab{e93r zvh!HKPOsTr&mnIW0g(Y?G3@zmH|cgMbx3W_31L6!Wr)%H=O z^4|*P%FVt~U(~6Dk5cw<=f-0T%&isD{pYvO@)w!1;BfVudK#Qm9aiQEP$Sw?Dpuh# z%??H48h{0#%x6Uv8Ys9TMu$LzgZiR;{Zy2)+yJ(;FTDAj z1^Ij2c1pC1N^)wuXY;xl8IkZvL-7cNg9Ju5((l#$bdp506!1Q9 zeFIVif6tEC-OdX^*xZbbiNn(r4*?V+D%uGK0|*6s?{k(hU_;Gy$2-obw+6zY`TTNX z5zz2Yl#~SriTNS;gxm$P*IZdrk0o+S_5PIWkm$94^v@cQ<5Av*hp9Clpz`Q&C}_#KgcmIcl3{-HioAO~k*Q$SFN^in60{1xXAlbw z&!2_!e}4AwJE6j|ZG6Am_`X4nj2efG?2jYe9Z3aUwjm;*r;IpJXNjw-$K>nOp@ z9H>BXkWq`QWZZLu0KX}O7ByGMC&FDZs{l3b$+#~J$d8Mqbxl6gm zeSem73$V`u2zr`cgZ}qspg(4p-rcBJF*{d;Ifus9I_JTjKYu#2=jAB@XX(sQh(M z(+XLpANGX4husednCUvVMoWLOI}M$gnYEHqcr`DMS?XMpiX+x@Z14NSqWqm2Q+hR(t`G$mKgPhr3Lf|`J<4)|2U$hCb4hEK+RZQ zb1j)@`oa3oTco$MX@2wl1^QPG?&C98?&Gn0L_qu@x}c^RPlU(b|DM=$STCF(0nXbv z9f)!Ju4pvAQ-(e=hf~;Ui#baIV*h=({B&($#FKa6vqfu7-I%y^T_*e_4a?#>npiI4 z2usLtRkjtqrbUAPGC$_ghD;$Iq{u-#be13gE_#dH?R7kuGrF63W z;pPV+;ZS_9nvlmEfX(_~gWr00TC#L56Y-7eeY{};rY4J0J`@w3CslPui5A~e%!YqSq zHiM6aeXt6D489M-+Tq?yMn=5d7M%iEt)+D=hxP zjy_R}fr@m;Ye?>SR>;=peB!~Ji_=*e0Hv_Mw%XwYPIQ3>`GGZq1&s^d-j&79)7iO0 zqOkYj5zKymE^|R=8Ws>wb*(CLD&6Ffgh_|Ccr~+^Rj$)7l{uxw=$RyI3Zx!ns{D2Z zlVMvzuJ;V;qUYGsjEs<)2soA8yg)yhw6|Xz_^v8ocyi;3rZAww{y=mRCdFRHqF%t9 z0RyB0Gb#<{T8=igu(2J9zm1KJxZDi90n|0X9}@3_LP#LGKM*SF%Y8_c7wQG{IU|jW zrfzLuO}iWHe?g5;X((00qI}jbE+8h6+9{mR4N1EK9Kw4 zYQqD8{B4FXy6BV;5_y|A%{Q?c#F)V<N`%!6jbKUqim9mTyBCNDXQFZJIH!g-k^ zdqDlfQ(kFc9k*Z?wkX(JHa=%g@w$5ac} zb>1$gp!y3Fa>i~jt`NaIs6gbSC-3Z8du=ES@*;aNig7@8RIA0Ukl37OT_mi8T$rb08dlZq77@wAp;T{Z94Nxgk=?HdmC5jAljbc!!6N%BPF zN6fW+%2h}X-71y+c(B9}EfqVl>EeBjj^^Y?TTRRkgK5J^ejko~|NgzNZ<7rWi*sJ) zk}og-fMCLq$JL4(_|+-1kLu);9AM}JpC>+(2uCHwN5H)=yxl@Yv#kmM2Y!ZjL1QNr zp9-7_S&|nom{3sKn)#*?;gxJS3Wl|zZmr*ZBc@AC9pXWjbQD*>laS#*sAaj zxJ==@wViF_%^o6kUO~~^)&$z3Z(@psI=bmut=@6qhk07pyA(VEsiQ`d`!}N|p9ss% z$AJMXrm^-T^5>-6-U#`C-eJCNZ=gIm@}mt*+hSgMm{)JPoAw&jDg{T!H*B2)IE>RnjvuW{Tf{S`{|@n+2oCFMfm0Z!FbNGUf;f z0-#wl*vS!$G2f`kr1;HCb8{+eVRueG;H21*F)of84`5dK;7wc@|NV(i0M8o=tM6k52A;K|?y_6#i3IGbUY$OaZfNtd)AE4d4+r6vauQs6VX9@yfYvPLuSr~=sth|MUH2*o z48-k5p)(W9Cv*+*8j4TN&B7y4luDQJ42j7SkvC^ zBH*{B%EXw=RCAITLA;-}r5ZKYXU`Ep&~UceeLi4~79rY(Vt99H zPG||6hlV~1wHNN64-$n&iuPP8u#wY{!}r3J0ZFb6k995^9Mp-;WrOKL zT)WJUfWoZfW?y1^`|uw7Q5sV!%x?M%Ne@p+d&fZ68h+<>PUpxeH?*}Ihq}w%sN-m> zme&qpz0vm1wdkPR`~%tU5iOdcPNIwCv4*P zS3ZBS+lR%6TM3unJkU-sd8^`Z(g2C>fX&P9re zVxtIp5{EGio7<9xmB@R>6D!;#N)ZwiX5lpfQd;9Hz778I{d^*MOBkHiJrY5^oO-jk3ejl^i?#dRG`TZX&wkIe+L* zD?Jxj;xLCgId95=cfSO&Z#V2h);B>2n!$L|-4)1`vwZh!&ejPY{&;=ON)FeQJArh; z8o*M2u4FyIE+5TZpPsMZJn^P#X%u>qGLj72&gyVa$rAB|2>6gn3;{rGApT-Qp&R}n zfor|z6;Mj+85`OC|5UVdIl{L2f_E&-@=+(E2@MJW1`wNwuTvaoSZGO)AzIkpV{ zd4-kRb_u8l+6->-M=!o9)l53B<8_%gWH%TwpAfgio>xiNtQ^{1pg?YuR_Gw!Qm{!6NtiTc6LM$nRVE{NDpb#>~rqhJrOn4gI}Da|H2Biy5*? zQHj|OPnm&YesM0s9zw2EIF3HuQdY?*BlRM%>u?mhO!khVNTK|O#ZU7NR=k#cw>FTb zV`PL;GL2!HsF@->2lhzt#TF*?Aq!$UADI)S*#2ECOF;|dA;fjv+;hSK7Zhf_4^f=2 z&gn+}lpNO)?7o?#!XOOVVEv9qUK&;9ZVR&uWw+b_VGPifbd6XJU1SW!;jDR~BYvFO z4C8Db)tCQ~5c;{Ptp3gAhUW10pg{8L)t};mwN{!8E-1#^7da>t#Z_TlNjB*y^eV;T z^p79Q*;m-{_aA(79d314;{siAHVHR_N2@L7G0SpOFToq*Dg6`KQ(aqb8-W=#!C`lj?M!92^@LG zE6OFuFiC*=>Vwk6IEon?BZltuHt5Lf?QJd})XgglN5# ze2Z@}Wbr-q8lC3Xz?vWzfN`BPc0Sm(pY3kz>4PjB+@H>!0wl|lfDeh?>l!D3=+GA6 z0&g!Q?zk)7e>ua$b!(izI(IcOv$RR_EgU-fL&j(hPrbgr+FHHjwl%#meyJi*G#L9 z)e!E~020Jj^i2)us8v_P+oB6$R*zWo$>fw;Dqa6PHh42&i}#2JM`Y zq0H+;R{$B0`oo$qKd8z*85;wX>M6b4j1{avG4gY=QRJ)Ih=z$iOJ!IEs~pQnknxip zA;FFalc8j4)>mhJbgWy=V}b6W5J2&y%|gjri6z__1y6wXvn_!g0tTr`nB4(S zftvFc=XZa0bWbcdpc@^IbVGN3g1z-NoXATNv9Su#vUOF*U??shA7*J6))PZdtMc{1 zv`^IoCzDTF4CAM^M^f zJM8MGJ<8m?g0Eu_(G5tyQL*Lcv|{!}QEx8B2*%4`N`9R#6mZ7D!6^^u?QMU!_gQLn zj-yN28fFJpsH}v0${{dmod+6*VTJME&UwEFV&4y3#D#D z#Arjm(UanD6x@txUx!HdTDUNOX>>A~Whu4zV4Vp-s>w|B@eC!YUL6VbAyfH>H@QNd z$3X}&*MlCErX3!B=U|{0WYBTyTX0O20(8F#Wa;w}>*)Iz$w?E=Kp%b_1V`^itL{4* zV(n!tHkj4tNMlX+a71?n)^M??yKZdmpx?jv-*M~zE>fMH$GfPWQ!Db&;MlfnQ>~#W zRc-ux6iO+mpP>A3p9 z4FVv0eyOFtJ$$O3Op=1upk`kTn{3#$kEJH;>r$@edhy~{)z$J=h!R9cvi~?lfU^t7 zH@!wRg_`4)lWFoXDOVEZfwV`8%MJ#s8t%zLz&WM%0r%vO*QKq z>2LIHGSx!wg?kwpSuG1Bp2M7b+>OG+!@V!Awxi&go-6lke4gcGG}M;%zAo^efbS#= z>;RUthhT*YrK|t{``sxY09l|=Vr00LH306oHVN(XFtJ4PhaE;lf9y-O1eOM$RhBa1Y9u?GO7}>uF!hu`nGA%MHc?d&E6OS6hk+CYdpsTJ`lGq2_OE zv6471L!WU_50<{;_%3)z&`%$wxrn(0v#SD1ex?HMqn?-oQ!k4W4V%U>+L$dtO^#Hr zlM^itZcb;!tm?-@6+Y2d9m6~0pWg=)2j6#yhbAU8y54*g9V>n}RNvkjt@Dfunm_PQ z%&U{B#2o0u#>I4Laa2$F{OhA{d5OynOJ|zso^d+StY5UaYBeisf>60>op#e;I9A*WY3E`_J}FWzOL<&|{$1u;3d(n(gw+B4W%#@NwheqM(EQx5|Q3apTYl zVTP}7n^|mdF$nuyDmhkMn7`%A|3npNhPb4?hF)MLzlU_`{OK%j797S>=okGyuta;l!ppMUFT znRjiQ^`qz2%oT~6-vyfs;~hqMjMOcC$`0)0OaRaZF^0=Oz-WWt9;T&_yu=we2uTC%iO>Zxw zNxKq z9`l?VVI5-$zHs0k6dm{cI~-?6ejmj4@mgHX+;)evL?O&hlWZwZm4-t;6d$l$ zp32t(?)**1JE}6$sR&`6(a9K$*H3~NbEFA4pfdHbPWYCP5*p`2mI9u00orfEVhPb3 zas#wZC<(WJ9{H8avBl#hQgf_tJ)s(tRS43dAYqn4ynlIG^>u{fo9`*jI;eEw%CcgV z(-|3YNR+{zdoy{OsuoYTydn&;K{Bt9XJnNJ(8NK1)u=bT$>$zeXwuorXaz#A4zGx6iq{*gk3|B>=!v3RE z?gZjj)E0iPD2y)}WsV)r8a)ous%-%ZJpD?oDi(_;35Fhcm1XX+a0L%x6W`h!T=Ow^ z5Hf34s1;oXE}9`xLd zy6G4MbV~j1{A5fOh;@#k7h*a#6*eep!jZp^`a}jp&S+RC2G+hc-*~XB;HH_*xnEou zdaD4Ft8Ye36Vz+h`OyZ1;~TcYc#|B>&**`&CUMjw#E@Sw`IXcHEz2<4eg0^YFBe?~ zj+0SD_x%$Lj9_fKp)D*7dW_&lK%7LBGUyLVVnn4rVY2|SB*j%)lL-%f^lLZmnh;dj zcWs$at1DdbcRD9(KK@BVyTiE4P4&xz!>5?0rrwFAFEg~TFwoZ@Y1uQ*BT#!K6Wg_{m_@Fgidz0*?_Ggd-fXEd}S&*FO>d{mh@b?jo-hUN4&Yk^EK4@x%gJ z#heqx*yk=Jzh!#E*^~WOxyp{T2vA4CtQc~kwhZ2Iz=n#AON@_kOP3q3#$XP zs+TstlaiwHQ10|l;WeF1qvyJllc^{e0lyHStayUWTIL&xzdmDA?W(| zG}!f~i)0m%5#}=~I)mVgGXYNzrV^=(i<`0v=qVrU;w!fileB$-WX*B8s`)oR;Y;J420ne}XOA?9pS-J`;~jWc ziIJ)~ZO7hM$8@x;W3DM+y;VvbDME!Zc6k5$076(w*z;+>aCb~YPred$?)=CPyyzej zA9Cn@c79$u_v|&A{`@I4!?|yCJ9Fz#k{Eu0A-}YEhLyVmPW4PU!lZ9M=xx&t7+sT; z6xF8HTnAvY~~f3cGoG(9g-wZ z=UZAFxo}Ix#YMG+j~w(`d&zpw?dBAdG3Pn3ag|> zJ(f;p($;xinUTRSSd7IMSxkXoM^enkQvlS^cTu*Hzet>OKQ}TcZiKIik+iZX1@VTO zM)HR9U{0Nsz=H#sYEoooX2FZ9B{duPDz;=5$wykWV@AB6W6`KnV9#l7Nt&?d7Jt1m z1e?R0pko?o>m18T&)SPup2AR${78MCo^#z8h1<=DA%E4DnRUJiFkwr;FM5ysxs7Eb zk$wml1hNnQ>oCgmF`Z>Cy3(ol%dWkT_82RCJd|I+UCow^B@4otG;o4Mcmz5Z@EgkW z`T;(-fOYA_K*?d8qb>#|WA1iFdZrO1Vy?jQXeVVe;%59swKl)(NqR)DjbWFP%|#VV zsS4l0tORBLt2HF?aHS%VDV$YpdC?|Pjga~fCQhxJ9p?)wpNlMQwiZVPNMS_usA_QI zN#6s#Pv}8i&VcVEZ!XMr{J2(k_8eU!ync^%4heRKi-7C->jQP-IIw~S z$B9yMy{-ru)pMDqoK%#JDm=NAu}n0D#bkEQ@b9(<*<$f{?urvCMr+H?>v=W~)Frw{ zAh~{UAxv`=d9FT$%r&m#Z1LfSAQ|Lz#b|t7LNI?)OUCimZkn5GH50V;x-tLLvGnI!=nYSb$*lNJfClQdr`h|~|o{hLwnG&ED5%fGx zg5OI$t+3DHenZT+sG`+e@76lp4^4YN`kHELGH6w)s$r^WB5Ii!GU$v=R>UJksS4GR ztqlD{mcpt^#;k3pF*jIbte&yBb3rY?-0aF)s<;u_IP<=Tr|%~bjO}%KjdXP zuLOSRQX5GaBjv8~t8n@$24f zIDLsVu#ZJlyMMYKGVMl}uA95sV(7IrZezaJZuhY?I^HUDu_2pD%e zHF3TBQfL=hbS8ZIUB5&DvCuk*a2oiweS!DQ5@I|E1S877!RS*Vwv{(eR+qGrq*$zj zfd?Mp>)iHYRvU|%#xp|n_x~{+y_&DHlda|W-&%DZqe_asnf@wY+2P`Yj)YE&i6F8K zo*p_KxsN#xTcTXwoJ=DKl-ak6SMtnNPp{U@u=$Ybk(7D8BMqw~YMUQRYuKFTK*es1 z)w;>w+FO+x4e3ozSXFV8c3{OcbhF>w5>jb`8&EpuhabL`Jmrs5`Vz>HLI62981;Pw zk|rkKAPaROz({RMW2HC5XMoatYBz<~^*JY!xtV{6FKtfL+)zMwz*d^SQLLp8?Q+(% zGQCkbl$C+$OK3c6vox)v62H+0EJ#8MB6wpMZUBXLHFkc=nQ1%y!^G+7)e<;SuI_q` zrOxN%NVTIhEsc#o5=SC*x@F~bO4Ho=@EF0T{6{7!lmMWhK69jBn?_^|pLr%BuJ9*V zm8|4>2AmKPT4beJCWhUozQIbdsf1&vS^|)C>0ApJsdqzGdfammA8<>Ozgh#;qQR(B z4h1);$WvJ6K*X)afZwda%-=s-u#%5=U6bR$Kldd`?^%Ns2B~UPWm}9$wb)%}4DRoX z2DXKz%Z@Cx_WHOd*6#L$&Y`^F6~@wbvc$5irIiu9GazKV%?v0~GdnN8c7g_#2rX#) z=4)*=&|*%AN@3aYsOZ1F^VZSTJwho^;ZNWVW}R={7u3KhHVc_V+bQvJ6nXk7`Lob;J*Gjlw^dlFlcy9S#B6mL8R>zLv%jYrm~2hPEo*&wq0YDX=c%2}xrH$6wU zFFwYx_`xpk8HMu}DfMSSHtQmWXA2ua1KQ$x+TYIWL)<4Q_qf+uaa~WVQrXW@7DwR< zpfb&UVTg_0(^w78{XpK4!^u56Q};02EiO=hY=Sao*mCpxN;05p2f~UCn$Hr-cEoKH zDnrWMATG88PK9?azw?eim?HHX_-E!j=%`5-&5mRWxZbm+i$76_2jyTY@8|`c`l*5?#;&c5z zEOoTTUENyEv)0F>L;Po}RdXzM+Mh$1R<%6dABo1jr=-6&Ia*ZFU9GH6!Yf}yncJql z($_HCJYjMiK;P@N3V2u2I6ZCjFlEXk{KTvzRHbbH%TZUU%1ir%qHv!!{1PM%CHys4 z@?BKI*4n#Yr;VgGOIqVp&6m@z01k zV{!C(`&x|#xG5j8_a5c1SV+K}((kMSU`~o+X1m}OtF2ivH|e)qs5Itd`M>ul$25iC z#NMWESq&29e!6>B!qRfAd-zSfK2#&ysk-NyvjI#1^&>19bS+nju>s-hByI`tjlaG4+*Uadk0K=6mhO#HY+p+FW_ct0P3F>_aB;C5E+_(C=Sgp`^RzapvY?W*tUk zCp6XKQv2Zj{Qslf;gel6P*aazYMOoA!l}$&deo&Xr~1*X5Tc3bFn7gOTN$NkA>xrk zTcgIh-d^}V3SCFYKwc#hAp|S#u(yOozX`UY$iilJ94nn>F@v(-ShxSv$hFJ5@dVcw zPb0sPOFqLdiA-}YF0b}(X2*y1rbksS)y+un3j{|&*!N!*@e$X0W%-!m_byIo{y!N7 zwCa93?89tj%q`jb&&rT);&j@@&7vG}RI92Y4=2)EIQu6=esn7O5J#~1Vh1`vHz808 z`09=Z%@Ztd*(SsCU7V|0p2P$?ODSnbeBRj!%m>YpiQHCW|G9&t%di?n)m$cd;ew5b z(M)LLO@N#u8(nQ|>Kfyim{OLJT)#HoR8nOW{qDfiU>Hw4pj}KK>H1dZ^YY_amg)-{>R?y5uNs(D+m$}oPzXl;$QZgNQ4_Hw)vv{<28)UW zHq}=6FWpAYo^`r>BbDFo7@N5C z|2`vqf7(s0Nv~#1m$m(oBD30VYTALxp z9#IH@K-Ihst=;7j@3=w!f|GP0^H-0=Wwn~+Of~98bQJosExjU+ZC~@ybT7L)O_Av| z7t+Q*<1US%V$;Mvkab|4jWmB<-Q`;>W}}N8yE_;~NgusC(xZ^>6s4wPyke-?^JaRQ z#V~Yq+w<14Tjc=qPiGO%c)H69()MHQt0syE+Tfl74DMv2t+YMK3JhV6#ibo!7E~7 ziq6&GsZcIIwSuY82UsCtGFK7)#j72Cbx~VumM)rM>ZHnbWcoMjKMDmC9!Ku)Sx7%xL z|B^Y`g$s>rDjh-FdOQI*s;(X>ACFYva0aW-Ge_~;djYSr08&|uC9qaIJLk~N97el; zaBv@)K3KeRIJfCUsS z7WNI0=sFOhr7V0SH4O;Jp+SyHfqwrdSXs!3G;hYq19=_Fqf$Rp{mU z=+Ws&_7RYmjvsjRvyjUsFDwoL*1d@PH&2oAw}nb;eXrL&+~*Q!f0i5C{zZeNjfBNT zcpz4gy;KW6OpHm||#l|2*5D?|qy;Npb zZ5BI>C-bDgcv+Q4iw|WHR-Ym?Q$$sjtZ?U(w>Mb;qK^+Rugv~-1i-km7h4y zuv#2vD}jobYs$AYPMMi}wWLPiTyV~{uBny?NVx;RuXy0F^Q3~#iPv&2Xia&o*BLcv z8lNQX@Z8MiXkEc&JXAFi#>lTJp>bF@er}kGrytL}(slkm8Q^Sn%e(f-hb%Fd)iDfV|{~8MG<|c7n(cuL}^zaN=O%V7XfX zR>v3QF@^GF1D=IhSIiSlw z!p%uw;Agw)=|rXe>usJ|d++!l;7R?v`7#_|TG1CRS&k;(tM;F%1De;%|YLK$^O!qJ^6RTL-UG3O-~;Vd1VJl@dcNohNQP3K0>ULuc{KF@{aPyO z;gXY?r++k!R@>n05nVn{Dk3hOULC{jb?x zOW_jde(WYL>OHnYZf)EP@O^Kf#c`=UyC8TD@ZidIzZa^B)=PB(*3o_X^toVFHRtF1 zm<1fow%Y;ae>Gc*E4}c#c;o^>TZ`MYg(#}+!#B;mhg+GJPu=+b7s)e6*ZL&y7b-aW zc|bu0dBI1@zk)2jpKBwWcs(LJ6XJDq1S??yT@K0eJ=~({3z@n2IVoF9>$7#ekfst3 zKW?1MVRzxiLvz#XfCJ9T-fUg4?*5x0K*Xa2q zVA$@ZZD3GnSV&g|l+}zB0de1kP1fZAU;bC6COG2|fOrChN@XJruh^b8%#;d`a)ZYb#{;g>u{-}G< zs|5C_<~OWN6EUDG<5IJel#^g z113DQF1_tRILZgF6K|~N;p@hL@;{wB_M46pwx8&lhWZrKpCf{eq+vyi2_ke|phc34 zMrfiwl{l5OUpk_Rup35$P*r8W$`v?RDZ*T^dH6fE^-M6qT)YIY&_LDS;W_NAe!Ti> zp{INA@+ptFcz$~kwj6gQLv?7*4Tx17a2~G$e+#E_snbF&;N-!Ij+Z&O!=9<4IX&s9 z<+NAC-_cW8EU));E(0IU`q%944qosBcR2Fn_S~kl_-l09ZpCp~|JVt3c{kjd zle3ZOv3}s1t|YDY`Fok$#}RlUWiJ=$%@aJ_WN+#dJb|chA&v=3o$}FV!)D{&IXdKAGNY#dc=VbM?~Wkx-8k^Y*yLbNeEk|6q+2 zH**Q2?>c|m1UYh3XhPY+Sp*s<2diJWcL!#U1nybr8VX6&SyvwEJzpki z`om%0_$7Ey30$|E`G9}>lFzgU(=z>?)oX%m3;2RW+8E-S6ARC#=3RLa_*w0vs zB@f3+hj3IGr+AWWOqu0aZUK8BFRhPsE80~jITRDWSD0Y8>?y2m7PJ;r)l{V#N|IGL zVx3{;%`g?>W7#>``i|``%wMd^{VOtM)De<S2pxwPq;NGXV)w4^3= zL%+gEFCB!8PzrX9I<3Tuy*0+zOm27J+~4czaS5b+j7>m-MvNv9oxQ9UzO|87{fr?w zG#Wj*{F`*eKH{IlwaDR7BYQN_(PteDMSy;^v8+N)An8X(ORly+uyZ<9uszUTY+>NI zNO3|YMdyhhSYa;(>^^pW_KA~ZFZ;NAXV9lJe~cTZp<{Z}hPga(&!SIfa=je}tWRkG z{~BYOuV(xTib`{fE3#H24!MC3KBry_h2?0PdKr1yN4rmM?w;#Z|MG%DfDK)ap8|v| zL>Cvp#l!HKZV3$yl<1oiqcN9C1|`_r`?a$M8p9i;(UE_xBTNy|uAcp$mrS2R9|xCe zoSp5Fz+AXFV4}4_T6i$gtvCiL_V=0YJPg-2FQ4mxHVaFgCn0L6HW0>5npSjn94TSem`AunV)15&9)ZLtt26YoQx^kLGd$D3lx@S$>C}9XBYz~n)>0R4VIVxP!80PgVuy*65{r!`uJ zZP@*Yg(96#=91RvaVXAA2l;!4tfgu0+=j+y;xgDrRZoF>q@61Jgn+B9lE)1_p0ufH zVBY7*HIBa5SRaurxu(JQ-jbh{okQ%5FaDf!Y^>!?V?CcJ%9izHS8{D(XWZwWRw)T` z9m&x3AP0-1yZu8=?4eh|I?C`h7hql-9+{3AiC#PbbWT z$!^Z(r?pX1yVYj5=%k+wnG*zOhQ(ndTKfhHcN+4F4ZZ2^a#Aiw3~jG4O+#K<@%gr< ziiHDXycNGck9awB>HakB2zNr5+3|krHtO#=YOAj5`+S7w2BjV*SFk|hq|=<>psoLB z0Nnnx!Tyay>-Vo(A^8FI>Sf-TcyNvDMXi#{JwNrY5X8v9ov0xM#tD~6LbunwqKFcj z3i|y06+!)%3ADNfs^t9;bEjjeD{WLk;qHE52cPI2Tz?SIVg@sVR|GFd618^?x`NTm6&> zZRsm@;yeGIaQtzBA$mRh%yiNMUtoR=h>5zVM{ObN`wTq8roEJ^n59MKu?xRBr09^u z5(%=*P27{6$4*~%OsB(tPG`mDUYT!4a?_xstAJMr&GP(`=f*)dM7!~@Y-Rta1?W?t zo2o|Avf&SkE6*+*ZIN$oiBU28!1ctJ1cDF4($D^TY9w#L7#0KSvXYBBaOB>Nm$y9Y zzdP7{=%)kqv<0|zX>?km*GO6%Ea@-e;6PJQFf|nApGGB+jw=f_RG}+l0TZMF%ScmK zS3iInwR2*`aLG$ndIHS*@&y6RJ+p-? zYf>!KAbThXFoLb(l%Su?X|XQ>69GO#?0mB^JuS@uL{Im1$Q1DSGVV*(v?(Kbl z+YX41j;5id4fp|#iGdy^wE`Tuo?>JKr5pg`?Hg7Y1PyY!f^I+*0|Va$Ttc*Z|7wuW ze!bf5i4FO(X61mG^6qa<+rPiXeMDTVp_-}wxpUkRs>ylr$-{REi8;mkn3g2 zTvcOPt)VYKmFbd0ddPurQ`d@NOe}~;NmwhAMk3%M($~Df2uetpS+)Ojr{z4a7Zj-|yqvghpOv3Nv>b}>d9^k|F(WK$5rDE;p+`SI z=bpNn!%xG+eDHUzw9S8);k9<7pp7@GY@DAY@H7`PNCdgM^xo0^A_5kjPjgz^mU&-7 z>r9vk;=J0tOhBwI+J5$Fy}!km47qu2{&rPa{3yX+sP$s=dNTlRS~;XG27mrt_63dk z{jcZKkKcaC4X{_+Q8{Ge4B-0JHNf7FWbyt*N-*PRig!DT={;~ zmM;OL?Yem*#zH=oX(62!E#6c{-?uo};%84eY6nmt%2$`VNyD zuAEO_nY2ZNOlhY>r}AP;Z@oMTU+525xa3jdQ?-%r*XKQctqb;9uE`4$BiQZwpugk* zfRaS=t4RUkhRdXTS`6gc;Ca)o@HrpWme_!CbB>%(apuZoB&Czak#2;G0T?guQ)O?$ z`z!7?nIQ9@C_8zt2m}z4qkN-)2pJvZFA-L{vjy)BA zj|L7lUz~HF+Km4`iv)5aGUx2)5`;+ZU{_K~j+w`h!- zi$sEq0!Xvo;36KH@FS0OE^kBuon6gutoU%BKPzV6zNNcd#-+q=5|iuWP<+M-Zfh7i zs`VK6ZY+3Y&PjmY(bYa=FjhCHcCgvzO~pV)?HHBA6V!g%fqSAA6%*6&7$2{ssVoDf zPZ;CF);OzT!6<^GB=$%__G`oSR}L6u4m$cB-aG1K&Rz!Txw($|WY+ffVj99iWCOX~ zFUyTyTO*!t2Y`_xvCkc=Sbk~ ztl0=K^qYP+L89P%#p~UCgZExD`1s<)($h0bg=W9Ajd_vU`+WC76uV6%4g=@s*>sg#MyUYAjG5^HZZzEb4R#qrfYp|Io_*P(CR5gz> z%j@;{1LH|67e+Y7D$K97f$G*pt{FB^BX#c*Im3+w!U*QHczpEmG0n&#LGs75q`J<< zzx$er*wm5WwSI(qghZuQ+P~YkWY^}65n=d>GnZ)296)bn!n9x4h*PsiUdh&Hjo!}l zA$l<9o0bl+PQRw3h+U76?*dMh=V0w2&u=~hs4H#l) zj3=4VzgCmke*7@v$)aW`h_EJ#c3LKiqD8mg{$Vy|OlV{~_4GakfCbU5ObC;M& zBxbd|s!cUiO*LS=ydsNVq9!&rmBY}1H{4uJ2g`sW5x)9lnmG(8olGqh7Jfv4WX($s zofVM49;|97LpSLfna(=MVWjNMU+g-8PtTX5?lioUHE(DWw)Pil|W8^Q(_hp=jX*HEGTblnHD}x>#A5B7LP^Na_3z??6p8ua{9KA zn1DL}eb7VEohVs0YWo@K-Mh`l@%|8F`$@@UPL2Q%pnZS@A7xA`#)7VMUGK2jn;HlG zVXZ}`_z+h(MuJ?XA=U(MIW4@32Kw$DDGMX!M3b{YaKSk6Q`R9$M`ul_O;$!)lo|hM zLu}1iW!Ts|K=nD%prVl~Li**bBcmkBLI<9#%M9whyMgrPIgE-BNzK`>jg=?{*#&Nn zA2npIEkvK@S?UIOM-25N0ax9 zvvJqfTH;Lb;K_b@peWAQJ0J~k)H8k})8|m6AWi^=CLH`27sFc|OBv9&&fzqHUP36zFP-tR61i0J&T0@t+< zUbReuq6(xx3T>XFFFuHJWe?Rm0RMszwHAFG9=fIZa{_7Ck%Zuv3L5RS@QY>ZEF~87 zLF~)jdrDc1d=>Ah45AUT^od=>bYo|WPit&G?^9=1z3FwIG2i_sCSEefkbACUhj@}+ zwK$sU=_t2dF1N)~n|s;s3Ej)5Nu0v;J-c3aP^)OEd?u1aDj20pt{|63Y#8G8uDV)9Oj z#l0qSwNTN=>V^_PZZpbjb&XW1k!Q3Hw9=X_o_W8QYy2)fPp>ym1#~liTv}6Pj$v&G zcMsKQp?y>u)r;Tz6q<5VCeD5`3XwzlxU{s&C~#hVv^Gzy-I0|=iEsJlkPaPwHx z4~8G7=UcIgA=mLK%VYmNSTN+7q5hOS_pP)Ry_V5%{dU|-Y1Zq8D>d?z_hv#F zz4Br1BJhRkLby$=jAwGQ7SNh-NIfb$&AvV;QmsiPVrNEJ>G>RM<&v-HHlOP1pwXN8 zejpJ+I;F{)%yH0ycUH)b`Xs*o=h6pu#xsQ=hXP=5PVn@ZD|_4kW;xXFfOD{5$Q?;A@`lsqpu(pGfjJSDkNO_d$vFq0Q@Inr zD=tj#NNv1qYQsiV!RnD!9~Xt}*~(W1uekZYyFzkVDU}Z>RAQfr%155OxXi$CnU@3r zWIgQ}s#{^zdb{ChHR_adbwU|=JHtf)vfPIFdDYlrFOTBmT5DNQ0gO&+`+YakB-)g* zg`y+mn9fWK?w!m+>hGK0zc`-LyE$7={D-hsJijjr&tFf)E1}N;e+_a2r;VZ_+Ogm~ zemR}WtL@HYzvF=?e~EQJ5++W87(1q@eF_Vge##`ytLB|K__&!Sa@k)mhH#!sdL}l3 z&S_^sZV?4U7O{pzUqTX9lHqZ}d45+Hg7hkHw!mIh&e(HbL1xEE?|>W(y?@9CWU8mP ze%tfdv4vtXISLDbrvuz{#jMpXLS57=6IbupGZKB!Ca0vS6TZ~ws&DXNp2p8`vL&-jNA2=+yPO zTV^dtI*z_I>~T-(*)*i9tl;rJW|>z{arbm*`L(6Ylun7GTxa*_=-GOiUsh&q!2RawZ|U93?rPtRYQOHw>orjS1Ig@uI=EJ9qv2NSrgiYZG=f(wh_ zd0?j(YZtM|Xl4XdsTvvruaoQx3rmg!6R$rxriMCSd@&IbKU}`O1+F@77<*g8Q>0U* z$<&!iLwVfaw_Uzwd)I3~f0*aMg)BjN9Xay|2@Pk?laR_|z@ZYCl(#=kV*-=xXr-hg zY-}A5lcY%~v5*;ujPcw(JY8QrKbcWbEVqak(1=ddY<#0kxx0U0;pCN7zf~d*+-C(6 zTWihM_QM4ihvME?X>NYOxStRW{4z|)^|k7Bj$o+SntN_-p<0CEB=X)TIu;tPD~ii_&@ia{s8su2pwl&}6Oh{s5lTxM+I_&!WgQu2$l_idmf zA7e%ax=eIL1+Ix6Z23v>&=^!QbTkgR?&kyEd0|p`GW43GRYyJ8O8qqpd_|=E(>@Ec z3!(pAYdb;fk>Yx_yaiF_H63t95pQn+f;WJtW<0m7-lU=&{eHb_}`=dKMz8-4IED zrm;~nJ+cRiW1p8+NZLvdLi}Ic1k74SsbtW%FA|=X!PlP#K<4NHKBwvH>)<49*H) zs*iUk!6$NULMl})WU*flp%d=i9x2|6rYj#Gx3@2~&8^fY?-Yy=7{cg*YCxeS z;oUxwnBrU^ZEO?u5`ztsI1*!fEACg2cvy-FXvnVfKi;&*|&3&`af z=5u3wK=@?3_&V63IBBvAxMX&SH5Tj}f?}@9uJn}k3=y4-%A&IBv=r$t_&v)bJx+vV z+C>x_JG(-j-3hs^PHb!ZWAW74^*F9TiZVG8@R~n2N2I@K*X?KtMaPMEVDoLxE01>} z$lZ)`)gkgrI zPZ^jj3SOkIekao}>c%-l8PXLO)18`8hd>EFK!l6TcT#x3-3d zPb`&&t-mt|o*y{BLr$|%)zKJgXD>ZDJ^%fEgfgmqMTf~yAi)N|>+S|ui$_^mS&@~8 zngUTrDc)@!u!~SI5r`!@xei!k$7RzhAw~cBij)dJYs@D4#ljjEUkNw zch7!)fC;q|J1?se4`E4B5!Oye5sn&Qu3)_HYFFfM<%59E!pb_W9C!!CmWe!)=N&ya zH-~+BRsMuUAuc{>3WQ9`!f<=0f#qZP75n&t0&+_$D;|#X`>^m zW^02^=Mkg#tnJR-iy};9-h+;=5@+M4Rh%i^%-kAYC(Xvz&}@+hdJoeK8TC&6^XG54 zls@LwS{PD1WYw)-KY_HAne`o% zGxmEb?}e-H*PN|gnvLt}zU;HFAJ5Hiib2zB#%jwtI!_?5YM-E8xwj1?>g8#Y9KN!Hy>_P(ThIU-#^U@PIrxjbWO!Hcwaq+Mk=h4YwIoo^ zWIw2+zOE@0ltNQ2t;$IZ{dg<(;^KfgF@Crs=)N?){!3@&X#7iem}&f1ck~Gg`JyaD!x>=j7Ph3%t!J~ zlYs|9vRU{V36{Am-$jDlSOFM3xN5xVbpu=J)yTsE-4#>mV>CAMQ-krW967G?kz(t#TE*Aex zTqBNTb8JF{E|J2TWwb26aw#|NspY69R2hRr_GcRsh)Hkfa-1H2v)~k%>uiGsl2K;Z z)<(_W{T*?FNCx2Ve0IUEm)_TRI;p%jXv9{K8KI_dZ%s#Klo{7IH02+#oDV^_A9Z`( z6Ga3Dn|lRDiiLTH>}Q~JYPYtxXM|g99ta0Y9tR!fFlptyv@ojWs&wCr!ULhIfAQ+O z$=_jkl$rD0cF2MJx8~13B8~XHS9q7mnluwPX^LIU9(XN&ZmDyx(DR?|S z@B~1%EuvlgxL(-+xI~i?b;d4;pA*Xl>vX=6z<5gU)0}CCjB&{n=X85_%Q;ja$&TpJ z=GjQb1XE4chaVA5oHr6(GS2c!%JRQ?J0L^`KH(ks zA<|P+<>g}hO60U~AsMN2as7nSA_v{{E|s6_Oub66fJ3wk6wIQ(Zf{cXWriAmK0~67 zi<6Tr|JPyYVEH#=|8=0#g2nhC!dv=OC82?(>v^$TX#`op&SS<+nVD3$eeA~$o1-w|YI zsqUvbD3P`WUeE#UXAVy8+rboNbsdAaFp23=6Fk^pMd(!+mzRFA=-!vNM;&eL?d|*l zLZ4$YvHWIgm<`MG3|uo8trxl-GXD|Vt-F7ZygrT1ofR!z_&TS35bV6fhH#Yq1>+j z7${(2kcORA^KE-^f~DYRuIHIaN&Z=RGXj-bU1Q2&Zua)1Q0qjO{qh>EmEE4?lZLU6@_&O5# z|9dI&J#Yqhg1?rbU52OXD)4nhYP>T@4!|h}`DKag22xLNwk3`U?Cu>Y8%FDmZ5s*} z$3C~P$qcG~O~Kk0U#G5EVOpChtsHEi;JgsB#WrO1T%DPV0)hzFn@KqY!To=KF$7$- zxNT=k)2x0pS{HKZ&I5WBgO!-yuBu7#v^2kK=^ifk;Ps*xjU2ZBAyL}J<5GS-MEb^o zOF?hQdmdPvy6NTQa&}e2=3f(YN}&NdmH(;{Mr*?$id4oBJI&_d_jP=r`5oRZEv&Lv zKCDJGfn4TEZqb!F|4UCG-VJJW_f@l5QNsd}1F0I$U`BT7-iTJFJ;_0mQBbl0^Mx4F zhvm=bjAoDYekXptq1T^6V+}7$o_B~QPOY-ju z+}KHf6eAs5^N`2kiBPmPM-BV&rVZumJw_{_)}jyJD6m1PC5!;4pOPdW(DgDC^d*yZ z`LUUT@P%5r8dE;MJIenR`{8;{A)!=e0sD42=m`t1=bk0{Fe<<^$OSFbs#6waiVZB> zUhJRy#_ja$_R;~JDKhB#Bi&VsY z=T@%qr0228uj%mn%}_7HYO=VFEqARHCvi5!u9aEGW7bTxVcur0urYgBh39b`ufS<&} z<|(1YzS>s7?{QWJwiH^_fESZ-y$LQwI1yC?bDt-Pz5XY#kmiY1MbrOj0fwbgvBcK2 z1?`5Ou<#|5T_C4aD2RleeLif!Bsb_E?0n!E6)+j`e4{ll;N<~xrj=1r)!KG5s=^lDCFHt(7JG!Q zLd?ShMOpZf(5d^409>PAQqz(q_=5VcZi_r_okR9sg0QU3$;O5>((Rc*(yXB6gLhnIW`5twe}b@n3e;C znx-!iQ7^P9t$tV%_G@F==pV=gRAUOh)Hn%=6aVz+V}WjgO0M#S2*-u{k|bUJIcY=z z(KyhSKIijAFy8@`{IEM1x_Caa-Y4hnp->2F&g1 zfTyrvS>sonLJWSv(2zd$zTq|kX*aF9)Tul_#KTf7s^y**!2Iem6}gObu_t|Sv+HHo;v+*8MkqE+7|0hrfOh!S(e zU~Z&o9wO=EqHMB;bJN0f_Ib~B@>@Mm+Yf8RI#3j!K_T1b5{67#uY?0Hf@35E-(sw?)Br) z%QC#%fje=Vv0tEPtS#F={&%DET)nbFj)zcc z-W?+f`XAU6F-*xCTvCBW86Et0!N~6dffFSz?tG;)0hl{jKw_i@;5{E+UoGmByAQXw zw+jnZM0r3YQ+)Ug}aaeBJ6-6_atEDKrvw~y|&uI+?YGyWoL z)!EP?qCI~XYm*q5jX3Lf1}x33Gs0n%zo~8g5^=FPsc2Buz&4oIB%&wFhjD+n68?Go z8=bqx=%|`|i&XXVWam}alo;Jm{Yc)Ah7R8;-xWIYD}mFX`I=DliShpvXEuI0hD=k-Ka;=2anZWet29BQu|D#0dy|OJ~Mu;h*Vj4*HA@1fhdys;GE`KUhxAR|3J5df5qTtmu!~47EdwQ=lM3Xp zJj%CTT^_FV!NY6~KIxDH7n!oG_=?CR5DX-)?tdgwGp~C>{B7B50{xb@_TTM&gD*P5 z*3yQouSk7EZNqs?&Fe8umGxhs7y3W4bI(UjMw=dvhA1gO*enEom;;n#i86Wqdqg1#F zS{u4+{dHwem7uP8V^x^UC>Sb7)TB%~Kc&ZN%F5l_o3?#u6e{@0%uCiVbe@u_v)=oF z&jAP3ffarjW{6^OKZROwC zd#~moqTFq;KiIrWLe~|tPNi+5K%t`zKo^r^SPT{H+4g{YbnN%|5RJz+kAE0pIonT= zIo6Ktlfr^~tFf*fOPsdkp4g*>c$I<{@B$A6D7?QAj|^+W=2d)T=<2sy7rt>zoHgDg|%12k}kZWGE6??*aYFKBguF+zjIq< zvZ3ut!`QUG;)01nA4eZ6ezm;{y!37H$Q>DKtxiSU<%6n+2A>ys^|IsE^`l$}D-7el z0e_9nPKM6H_NilvvqDuf1oA$d#;Y1H_WVI_C7ItY%ZuFd(*2^q%CYh?2Ei7m3$W!AOKCtR&;xsQF7Z) zC(gIm!r(fd=#)YQ>voh@yhmXC3CpUjoz`a!A@xdmd^*8Dw6dhFmMw_HZZPK(l)8Bt zLt`jmjY3DQ&yY|}nj~1=(I}b^8I#4;SyWkAjQ@p(1+!7QocnXuO~Nn;0{76fhldRTWR_f= zZvlf13;5)K`Y%%HG8JM;_oAyBWCWvFfy84tWzlx3(w6T3rs`7(Mv2 zz3=C~?nq4#b6w0F6t2zC(=6L$XD*0`sH&L;!b7g+G3?iaF}rU2Tc47G`CaJ#tsujf z!jpr;bw6JkzNT?K#D)O4Ds(iHBMFA`zg}dnFU)_hI1iqbr^+F-+W*Coqr$S^KDE^s zUAQ!Q^=BFHpA&}>HueNT6E&I-Bs^_3pZutD4nx(c+g+b9lB~aJ_11H zaCM?yuIEDh089D#20$DJv=^~_n$ZIazk)y^edx-9w*qEnW`MH&=Jo0g1u%VF?eKj# z-;f3ouDJF{7*=%)sE{E-TE7iip^|CS6~6dyJ@n}Q4e3o0^Kp9g10NNdoaF9+XF|XJ ztj&WXusP|0xCA^#|8<*s$a4_t$`E2g#QaM*F&VSWuHP-7#MJro{G6f1fiZxj{->MJ2d)%dJ-_|pn6l{8hEZ5burW`EZ47c>4zB?W+83MO8lUDcWF;&>_l zX6gj)Gl1vrb;~00a{)xiDV4U}QiZB}lTMsXg|TqWLc8 z+;ZEU87}COWn~3f@X8&KVxcH=VbGyEc`SQbJbV4sXO9S}Y-^Mij1F<$xHPQY(w@`#{=9kzLSIlKD~82D!92t1=D zs4eO447tD!`^WdF3j!b${VQzQvXNvLUwyUq)w+fz$Xs%jBkrCn?88guL5m<4PrHbo55fBAxBEA?P*xQyrkuJ^(bJIW7jOwB+!A^m^r?)%5+NL zVSL2!{d*koBEqm1|3dB5@DUUGSGd{!O=!5aIzZ~Mn)Sg8mm*bs7R&Ttwv#T~k5@|5 z!ZXkjH-!ijV3V?6w|Hc#$cK-oRH>Yle@J`Kp?=1!jNNb{uBWR`UDKr7=jwp0YmoeA z|LOVSEJQ;2xEYBFPhPx(9jbXU7S7pwhGbsKe%A#C2rEaYAvlE329)is$pszc!!-#^ zsM<%C?D}uhFhGe44^-yhzr-I#C(Y~F)81 zArb;M`O6S`ZH)F>%AeifD=x)F6;6~1j=Jh*qV4w#6D6&saFUwV_O`l@lYp|R>(AW8 zKhP`p($Tl06Q7v4q@p5=Li!(W8ed0;QN@!evVK;zq@>i@Aibi3AX;7yj5X(kEt{NZ z;WJSHJHe5em1XMaX*nMd6C>|TWHsf`uAeqf@_lzM{1&K)4SnwEKWl2`SFCo_o3r67 z42Xa|I1GB}$s#N=6%-T_CoH%(S{o_|zy|zpKz+ov@s9?V+uE=#7XMUv?4cG#E(ZL)8x|%~fZ+&u;}Y5r zK}U7=F7arz21fO!=6n-mbj7=Z**HNTcAiK1vGI&=zrhU%L}`k6zXy-%lRL063k<;h zEtcs0B^7d3IqmKA8F^m#_%82J29tLZtI7tW?X(oz-gul1kS1jImg(b+&2^^u{~S?c z2Su!g|1XM@9t!Yu-pU!YHGP~DFX7hjj)0;QUn2M&AfYB2KFQVwk@QgI2T*u z>in|{R7>9y0HcVI68tzTC9*cjF<`zDOKx4oF-Qx`M3sLGZ-$$-Sfu=n0piZ1){X!rIp>Ib zO5I(B4;Qy7nNg_EH?sB6HvKjCG*jl~v+5-#X#K||#O${sFn4MnV)qMAW}X8j8kn=g zKg4vCx0(xggGs2SUv;@or!DL(=E>ekTW5$K9IYAh1FL4j#l>2G`TOq?h{%xh7dF@? z>mn(3sE>AtPK?YzRj5f@P$1QTbEG-=ThG|IL5#=#6OJ01V#dOSRWOw9NchQF$HY9CUiEo&*wkW@Gk9`g`7 zx&yM+s4Vt_Kilkfh5_>SvfS}VZzPu3%vsxbrAy#vXMm}dtU99}gY~xs(jZVj z%+v<5vs*k@N1&#Gi2{8>NF${u;4^)?uM9usZi$O6IXrIjLL~cR!5R}Ar)+4b$lmlC z^&SLL)zKNaV)l)DO*OP%?HJzJc<0wCfGdfzTx-2r-xkj_%35r0uCAfwa?$Jc=-uAx z`AUc?a7lZlnabXRnoKqNaH-W5Rv&ln!xJd{RpIUyaP$tn+HY|_B=7ke!QAzT1+uZ> z#0p1TkZ8Hv`=(>4(!a_f+#$I{A!)GC1JtR+uAyW%h!*Yy*H0Fy-(fQ<32MOQJ^9Kb8>tyg!?Cw#~0R| z?T9dtOx)@Ca5qm=>A!^DJMd?$mW3_kn4$B7Y9pz{uq392QEj)~#AX{c6&1!sOTT8@ z_0<&%C-pnP=rb3GQid8=5e=T^2j!vZDfr{2N!Fsqmb=8XawFR1R>)sez`)$q&GG7p z3S0Hc!_C*aF56T|P>vnjsL{^kTk`A*W*sGqLRNO|jmL8xW&QqdvSgt4JO3)grluA` zflgOp`!V#zL-POA_S}WXTlCu#MWJG|EeH;|K4EfA7*Js%tEgx-7W@$q=>A=NH^KII zPKg%VVnMAcW>n0VSK?Dp3VD;lEjE+rU-->@YczyN#?BCQsF>`QzRpfZ`@EY)!{x1Vo-drLddqg+0%jW2y6C2DKAE8xp~z~S zdoF)V#C~x%92`|1AWTQmPDdSZn&>MOa*7ND(ph+0;@;=S*X^lNFAq7%hhGZpVsc^D zxa`<8bIODzmS9lIkaO@W0q;m5XKk@hAf*@pbq=dpsh4Shu0fh-BMoJ_UnPn}l9OEq zFokpAUy%e$r7NWC?OV1*CAnlF=fzw7oyC_#%7>h_eUBA%Jajy-bq$@nISs!% z*SqT-PP~vN5UZJX0`rejRiftsu6y}J@3cw<5|xft+xa2$O?(ZH!x=nrktPnsCFk$fsFy!%iY!%3WNIOjl^js4N^?8C-<-YR^*tEjRLgVQc5v(ugsubek+EXZLD zX^%#$yjp!;B2rSDCi&OY_^KspY?`(C?+|p;7|f=u}600 zd@mj>0XYk^|9-nG7nwcWFHtfiaK1X-7WXX$(K?I#OvYYOAisRA_6DGs(QoyQv|=CO z>pr(@Ys*b+c_CAgC;fg~u3@_j%{Hx#WU%lVJ9^fJ!*_BS8wN1jIT08cueB3=J@^19 zb^uoiO6+K-t3hPJr|VL)IvrS8IFh2+kG_YBUCdo*b$m<-(v%o7h~y#hkXB@_TZC%0 z0T&z3TrgU#&wW?;Icn2aLlt%PRdFuSK!SGr0s>7^Gp)w3?*?`Z*ILCtIzOK1Mmqb$ z4y{G}{b>Vx(PWQA-&XZ}@(9&?cW|ikG5jtbQ>zA1Q`2|E{QUu~?74p#0hvj8uHX8H zJkFr6n-XY|Hh@#@FMP$fc;eG?9gJbhRP!%in(n2aNCcd`7w+P0)4DfaNM3%J)c)!c zZqQ*j*w1?gzXdvqZM+^zL9P~+gnkA%rbAvY9i#)>#mWDjO{6%vmkEE~qsH$}LSvzOxwQ;KNDC+0kp`yJ!n>8hk`K&8ti*f($|xZN}UbkH_| z*zFi7yHAJm6fXK|LykrZ-|<_;w!11c`uw;I6m1+-La%`Q!j1AbPB?;ehagIrebb9{ z8tqPaq6InI*qqpJ7-V%w?_ARPIovQ=->g+*4BMDnMMP>{&+HAPh^BKqO6?%J1 zy-f+}V&3n7Nz2V8!s1Z=gl}d~`TD~ayFIM#<%*P_dLzme_RI0qKfrcR5B1Zarg!rW zr3kf&`;#jzI}&72ST~^Y5i5Ojn!81Bp#|kXiQ;6It1!>CK5;d3KOED1F&$UP9%?6V zAQ@-9nC3=ZYnQUgN2WKPezHM@!kI(6?w&{dy)#K&i-D~;U<^c#$`F*O@OLxes^ZHO zV+QUSt=tlCwti-kTp_4Eos4J`_TB5>h#8Ow$Mej*AW;YfoFC{j_CmWoQZu5}Xx^*k?osC+h~oqtH`?efD|x*|lba~Y-9sRmxZc40#9 zoAWg`UoJ#41DZHG_QhAkpLG%r7~Ks$geraO10!{=mLbk9-%XfNA(Jn%oe_PvwSMwTbEI5y9ji7XyoS=I6s9FHKm z-&%?setFu)rCeaCe)!C*xSQFb#eX8-<+H5He!#mdvga5!2S?AaZjgUhe8#w}t|bSY zQXn43VL)TN71OMl-fB(Po#i%ylL|7fzh!#45{=h+k6*7H_UK)z6@h)xi#9AI-=!PDaKZ9X!3l+?r}g7QXbC%PQlg_|j>Hck#+2`H)@v z5XaV+{bn>n(h<5zES(Mkr9zsp0=O;tO+;*m2^Af>dUvS^w}A)`iQBHX;~?#T^e&?l z@zB2fM`D`MF=_vVtB6h~y6` z8kY|mb&I!lPh}uc*15ront)*4s=>~7kB9S@yD!K|34P&tk$+xPoD9+)9(aI&X35>u zSB{8-i%a-z36CEm(nN<07#w$VOHr+D8Th>JVsIG>g?M$PMD-T8%_1N$Fc59@&Jp;= z$H&KcqIY@FQ5dtekSFemFoFU!sL8AQo$YvSUH!k*n2>`5pkZC#);6-U!@Vl7+EB~} zcqEUHJ3q{%0UF9PS}Oo!FE=|l?Osv=q2HnFhO@viM6}@d^(-Yx!2SDatC+Zn38_z~ z5gbW~UKDG{f$;q<3gS3F{tHi+*Jz@o{BR3Z+q0wG?l6;8+dfQP5b|d!oO(E@TQma$ z9@Y$o`e>|gLx?dQ>R1wUKYzS@aXg`$+akZQ33LOKXwYDcV#Jxd>tCPErlIu~Rmcsn zXGLPtXzN~H_`zs!y!)g9{wM*)oxj48Zdc@RtimxFy*DPcM=b(9vRP{lt7lfP`CF7w ze@=^nTWV%ZDt2&$?^}83Y+}sWJ)hqGdxKxSzv-O^XZGiRwE#WOGGFp6PtNS3LZLEl z-Q%*k8|{n~=9(Cwn9}4b85n0$CpNsCtA+nJ04MPC5C_alt3VC86{D|df0uMgVvB;k z5L5B)o*Tc8-%s~rk#M4#%#q_7cHfu&nFQ<}Y1B7&@(wJ{@JiiJ`_)UP*y)%0_W{kz zFEUSykGPhJ#@2*Y5Vj}iVwi+m_zW>TObz3Q zGuGV!*2QUtR@2k(Rt(b8i3bYG*`J;FYwRg}Mcyj>(!ZDrC|y+Jia8+H`dVf@3AHLY zlMWx=TW=W<1by6m3Uu+D8;sJ+nlQN%Q2K_E>@dW%h*^U8*E~zyV@ufnQ561YfENfz zhumv{HqakdqY&H&20eVy@^$btyB^kB<^+}_aIZUOqV;?dPy^n?ESM+Gd%8XIn%^p# z54jgF&Q+ST7wxUjPE5L2HCD@)d>?E42QPD|T;=xrYjS?err+l_GjdiG!cHEK2UicT zLAQS5v444B#CBkGetGL0eCQ4!rnlKr=cg9R+A4Z`_@sHp=rFRky?({6MwR_>dy%-} zPOFR|HPVa=S)1N*=SiyNGF(f$rRn!e-U>zbM|2suW#D{bUQYc|?U`Ah$Bo;VUAdqa zefDi_^_JT03WOJ0nRpdF9B)u-E;oYVT)U?fZl$r|2{TFsbIeX??miZa5F+L=0E{cYlGT4mP{ z-UU0L{QfSbQNga_9>`XG9_;cXX}BuXmU;V$Gwgj%4qa;Fo8UvosUn z`V4sTZg|y_KK;{<6QSOfa{*G7=OemW&lqJ|!s~r3n8_Fzhv|lT&zv&c(^5j@Br+2P5eZoSO}uaZC?HLRYAP7mB?(l z{wEt=2{lc6cKXIzXFDOEKa{~j`5cHJmtcDfCogGoKTq~GEiJ9Z{eiXEBv4-pu1G4b zkdXB4-5q3g7x)kL5p%%fmD|_THCipdnjoYXT{AT;BQLKHm^L*iRcCMp*t$xSUP`HG+2y01c*Z`4RsLlWsn!xv#WnJ!i5l15;`aVyG16z{x z9JU4l7cGUhZx*^mKvk!|7fSQVuzg_t9EWOK?+5nfmEfXt zjr?xh>P}C~js`j0j`xty*1M&uG|jKi(ZeJq;X^sGX(uNqowgr2G&NIYO4+gneBwOG zA6(g(f>^!(wi^8xbceyFjG_}^6z#EUHKfnNV_jr6Liy2>TY(TY*xXkptC`6|q*%+R z#@gmgRDQM4zC)JySU^kHhEARMM_}Q>X0l3+kuk9ChG<78dYLRjbAEA7OiPKx!`_f@ zs!J*^j~rX>q^-=|>>BX+qDT*utvXY#f6Wzc>0ae!W3z6af5mUq!4TB!}gEH9Uy-TZ-D0CV2?g02LDKRAR_RmID zwVvh~wa0hqT|%LFtiaZY1*dW?8{E|4^FuM$ydzN|O4Y>$g zxBUbJwCv}`?VY&NX(Xq7Uk)*L+iAC^;0N0)b!>WVndp@Zq{!+&)kCUH+&NqmTJI?; z&$l4Crsm%=7NhGs-X_;ApI^SrP*}6em9lG@+=vLG?Y>^p=9F^5X1RXC=u}Y+{*3Lw zVA2AcQ|glb#ZADEt#ancgbPT6Nh6}6)%7`)K1F&X5^S629%0&kzs7DzRyHo*+%i&p zfJ6O*ZiBd)OoXrva}p&6u@xYEODRIlSqSTMJAdO#6Y=-Whz@X!49$wpemZ3%eA=ZL z$7w^GO_l3-TJMru7ADA;X1|!gO&LHy70mv+`-+g!XU!XD`H|{I!Rs&XcOzR%O?lIU zalwv9FTr~p61E4h%-Y*NfmLNQj3q9CA8bSJEG6`Q^X`@Ph zoWufK!Y0ly-mclYo`adonNkmV7edwC((kPj+l9KMEPlpPtP>U3k#?EpW=Hj%q`AZd zaN{KxZg0*9ou0kj3(gfIWEL0?D#X29qMHy+Gd@YpP)l|3^&Y*LQwwGat6+t#6Zc2y zjTz+ZPZ+IA+zZkKyil$(@3=Fj73;~Z1l+y9F`2T==;n-vJTT}3yV2fmVG`t_1%6Ju z6lATX`81u_;#A1{v-bS;L5*&l6>403I$8xPHbhq9)`8?<4e;*$pz5F$5 zE|P!LBlW}3bHv2SuGf4a1OK7VmR3&i%_ik!Ce31a^sZ*&+D=64H^Xrj!^ASCAy~v+?wDA;pK}5iyjes6)rQxW!Ivee<@vmN z`#JNY`j1gyuMm>!Wr{=i@>lMHkS@k?yZxG=gpe`YkG*(FTgCX`g%X`igRjqfe(VNf z@MT)IElpx=Y@-QUaf$rIeGrgZJxD>q4lP&7-vn#@>I*q+X0=R$52En`4tkfARI@BY zNj_*i1Q`c2I!IqCU7B*-d3w=>WcW(r9pHi2{W#kF^{W*;m=%vm;Bu^gDQ?^GB6>0- zC#SfmD9MplT(EoO<>_v?rkaJDeQfIdJnjJi9K{0?bSbP-@kB%H9!7yGH4FFG;JmHb zW3#$b$|M=W1#=7UC^%Eo{%t4T_O{5ut@e`lfmUP-)5BQ~-F-mcCH!9+n1+J@!v(7X zoqE(~dhf}gi&Z0iJRloSg1gQc-F|mcdg4P_JbsT1FCRXnXKB`l^r6GTg{Nm_0QUBA zc`w(d)Pp2nGqHiJCR-d-V(aSa%EH5Q(SK$1XCKdpB@FVkqjlBswB5a^;d#*;igS2+ zy1b{@UDq)NKqz2KDHSHd7Z&dRy%wcf?U?FnroBCjR-ZeRCc96Ok~+Hjl-+H;n?V1v z^xu}hKm~|$TeZvOto6t)g2&m)*51vryh2QHp>o9>U}XxpP_wXcNOT(Nc`#v$D$`*< z>?Fkl&VqaW!)k;)-bf0Fxq+R2FZ!MrRD!;50%vPo5^ap*hisP3-1{W?XnB#r?GPV8 zLg9F|hx|@4M^KD9Yqf5CW`-R2Dj>5a$~I1OvHaSFq&R2P);|4H?t;OiwWdQ}A#8%& zqPP82|B*bI07C_tz2N6_Yb~xR))kIMY}og{z4hW9j0Si*7Of3kl1t30EfjQA z1_~=Yw8{(w9R)tTPDwc*8&x7p{_e&OywChl=tRFocQpfbriw8tar*g`l zQf^NfpWI1${k_^|yZ>W(;A*^{oeR95kXCXTm|8(`~aN`lv+9 zgQW+MYklN>Sp(5I&kab{FJx}14!Wi;lr!u-*w(AYPE}(EvJmA11p5v=!ceujpft43 zzopgQ4SAk#;#&0gS97bURRGD}`3OQ>`V@-7ZrVrWTQBV=;DDh0F*v~ic~hN8@cBi_ z^E~Ox+M6Zs`g6@X<$UX2W~-OcTR{WoW#bEfQ`=JILgT-4hwk|gX}e!YwC!4a)QTmb-*$?FjzEdr1TdK|7XAb;_1)u;21^=bA4 z_JKj@4GiFzOkYPBGKmR>{Rs^`FZ0X~D_bv!KhaSDt zq@73wZXCURVfa4+f32AW)2a-Aa;KiZ{c3m?zCFXL*#PkPqM-uj=j?UG457*kP_@ zJNFj)cQjnDJJg6=*uka{x4f6788Z^a%WO|)KkjkmgMi}jxmpd-sK&b}HkiRRfuhX;?e2y}$2yHercAmc^ReVh0 z_mbn4F2AJK2OT5>OGn3pjE^g9iwp(^24iDmECM`{AUePoTX=J7Q$;b4M~-^AYrE^l zJLhm%hF!tb(aLIay9^X{?gxwmr)TE&P9gKJ7im^u#13+MpCAEn=agPq3lmUc3v_mN zTC44;EC4y^%rH0|~Q%zi*ZXkum-0%R<~l;`$pxlYXwK?ArR_UlV-%VOcE z+a4ZQ=PV`6zWfWwg0Hs{w!o6cX$mPFz+2wLH=BT~+BAc@Ksh3zuc*WE6)NB+EugkY zm@3O|zc|f^dO6qJ-agf)H3$nKVc6{O7$ODVGj`1m0vR8OJb^Un^jn=H;qD;d#l?Zp zG(&34wI3_TZ4=W)Lx6St&Qi*#e%CYAuvwH?QFv`-aHQvRnAih&VZIEoCqCxHZvKd$ zfWg^>=C6!eeZ2J~7`8 zeLJL8B-uLPRHu8r&rk#$EBwbkWC{sUflY;@^WuxL#s>|(Xnsa7P3{|6((`Jq`EIal zv=w=}Aszk^PC0q&;uUMr*Kxj>q;F-p7P+D!bc z>!($C0URg3@AkMmyzPf)hYm{vFMlr7`nN6&aL|RUs}0)z%=Uj!J!JofsuGZ5@&<>_ zoFKOft_GH7*SL}DQNwU|cv!PjoBTzE#snC!uofJ@^vAyNL+Dd%uQY72MgtDAn zMfZd^4tAVoXBnejT^1;tgXvQ0yAb|Pp7STmQbE6CQ9|#sOuQbOCcrMaDG*n(KmSS| z?y2!5{LrU3T6xRdcd~TA!o?PF=*&&N*y z|07W+6ls4Jpdd(>Q_9-$8gE$0u0_6>N9j>%H)%S++uL#NV_9B3`-gC%(xHMj@NeT= z3X@4I+Dna_N;adKVOc&NU4neNBd>fRjmWaH@A4N60rZKNTN!VoBOv?ObE`RgE3ygd z;qtk^4S2)u#kuZU3C7cCE-oqqk{P-zQSr8V>Kt4}G7epfTf8){JU{FX*B&!Ma^x=$uo1wsw-6 z{WT;7`=W3c)!Ydul5N2bw-|P)1>tUWQmV_xKlyqe)_KOKAtdAi9n(x>>4P4xhsz2% z_D>h?qIP>t4PqaGTD>jOf>Ck}FTX=u<{>%NANdJ)I`;uaxvn7pkx;UG4NZ%y&cGxZ#0 zzaflR6S%F26wh0^4|tJ9gnD!;3rv}fkTXf5Q#!A z#iv?^!-C&3ZC9?GEm9~aey>JGxocOVmo5B@g8F;Pi7OZEYIzeI^ZFrhhzmF@z4!n% z`{N+CC<7s3%;Ff-xg1vb9dC}M$Toq>H-tI;)i?D5b*P*nwE&%*cMXrmgF%74{l=@2 z83Dde3=*oW1+Vh1h8(S0ScAh=tuN;Io-7NbI>7hU=hh(np~3}Nvc~bjsFLydM+20* z9SRx$;}gdi_4PzWgG_z#(2KPOUL690bst#l(uc`y1KDb4!*ve*F;rW=y}mwe zX(7Xibv`(!jTBD|4fO)e(Y2K%$rl4C1OQ&-)3lwPe*K@6G;yaE7v1uokC$$5Sy@=5 zxe0rkj?L;%L&WqXw!)03R#*Fu9Xf_j#@Od{W2L!8L5vbi3o@)JTfNcDU%Yo{59ML| zmS`z7z<=CaF`|b)V@3b{xAP7-{N7FY?QPVuIU8Wmu!YQI!8PaXj2Nib`6!ozSbfu_ z*+*J&Ccvw6v8UW-OZDx%5J)JRKU(a?XT&as(H#JX;o3s)C?Fj%HL;bG^MWt|J# z{_E=Qj*cSHv{NCFwtd6ZCDN)7>_ASCrq1*3!cq@`e^mO1a1x|Z!hjJuU;fgt{l)w0 zSO||NvPk>6f$yX}uG6<)S?5|R8m^tdF)6UGB4q#N_@Kb0yby8Y%61$qM+G#D-edJee2Q!?I-KTcl8c_L z2)zl#e~*w!EUFRnRsT4Db(Ch7NP$}I`Wl%<;EQ5$U30V#Yl?-H8Kwd_i|@5hP#%cy zx4V0dqrQ(9PuHkKh3y{S#mT3lEI+5orKd_5y_w4n zIJlhk((6AyTRx8)J%5b8a@o;JQ_)C~_kr70O#rlGb|zVc^q1})I4)_6uoEudnxDF7i9FOu5}^c$MYyqs&06rzZ8bzR-JjRYqTT0$-{dnMor z6t2D~Ox=ED?hZ4+@w9g&l+eIONmbqOcWmONmm@}ARUIap{K1#IczxQlWcrlAxfBl# zg{Yvmh}I0ri35p%gcLy#T0r!oyEe$gmyS+EZwydG>UNAfyWn<7QJJK^b+5k#j(6Lk z%kn4zmY$P#;69m|KADv^IYuMYv&Ao;=9IaRxgAy~qX+;jAOVpx;47&r`*9HY5AblN zENC;yGc1JfyPBpE`7To=|AHT4^d)m#t#bRBfdG`<{K+F{)((vId&g2LRuQNlrepN( z%Btp-*4lEyWp$=BE3=S6$_^m2%-Ohl?eWanj4mL-N`1uJKLuO z`3L~{e0yn!lGNT^amcfI%=VBa_#JcTns=PPtJHPjY2RnA`N$#M? zG-JxiH0KP3j7=zS7d?D21E$?^J#8Yg(>-6`b+?6@4hS0Yc*gkpM-zm@Iz+u~q5e^JWKJGzoG-r*JRU=mn-mh6fK5hnp6y`OeK-WA_8X)Oo38CVO!oNB6Uk-0w;gP{A~*#oae-`Q<=Nz6mcN(22wia5iw$Wb!Uba6FS&v{=!V zm6bq%6LSUc+)V73gIB>~9!jXW`v6OI?iXmCi5pg1^oN=-&e8MwPqnp8=HQ=#@F(^6 zL_|ccuHTrm%vfbuGgge_W7(hJVDa$q-v4$YaY&X^!Q8qKSG)N|vgsJ|8YtrJ{p9$K zKtiJyfAioyENmDq?%!pZw|v?tQ9WJ-y~m3)8lT2Fj!NYS;InOQKELb;Mp>I9Ubq(A zSmJ(hI@kie3!ZQ#ua2Uq z8Wcl_zv_~8c4pYt?&I;|!@4NR+InS@UK(2XfAxANy6A=vQ||W0ldY(GDVdqklV2a@ z*Q&f0H6uNhWZ{l#y@N2Umin5=r5oW{;+A^3FFqAyzVW)|DZ18p>$WlQpAjr*71+f@<)P)CjU zfGEOu^J-BFvfakiW^q1a>j2;pu4@0`aa%2*UnX1LKLqKHF0t;oKjMN9?bCn0{sffz zm)j(-cr=sQG#HW9@t@^mR`)x*AIO>=49%^~k|}5uO?AjDN(Ni6A13cNR=cV3V=u-X z-h3uIUy1P^c)?459v_ZKk3k#>TZi+K^Gdc9#}bzu+qE!fZPn!5=9K@{0=%YKZnzrpw7y>lz19uME)?Fkl)w*s0Jk zh(Qhf>5R-{wZ<_=2q6TSz0hE|+usR)f|ODaDor zH{`+OL0@7rVDe;t$3Cqf?P}*9>KkWg)){|(;KwBKzRx6DZFlb)Gsq>b#t6r#+jc9# zx)7DdD~>-@P#+}JyP>zrox&S>$l7~XJL+c9ojp*+bFF_s$~H5vjSDv8d>@j}Vqmek zgt1Mcq?QXb(gsB_#fkvnaps~UD${Ac)&u>W`TSdW=&>C9`!;;o;taIiM9V-(%0(v~ z>A|T+ZKaW->w10t z5URGo9xJ``kO$F1mr$8<^V8CLsR7pef6b(}U?Zc)$Gr3!+5I=8rp*vmatKdWws0)3 z7~^s`VW&Syk#JFU{O0xpQ?Jv-w?GKr z#?!q&spFjhPDr!DpDr+;-$t)}p*5_o*lhJ7HOL}Ai_CRZbk0>c!4!%SFkJO+6mD#Z zI96Zi<{E=f@Z<|?eDg^)h1)uR^+z6E>aLcf>bb0o-=+;Amnpn3WUp$y8>ERugKF2! z2e{NbuEBZs)oP}-^@l+NKV6DDIc%}yV{+DNsCMz2})468bJymJN3 z-iJPi7ug6@wv~~cJ2&7=_UZ5>e#_i%B#J5p+h+Lf+WW6c)St&S(Yk(DwT>BNl(y-U z0Sw!Fm(L zhN(_r`177-J8TE04`^Us0(4ScQ_=I|I5ne13{Kx}59!HIm3O9U z6RsK$Uslel-oLw%qeL|2eiplj*{2%${1Ut4bO!WyUcTvWVp5Y2;ns&5YXD~zc51V2aaJ1&CWPE}XDsJhVbIPGh*@AMfYI)5m z(F-xv5lv_+Ihw2n#Ab)bU@Hs1t0T}?CzX6!-mr{b1fi!|STbM2cKKrN`2D5h^@_|m zEbF4VL3d>E&(5Nxv#wVngB1>i?Wu%Ml!@i3?R%~U`{%Vu9WSR4ptTTENPFKk`TLv< z;7HJdnwpT-pLUHb9X%;V<}bkeQ*Wnl?=@&~qCKm_jeqw(GXSx@RG;aK_X#vW>d)hR zD_xpFLLni?h^^%on%uch$Nc{uEMsE5jcR!0Rpd>c4R!tOLNV*65C8_b6uf-;aS}Cy zR`dBjA_uw+D&!Y>@8DDqdrApT!UCv=A-)h7TKCiEcY?ICV$bCp6fm<@;dQTS2xWQ+ z8?So>ClvXq{LGxuXdX3r)nL5BQ-!}>oK_?XXBoLab>>6Bq&Q`b)C7Lq%n?l#)}M1V zNff~accOezTWqfv457mqx!V-{BL0QK)?H)0vF3?>PFp$Xy@zO$+EQQ*Ok`iBjYYwm zL^1PPSz}QD$P0gCQ0Fcymnm%PwsqLr3E3i!#GLN2&e0q{wnLRFGjD(5N3{I8`TplB zj@DbZfokSJwCn3Kg-)?~o1T7`D%izamQCp>o72S|jTyqYQ)LFsTo2B75d&MmVB6LO z_Ynp6U`Fb|?+q3KzZXE!p+pvrA>#s!?L!c;EiG^Z{`Io%{WsEy5kheVUDJW5?(h^6 zKsQt~XQNJMuC5@()l3%x9f%9ib#=k_22f?dv$x}!^A9j}`9mid`ua`|x*eAh&yG~w z=LUmBG#RMqNPo@hvXuYMSLw_SUy8u(HRjE1h0}G7Zchl{;@S+>MZginugza^& zjfG{}o7|eTVFt|Px|C2C_!r_)fd%L#gF|I=oGZ7$8i-tJR_~L3m$B6|N;T^^VxdMR zdpKncEO5gwQS5xj%aaGjE%)!*CPj9huY=l8W7p83&vYPAT}Q*8IcA~ty7m6xC)z04 zPD4|3>x;v@{Qp?X|5{--{9VEAQ?(tqxr~lcOpU)3{Q2WS^!?7`;jbwtAq!|5m65{D zA$9BZzT#58%$^F1j3l= z2`2JQmI0Fl)pGG-RY`aeT1;wmrK#M}=~P7_EV8uYHbCt|yK`l>#1}ERg=$AOzuu?* z;JBLbyT?Ep&f^~{_hr=n)Bx6Aq4FhJ_i#GG%J#;Sc;AlAkgoTs!9h#~P}#hYeQ7ri znHp!wL>C1ss7n~clTzR;`Q4z4DpyphGBR$q-rPVG=w&HWCAfMOipfI4O=}84w$X=o zLbpet$*n?RFh%-&y_*A$=*9!e+zg=m^amSZR!U=xM-sCQM^F}LsSFr0qp^+0O(@(pij zFCfhd0)(=1bpJy&0FisA;$Pn}^xbB#b=U#kfmA%*n1Nm|Jb?Aap$UequH(f?p^*Aj zmP6=8NuPllZ~-Q)AfFRGRr|e7Bk9eta@_^;n8+zDWSSt}74eRZNJgsy`Qy%(?7a-)*vgXqzmFY`~KbsQojO!(SXq zr#NTefRekdVpyhZXvH+HJVQB6RB)yKuNbRrdCxc>en*(+-BZ$`Z2DkN3~WmEJwOtL z@5=6U&WBM+ER8nEl7bg;sEMlP+6OgtFibVDv?cr?55w;JB`>-OA03St6T7;7f3bf& zKfkc9M4~h_txN8e3b@ArtkR@u>%hzmlv+~KJ(Q|l2B2?4h$`Gb4BX~Tx42Si>_UNG zAG!+){q4-H`>$;)6b}tqfZF7OKJD$h6A<6te(G_Vy2=itxVxn(tfRK#5(T20aoCg_ zVqa8#mN61rOvzyxsO=Snb{!_*)$zZ~r|8$$qYq{jokp_Yp1w9wocz4;|u=3X7Nu`Gq^-vRBCi4=r$G3ljPO z_60zIPa(5F2%D7t_?UDD<3vy3qX5RL@P0Fes z@LAtyx}V{N{d|n6XM-8tU82Ty^5*4=ojV(RPuB{VQ}QW}SrXjl2|UU9$MUJ#Od%k+ z=zd+~8k>4&E+yl(-oHu~5d)u|&jPN1KtH(~U%lOWb~UlJkjtUPv7iIv>+Q{sWcv1U z`S5j1XHL}0`=oqd&6#EEg0k}^80d`TFblqA$Hk${WQ<)+qyl3j;%G|ee{W9%lqhtN`=kqg zuRH3x%Y`4#CKsDv3$;}<5De%EMZk=ej)Z+k#=7Y0jbv6@b74HG*^4h;gLnFLp)kM* zP2+`}#2mcDGVp_s{yVF$DNPujm+!;f?Mr5y9bEL`sCh(x-l=x*xgYRhStsLYykLtE z_#r-Jj!&3rnkX=4nbfDPifukmtpRt~ZN@Atz7gt=$86X?q)UEPqS^o1%vygXuJPX{ z@|sNi-{y|LqL)e0bDRASMfa~|*kSgC^t>($sVbO%h?L0ina(a(w@6R6UOx*1rErT? z=5KakaHh|6lU?Bc$9dTLpFU69zo?lKQ8ue&Tu^2c_d`4UbqTy)8U$y0IvW#E&Z@@i zePHp7Qznu=*A;z~bBom?TW~yhBo4Ki*KvqD(aXT0Jknrj}N~@@x^tOoKOJ}uD02; z>o0M9MtQ*p41zUviZu-f?@k7r5j1H=#nc%`FN~SSs7t^4(U8V4bckQ-nQNjHA~miX?2Am8Z* z%cZVBm1DOLtdG-w-BM#R>gorqn)i)-BX4irE0y6T5_%Ujh2Oghlp!wMn4=cJOmkpK zyq~82XiIPqJGn)6fLwOfW5srt;8`33KhO96bL8FR!Ss^d4$il)c3@lU_ zoP-9@qprS*y+85zROCQXe70t>J>>pnJ7VuYiP9oESx{F28a$M7`#Ay1X>RcTJP;cu z>n}P53X49=lG+%#*m8-bYa*>SL{JAuFozk#oSjVW^ix(v9nY3w?m1;2J$kgElM_yw zXu}!(J^Sk=JT+I$(fPyQTq3_5JCiuT0#cc4t43d=T!TH|t)_v+mQ9Xn*XQJZ_SQ%q zW<9euJpiDb-UM2^jFYR08Mfm3_O$9XL2BZa?Z*^30L1J87fBEMv4#;7qf0m`A?JSq za$*gGQU_O!E$?ZDJ)kbA(|#vGCZr-dr?It4rfwiIZD!TJhnD4UpQ&?YfW`zOXNloh z=zOtU`vyQ|TjRZX>OVWlM@1CGkJ7q`Izmz4M+?p_1Id^^s>BXwM<$m|^y>olJCT3@ z7vny9te%-frDCY*oqA+~S8=b9Q5mp1c5PY(r^N}Wy}J?#nC0;7SW1JV+UOx@ZVv19 zMCpxaSUsw`+Fl+EyfMk_$^_Hg&z8lxse}!XL$Ab(rfX`F+TRVir5mO11IqH2YAMzPO3aT! z&S@Z37x(A2I%0wGJf9s~8-Q{vZA`cUw^e$5|NV(b(n@-Xfaw$}L>uSVQ`ho+S8WyA z@^S>ma}jN9Jg5M~3o0op;{_EOr<=2{if`I33H>;UfcU5*T>ZV7@y^py0hW(46i6ST zKPL5P2crSM#wS8=Modr1vVw0yJ|4tWLrx@~uLS5BZd!Q zqW*w}-x7SPu4b!=cqzhC0hIE)T0x|)V^cmRJDA}50!uHevyrk_Z%PaNRPLwTI6RB zx@JwXT3)UPHVqU;3Ak0XEwHwY0}EY9t}az$yD2KYHY6ZM3PtxrQo4WQ z1_q`n(@ILr^!;4rrPgflT*Keo?nvc(A4tQq?{+7_n~=PZV$GxAt>DO zPYA?2CNI&i*=wWCr~JW@=w5KuCZG0w$WUlV3&oh-udo0vCbXYyI!>!zW2A05;FePB zv5~o%X9=*5(9Bh7M8l^XYNHCaxnXnd)U}6fIU66*@D>(eS$)zFSj1`mmgdk9g`&~n zF^Ln`nXRg-7L}3l_IlO&Nlk&glS7sK)%TQP)haHX+KRI;$CV%5LQ1y?x3B?|2yPiM z88L-#RCh}tOTAVN+6Z0MP$4YcYqT_4=#z3E$!hl_pAM=E-q{2qxWkE_Sf(kyQ)J|a z#KzizkKQxi+;A;ibWYg|Qe6{ye+>SBFF>oM6xf6JisOAk)FurOCpL9+eT#lsRV!s; zN$IIi2=!|&o612SoTOx)8?3FbWgF)^pD#O?jMf~~M!)-5{f`llZj2Y>R`Apu4e1YQ zZQsktF{gvKy?IBb4~>0&@t7w|{q47?%$eg%hoCwHJg;?7x`JAmDssu_^|5=(E7CHP z+|v5_+SU<+uLUy4;Pa9Vx!xPD!R)m2xAN{w6mf*xYb^Crwq<`_roMYv`FW$I(ocfc zAQgvJ54!nIT8>O#U*M_y{BFFehbqrXfdh;u!jZpNN3;83NZdyYPhE?iLE$+80eBKk z2;V*N!kT?qr5Hm=RV(ZB%$4?baD~+eCnALsK@>&nw!^k}w=Z5oy}qw*{Ro2}|GRj>H@kp@2uHV-2Tr0ujWq|BP^oylNb z>DV{J)+!I%8!!2nux#;oyJ$p;)$ZUgqR=dwh9awob+!gyyDomdg?^ThJss~HkQ{}O z?PyMD*65{%Jq&;4wz!lkaAo8`x(+)uG9zPh^ZEFf20a^P_u-La#`H{J`TUcP)&0Z6 zr30O&*ObnP?}R-$cQ=Uuy&K&sJT%I1c#NUY>C!`uDxa-sPw1N+P`3q`DSPb-i56^`nK5 zOI~oOlH=ZPJ~{cau|IKMCaDl8QuX;@*&9~#tF7C8G{)7!iH*XJJEK;DO!5}hq7OW> za5Y!8ZnGLBhxX#`*TGmhB2tbZ*}vHY!*y{9zpGU{OinZ=07#N{T-l4mslZ>6t5WUP zM?@Ag7a^!|aPt=7o2JV_W!xP0AqG;>H~xcu+*o8FLo1Bh$1O3*Lb>f2!+))xpy3fV z+i2{*J>IQ)t;*OsMAKDy9Wg6+>?B$ua92M-+vml${ZtKHGz|=+Cg1F`hh4uH_rgT10aCbSvXO}r&8BGc{BU$UAjSJ`n+&_lQFPOCn%OPfS*dmZ zX$!L<=vCiBYAXw$JlR6*eTbMno{kM_piPdJ5z}p^gp27muZh5U6Z|L06@K1ho2l*F z$Y~O8KK3NZa4Z%bY_ez+7Qmj0wnT>;I;{CYATyVy=g_Co*uqUyZwPslb+ERDwO`WU zXXv*O*xsT$=WPRz%|$BzBjEy@G&%oW3-R+n#%h~09Fp1;JO=L*=CP@|1D5L}$E$5- zBoC$H<;Km`AO>f1+>Kn!edZ16T_sgz(lY(S!z0b@^}4PleIS|u))B+f%{X6o-(oUl z55}0HTf+abNpDi`)^kNVCM?-`xX252w(QWQyI^|a2<2y~iXArh_}o6e}Vr+j4q*xw9YDA)lJCX>4zQ)7@_R@b%t}3mmR2V4P=CQZqfGtm-)Tvc8^F zI&`BwC2-Q7%pxw7i5PolQtX0HTj5(&h)~k8Ov=HhB(e8^*eg?-Zy#veYhP7!i*?q-K3SE55^ zN)ENO5vO!SEsJ22e^E|7*O^RZ_Hnc7_!{{k?p$6t5BZ^b+VP97kA~D5%Tb))K5dEM z5+wffESJ^3kqB-G?jM@*mS&RKCOBhlutov$x`~vZ`CN2?(~S242*!wu_fnsyc5*o0 z%6oDF8&2(Lh5nhXT$xWhhar_+xYs=glIWaRdra%2gS`Qq(u0@|wtJJo#Q zdRReWt4M?Ml@(>xTg23(;*`PH>rZFC`wc3uv;KcyRM%~6`$Xb350a*wGt}57KUpf+ zuE9*?=n~n!-U9YrxaS^d-1d(8Y~?=s@bedrmAy+^jtm1xZ(qvsE&#+ly4!T($J2g( zmtwQUZ<)!ZLxmwoOzCGRcL*8|f)~k4n=fswHpvatQNI2(ifjMD=Pk{a^L4DHR{)05 zXS*S@+p%)1&&tamc>fzIrF`;qW^tsDC3v7^!l2C(fGbw8k~+|1U0jW@1hq6t`SG89 zZXM+b-XR^!)dkL<5JW}&B)H-ax)m#|lc@oIjDx$cbeiuu}U9{z27)Oj)8647Tu<3=O}wQ!&Mb}~(4*9L{DWyYK1|(V8iTv8yD-*gu zS5ms@F=A}=U%yEmKh8~)BI21lI~}pGsPS`I%v{ljYOzpESuUvfKq{%^->j6e+o-2m!wUZHt3|oGqLaL3XONlKkeP>mMBO zDhwiZ8a%UUi*Zit@EBJyH>V`;Vow8BSXqII7E^d$a}w2KKP;v1JBwfgR!1wSyOr2S z7(84hX6(~hY2q>nuj4w}9fDxnVos%*? zl9Q)4R;zyTn4>i#uvGuEqZi~M@{0#sCi)i?)xryBXOJq4M_&w+a%=^0!|@hwVc?Iz zw>ZhlyvDaNJSIoSJgoTZCF?^if8hd)Wskq$Gj``*OBeh}@ZV8;{|1hFaee%Iu=1UF zm&4=7_`%s?d8vWg1S~9cY=OwFgn9RWUm8^LRBzD?Fgy4%S8aJYczE#_VcEsg@_9&tXcOUCbacv#M(2|l2n3~qPI^B_nv zw553~qrd3%*lGEof38q8nX5p*^nE_%)+65QeXx_q=%8H>sUXJRAzN_5FwF29UiR=K zymB62O5MvNovK-VT~({vhg`p?fFdtuNA;ZR^7P{b;^`h@>yn@<`Pkf5PqCwv*?7GO>GZH+Sahd*2Bc8TI^@u3O3IZ>@m6er~rGoA3 zJT6&C*J(Hi=P>L#JfA56p47r zc`zC9gC@E@mKOC0wjU3Lz+nNR@)YLw0j`L?@q(ymB>R_MkC6^v**8bo8XyT3HnN-(rM9rEH5 z!!sKPHq7hN4ou~Du1uzwr~D= zZop>lFn@bU%wuOEacX;c1YuI~r&8*?9qa|Hx!N3`F2@BT%l)F%>qAA%L03_cEb?ML zi?NmZK`0rJ!~`}^y63p3ywRmy`enqgSv~qVzLA>IUOb+E>y}wImds3%xB49knA}bv zH?(>6l0RE8JH3}$s#+!m*7Kt#oi}*UwDE9V@_vkC;x*T4QQaYirIZ+zi6> zxza_eTE5DAH;>kqxKHK2M-8j~l&}3h8En6+q4zgidCPwebCa((!>-|?%|!^9 z($}GTmu<)M#G}9^?C(#6Ar^~2WXFG!m;HQW76`)sEf4Ed+ETC;=TY=fWxS%r?Oavx z^kcB+x3N(3=I$^Gn34?#K^`Qd1%HxLabgg{Upf=i?7XCLCIi>nZ&TB(L7!X=$7g9c zQ^z%X$|edZHHyfgC1v}6^?*@23UPpaavXO>0wWp!fr=s(`Hw!~dMW)jJztpkYHP#I z)xRAL3eUg3MNUo(dD%vxZ5b~7AE=P7VGX6Jl`>y$j( zpY%psjP=$Wh)Mqb<0{vua=>$QAVu2R`2wK;V2BHdPkljH>RN;hLgjni?zc*{S7Y_{ z?%z`7g)2e8BqRtm2~@TODQ`e2zirg2g{XNVkX%50yNA99)YX-Sb!nAGkOy{Dc`K>U z<)s1J_$@D9KYc0^ZbUoKW>WXc5&Xb_obBFJxd-LEF-r6?5m4Yq>KKk@9DtytLN8jJ zdFy*H6djMe2Ugo0hW;~)&?BWg)0&(%T49-#ZJ_gW!3pBU;iYkPR2ickx6g%3R2$X* z&Z!QBAT4F-e_UoSK#$VQ1FgG72#J&+5Izd?SyJbkfHa=xd>UPdoS(a%K!nD%20jla zmHs}omZ#^pa&u*n1L>7T`nOllwR4rvm3CzVK;p~=EqibYzFkPT^sZyhC-?QG=M-wEz=#nr1Sh_@r>1V)?M@dz(C?es>9QaOS#%A1s z7yC|qgLX>fxTR-#ccZXzT!-^mh5f5X|GxWBH>E+$_rxq?WE0Cn2?;gMLFeP+BpO9J zj!1-T%H@lA;4%CY&EGr*{Jn`?9LJ#CJ-xA3-;KI3l&^bittS1EqLtr*j(?#4iPVj# zyo+<$F^~9-XsLEX{Z-gW9Oj)n=xNZq>M>Q7T^_$10VQqP2+4Xco1o~c9-ac1zaC(i z=bnLTo%qTW<}B1Uc^AwTaSx5mDt&EBVqa5PPo!W=GtDu|1?DnS%jFXjVq7Nri=;e9 zz4UY4kN#}ETNE8F+x4ZU*P_2yp{fk{T*#_hF&Afz-6&gfl^t2;3xw^ zjEb|D%hRw^G~z1lEj<4s(){S%KNOlb`{>x&>D!Xs>gPvsl0X$wHhA>B-u{`<_iUDI zC>iPJm#OH(6G*XMspXS^Qn>XHpMU_Oc7~&GrsBUC98@t-f+KM!w&IfpulTgy$BR?X z>Y<5)@a|+S``YTYM1Uq{yauL--yG(*pH|*%)H^S49==HY>j4Spo5Chb*qbF2BmN2r z1m-~TW>L6vg~>S-u#*^9Vu(d78&EL3d7Z{)Ln@~n3#x(TxC2hWJ`WBj;4cLaOvcT- z7dePv-^G4u+oX2>;Aj09C7~c;(BEb<%DIX~my3COQ`FWfmcP`UB6cd&rk}Lr6D=3F zDtdrAr*QVXcJ=XtL+kLQTv1~#WW&!#lj#Eg0-FQbbe-S7=TpVyab>u5(dqn5dvyPe z6oy189>=}1Wq?yCtOH9wGlM^8(RoE13|D9!v=5tkW5%V3XkY6AED17c5$t!tb2cG2+aRIT{YK#o7@BO39x8chpAxY&;3^4nVYJ8Y!;&{@htvgo-?P$cE_ZDjepw zrn2?6nNMQt{+*5lh1f>lhm02!CYjp#`%$@dHGd9Jyo(+;$B@e_fxbWK8t3X zHmDci?gdIHnq4Xr->{qW(*wbPKe2@X9p_qq37PiBO62Q`0*;OtB(^KpO(_YSFbYtf zyuFR69(zA&NZMbZEGAZcw=`k{AQ3=z03W;r1t1nf$#x7)7du9r_zhPEv3+f!9xvY=g{Nb78;oyxFhkAb)4Rj-52OThg6T#Lhb%w21`KG(L=YM&jSU0vHpn194&S){!W-NJGRtsyFs9xhK zG<*vypMN?CHk$#m$2ge(;Euuuwsgq?wmpFZJ5DK7cML}O+OwprQ28ARS8U9dcRD*I zEYl$zT++T66Xzj?UHcY)wQ_ZgI@sUoGj?Gt#hE11w~gP!qRV(9YidV3N5_ic%hV4M z=5e9gzR4LPV)aV2NR1PgOC>+qvb9uZ!WBIpPcd$cdpl*2m>8RZ}d%^NseRl zE#&nwqXnvV84{hEw(4=c%I#ZvH>Njp|EYFJOXK$; zjUx>RE*)*5)AA+-51nYQYaw#^aCnmpQhIcFbf8#&ELFUbV^C0=As<*TgW**3g-w^?OxHeZGrVZnVS?L?vH+D-AhkdxSrSZm^1~Mqm0v#2 zbmS$;O!Cq!Da>)5nMeD5!_H1O9H|n%;mR`203bY1NjUuvwzX64R^&!11Ft4W(FX>u z;un{f3v8`b=FNP`qXbU!Lx)I&a%|@}m4}}6txo6M6|HTelaD@I&<0s&> zN7)giazmEl)bv}Nq2A_A8iiuw^^pLFHg$TmC^L5=vsvZEQ-8vEO)sDshww#}!hPj1 z#XEl{2oinX#$h;R@M`Y7MCA0z3o5=yt7iEC3Ii#8b3bCsL&jGbUcE0|s5>eXn`^>c zp>NU)w$mXmkU+VaKW|uVG^jUi_{t|XmB7yAvR#*b#=&(6R|1h|Wb1hCAstE^4EU?V zz%S*8!BJ-`Z5Z|S+2Qm?)8MiVs1n&&r!`Oo_VHJ!D)m@7ohWSiZ9+I@^7)i0MuCt4 zS&HL0j_ssWQ|M(*FksOU^$n;;s?^zClbbGt z=V@(p|5*7as5Q}@X)7k%zfG;F7pc*$FJplrCV#(C7{iPh-{2SBVQP?gIXQRCmVBFT zh5v&adx`P6b@52Rgq|V=ySP*!ABVt7>R&Q6!j(9MiOKmD9WIl4sIqw~`hD(L)rXA~ z4Saj?8YN;LApNC@A0_+44M5Nc2>V;;2{FeqI^2Frl=iNK#FmX9UAl>W;x9Yl0EzP1 z#`-gt^(=6OAGe#@+0V;6Ob+e5%Vmym`TO*f4L zl9}J~J3CZ2V4y(nb7t~AgnXJw-u0kv}?`=kMR}t)6F+4!W#0@o{$R$5`mo7c` z&-(hNsGWC}#MfC2Re=|;FIk9SJ~eWK{H!jdqdHQv)_dfbx(I)mkuA zqUbdx1QKeP|JqzS$X!WAblvUG?3el+6)f#YL5jnI@O5uJ_=baLZ=(L1g2(?tWb*}K zGQhz*djaiGkD3c#@%@FJ-10(yfcOg{6%KNLMlFm)NrcJ7GBy1ZUb3eqCZk@b5Kem9 za2X{@b6UoQ0?mx^pS?T+>8f=lx24dsiJae`0IN}b6*{pd0h0^-QPH}M0Y+0B&%@Z; zb0^a$PdsK0D9_KmchUC(b_cPmC8x*ex%uI+B|<{N{RO};fv43DGl?iod|UguG&V@- zpI9Bb(OF!A-`RsV)*+Ir7}_L%OUPmPR5BxRJhy;;T2j-QZN*H9AzLCZM2o52ud4E1 z^oqZ0h_ZQ;cH9qjyp%7!mb>_s?n~99WDQk)QNnbs{GPL2Rz6OnF}jKrt#{2@isHaD zDPOIJOc`-}C6-+#9*MxAbmW2?6`=3+g@_anU>CC|^&CW)(_rJbi*+^28SGQc!X02^ z>te$O-o(xM>z_xW3be&%WHz;jf?SALVjIt`hIE@ki@6sJ%65N zCGzV%UDW4hktl3JzqOTEo6c;h-&EnX!{Tafx%0v7)Yqis^)3YT@L+~S@+hI=?;Yfly~k}AQ=FPzRqv@4iZ3M5WrpkmZgGGU$r4qeD+PJLXnAA`#zXe3K3*pb zwq+zlduiT+_1meZp)#VrO^-xrr~x~2N9@c|%zqnn>**$i#`%Lb!w&*)Sr8h{NGu-& zN8H&+Lzg6T*_G-w@!rA%v;gLnO59_57eg(lG))<;yIUUpBSSu~Z<0onH7X$kN2#tr z*5XzsOIPyzNu%JX;kn09FO}C zPuZwO8mb>E6q%3o~jp&cr|KYg;zR ze`)%nSuTS~99x!3Z(_OB;osaWai5e^9#sW;c7bg1%60NHlo+-Wbo&=swZGndn?0p4 zs#yJ$DN_qIAMg>7+08fLmO*FVI69I9OMf!tj;L43IV6wpS+Desgids{eM*2Z;WvNP z&+2R$CTv%Yc0N62S4m~ScI*iZuPc`kJ7#{ta6!HReMUBDY!H{XPt`cuN7z74?$&Qa zXF5{>TsvGsc&kmMo#TR}-)@vIJsQz#a>V1FTs7RX0%QhphRrDM2@IsY@+(_v5`ohW zv|%<$Akl85_g*-*8L)8{40%E$Hl&)SI@7Y{p^{-%U> zrPAnuCpM*_nF&aVcR-mW4A?$YQk5H#Rp|dQ%HZ?3xL^|iNoE^xBbyn$`2^B2;mQ}P zDG_2zC_5-CX$kuvpZPIE?ZgL-gL09u z03i3{7n6_`LgxB6-}0zGdJXuninq7VfZ|=7)Knjmj~8>-D(*8iCr$Pu?LCJS{%0mq za98->vh}+f=WWvVhhSCYVjgQR{N8e1{8Osw+cx*Tm~`JwTnA?U;W%ewt+ z3?IK}*VOE_3NfQ(lk1#kcvz7@%~7Mr{xym3PV9x^e?a=_jY$C?mJXyyr-H-Fo6%u8 z94ma%SDO1FUz@&BKGaR!Yt!R95$!jE;;yUPd)u8?O_j; z9%agG5sp97Kgv6^Qt$yv@?}NeeDzzg6|!U)bNq0Wff%ill!$HK7=0VZx7sExhe<#* zU>0|P(_FgO`N*4>#Wm?=VXsRML3tv#uyDtOK(6Q7)LdqDZb6@tT#T9aC&&86Sh167gB3FgXpWU+KvshmD=U;_byeFqlg* ziI<&qROz|=5@CD{s<1uA2l`yz7v}@|g=a;~lT1k}-dw4H*z>QfYv)XJ-wtCZx`rIH zH{{lhzK7kdC=`)1PhoP#$u{k#RAvnePIU$3834gKs8@oJD=sG}+D~;2iV`);YAo2w zn)V%||KOHzJ0#(L@P>jp*B(Az1<&d#eHI(=zSad&(^7K`xp_-$O(*z&w5h+N`%LKY z$6{&zNjjG6Pb3*ft4;Htj{BNJ0>cJeHPG8!w}FY!Pqp8PIXm zFt^Hyhm)5|>C#@NTDaj%@^8?Rw_9vb)O4HB6fmZYysQ*&$i&DXu=K%EmtLxv6zNNo z^=1r(nttIs#`Y0hB9xY6cM1-u@H<@uO4$8a&;+(A0HtAAv5>k@rFlHjMT=*=G1{{_F|sfNx2~RWg=jG&Dz$6V||;5UFi#q7rHqMi<>tPndZ}}evN^DYU`0b6 z*ZNoHY&rvMj`sdIGw zJ6mq@vr&4n2|>Z8yd}B39;JhW`g7XNabJO1Lw@8|wZr0{Z-K)<9|dIGYgi+1_q3mj zn5P3Y0TBaRV$OZQC_Ea5nLcG8BKL1xcmXK6+!!(k7#%+;>K{n=!9*BR- zzzQ6U=U%1bejSNq*Nmet5D%no35~xRZ7k5kwFJ^0D&N(V zli9Wt|4nem3KPx01Y^ZsM~y$Er|JtRSr$V5c<{qynXuT#j}f}bWk9!Ji7)q5TXq;q z7INFSw)TUY+XCHwg$m=S=;AmTYyOQB@ws;u^`D(=eF#6FmfrdN=9kh3qb!!_BrAes zsx)9Fl4rWD$7N^39l$6!I;y_1CAS`!I;p91y1Qq2t;c6;$KCSymlJIPU=iSY##6IL zzCOjLMG!jZC@h@mxdbz~v>NkI+-W-{o91qLc|Td;?h(zZz*i1gmO0rXpQWF$awyr5 zol;E8mgLs8pRDBEgnNpz9K|Oguae4r$p;YfpPH;ZHkufO&^*}1#aQn(t+3-l%+6T{ z%t@>SvokYOd#mQATB>Put9mtX>UMZ5fBKFExfqfT3fm-%Be#gJs$!>5d=Cb%GMWMF zU0;y5Ka8`mpik&NfX!ZXcpMPi%-l5Kkkp3&lHh@6yt6o|)B3YR$rB8 z>lb?3Yv*ct9~(G8!r++zf=`rq1@YeJ9>=RgHlCp0b39ra7VF0HbndtIPu~4fW?C#H+NuA1aS%i>zn4P3&BnW=$NmoINOe`8_%-) zfHa|XFAK<9ryA0yw!c^BdY~eh{!$!8-l@%#UqQsbokL40xdqNDgc#Z^dHsl)<&%PR zh2-h_e*!XLY@o@N(kGZLj((wvjz1ZmV7>)ttm(wevjUy8$ig~hPjqY2vj2SX)>5}C zz_{ts^62JFB4-TOe8M=ssoA)#d28#-;C&+k7@AT$pzoY}cDi$gS0Z_H(VtH9B&Kjd*FjV&gDTg%UJkzBZzus7{ z6fpD{ez_iQ0Sz1*eZ9=C*Qvdt1qfC0C5gT~@^*kf1sQyn%j?tjyiPG;Me;b^OwD;U ziY|fsOyh!pj2{GqhDVgv;w7WzaX|~HsRzlu5oNihZ70jR|MsSZ3s$N(+zbnh6l;=P z4_@QxH}_Mz`Nf}+T@>+K{zpj9`7rAaEuC-I&z zWEesx^5KhhmSp*xZ>8p@GCaVbRnvWn@N5FnV_E!;m(u^cR{@lmCSB|8lXp{sTGacA zU(_mHd>edhQB2JfD8!JldR;z$F2Ic3_{lanMC_40WrDddGR)9IKD9|lu4viH064=v zS1UR(Wv@g5&;l=jKD9W|!`L*oHg6iV0hM%GD8+EtLToT4kUT9F^zKJ)K%37mA{t&m z30#e@xUnBh*Qx-zGk`K((b4}#ws7x?@VP-s65`_4r7pW`&DU*zpi=f{hDNDRt%S}>N}-gDdO#(>PJ%F~B_o8(`}EzkiP zk5Pc^p4QFVabC?7czBW;{6ry>0eL4GMP@v<_x&FqC`%B zGE%_!Aqwq+tR(C*nt?JrUO3Dn*C_>tYCHr6RdHV=3$R8Xj3Lj-`+Dpx%xY~>eCh4! z20QaWY1}_Oyns#l6wAayD6`1cGV!5TNh@E=Yf}KZ`Zpj?$?WK(Z=Ha`!kRv^g%{Z1 zrgw(%T_5w@M8>s88~!$gNZgEPUXOo-ptyZSo@w|6=9F+wkPjSf*!TI8Zt> zBbSK=ca%ir95K`p4AB|GO1udN_^_`4N1QJyOINyzuyQq`=niC?(W5+qB)oZwY7^{Z z2932GP#Bbbp#0&t8kwz~0)g=AjE~MkFVGu{fLr_%oHG)>@2zw4bn+wW z01k*Lbt7#Eduv+_vA*!xcS0C66v^EPD~AFV%OF6e_^ceI?|ZI7n6Hs9pLNL*3K&4D^FH|vFHFPps8A+6{wX=L!K3nIJ|?fEAe2JGVHG6GK%OD?dd?lpC<41}2f+quZE!KaF!g zZApLs=$dG4ADiJO$*V()RH}BY-r9Q;!qnhP1WGYodfX>#iT>@J zl@liv%4GKX`1nrSa`u8+sMaco>Ir9KqvAyQj+L?R(Ifn`J07!MR5H!Y5ToxL05uv; zp81l%Da4YS)LR7YizIO>cSS$^rOK*8hh0G!XKEKZZ=lLuySd5@_k1>e&X|q;&aC!> z#YrR%RlI$CbTYnExs=u3SU~}SM`*$#aBJnZknQ3{xN?f<1}`mRd5J#p98Xr1Wt=gw zKE(U{d;$P2jKo1HhrY)}K?-nkavOc?JaN4)L+J)*pBT@a7n#iLekx?CWAk|YKVfdJ zOkB^0o$Ibg+Rqw7q!jWD>yo3i=u2h*}$-&vb5^6{*x=x`9CjK zY)bVno59y`jQ_Eti0k@Y3~Y-7h&bO1{hRfvJZ8LCTCrzc2!^Z?yZv3CS&RXrr_I0F z%J<|H#p&2Lx1H(cq5SnwzR6Q+NA4%;w(+84xy)CZ(!aiEsDB&zVH$T3=!ZVz-p{_) zB7m1VzZ?H)9!H9O_N4KE0-)D{UeoBqyQVeIR`Dkv|5CpH_)$|vooQa?aP7m|p2h)l zE21dqQjUa=$bQ@Hro;{i{(BPPVGUiMK(i=u(jd13f-I-i%J`Z*jgldAdKfB1)4ZkutXRSw}4jE(8qE zd=u;aQVqTUYR$$*p4!7_30*z1dYKX!RwQN!m=8NY|D<(sML^m(0-NrWsCqqtEH-Pt zwNk*JQV!KCvPT6m6}5yJ4FPyBKiQsQRJY`5hU-xcM~53cqpj<3*{v3o(pn)^^1+w869%udfThvXL)NM0TW>WxcK>DmC zMgQCw@#qbl1V)1KU4o>FxCM~QMU$2!Lk#-d3I=}gxvx^7v?Hvu>JI-ZI$MakL_*NO zt&CWv0YlS^Mf+)mwaSKLKu^eqih*uP|6)jK5!}#xvv9UyfWZJQ%EhyM;SGH{yt}>l zTS6t&w@{C=HNe;a_m9=h-B#*95A^a=m2G<9jRCIj%le}b>`wwAqX;N>JN?OY`ko2>o$EP_Ri|To13<8%eO3TEIEKP zd2em)xzv!q>A%7ZlWLxw+Ogi~o4Ex{ohsWJ?*(W#P;)wRVR6TN{YYUEJzbc_~GOV)qw(Z+Z0mshq672|1o z^nRY|WONH$Y>hOpJ=vjhX*FpHLGba)q+Y&y7FxG!%BF^-2Py6zJ&3KMC zRDOg~3fZr7`c%8}zO=Fx1j^lk*jkBuOiy0SXy^F#S(%h!i+OXuxWc1v2K-lVz&o{B z8w%TE7>qJceaOizam#0MrhVU%lG6<6hc(KVW0>{IUb;vMNLpYf_O>_E)6(d7(yuJA z(eyjsZA+Vbx{1H0Uvs%RyqxGweSOFDZJ(#ewAw{G&MWadPhJb%&#c}U3L)EdnE6?y zbz(G(Iv+jpIPYQKG-#O!|Cs?1{cJ``95PX1D}a%_po5J5GWspHEG^GO226~b2L*f( zMMI|`lF;_XVtdYuM$rmY`yaZTIlwkJ5L)OJEVjc^Ad-+ofVW?jKdB-YBG0sRcyeMf zL3~zI$+Wegbh2i?a@x7ojKMATXCgb3(De?AYwv1zs(kWT%c*+ja`vl&NF4DtDH~D7 z&jRKjYhWC$k^6EAw#E}}VOfmae^OURg_>dpMW|$VaAnmW$aUREB*uiczhjLnr;lS@ zMc759qw4a_`MvzzxX@NZiTYV zaf$rY>pBMRREgGCCL~K1S@)mr;spdLD2$i5v7+pQWfx#|^ULm)2hSvg3&>NbpCh{$ z4)A^ype!zAfMut8lQx5ITtx>rWL5r3;!5WtdJfFE2jZOgM(auhlq zS+Mb;47t>`q5_j-tUi%aQJx8}uD<=x3<^DSeD!oCC`Yt~LEJ%rYczqDmfR50``%aT zr2z(F_yqbLz$BZ9w=6H;a+Aw};&$-E1EzEWrl^cXPu!=TAr;M6H9q1j4+w_7p?H7P zhq*gM5g8@2>@t7sqfYr}o|`TNCM3^I4hX9me*&Y}DP+&y6xzc^)hL3ylJ(QQuVtTQ zTcv_rLIZbd!`e4w)!zgA!Rgquy>IWVz)24c>)-A~Z2%vF5J5216Q`2R7Om|v9|j&T zgYXy^I#zAIv!#jl-#)l2!wfr}HMqP?U|c-*{LLAmB-*;}Mk})0A}}mm-g5>QWn_pB zNuGT4eyqSWqYx3kuCK4%M{ldEPBH2*-ZNHzCRTIM1~IGyZVc;GIaM0zmPHk;2?`ck zKBR*Gzfm2kL>lvTEuf|resY`SCuHio-c&;DU*FwdbpFkGuXzheNW;TQ!5o|Y_6bXx z14Alk+?lR;f-vk2nb8&>%l=uFik%(A62H-eQiC8NAN}tJSN{!IJj(Q{7<-e@9JC^FXUf`Fd9LPd~2@sK4faV4CsMK}|CK zx3`E>VUeIiR7^3of6)vBj~kJ);d;$0aUtial5erRz_*??b@vi{H(pY<=6^dve5eawZs}!91oavkbNuiB_3x_{=f<$vUXl z>J;7%hD%$>+OCy8f@N2c4>IjNSo!SO)2r77hTF@Kxl8)4E{^T-(GwS`9ycD*%qNQ; zbRlZ;z%29J=rjr60GXXySrd#KUHfY-t>Pp?V2<5@Ut;66Wcu}`Vvs_37D-Z0>zM$n zt&~qV&^%voKR7`6H<7xoF>~!-S}d_V-1)PB~B>=BHqHP2#n8l zFJWq4Ng|i7giWwbl|xL6nZMD9H6yYv$7dw6@z@=o-a z9Cu1K044}Ap8ZOyx|W|WH=KR&;RzE;pO4YG6`t3GXNJU|GBy^y3XCf6HssigP1Iq{ zDB8`S(4dn!SXx}W*(}tfLJ;7d)iZT z2M`0Lg7%;8jf0MqQBYtgy2FaTv?XEsN>rp-DJ+KXSEBF<%0KAUeeh?4YOSwB>1c|3 z_FX8WA+`8`-@fZsi)g>OY0*)?FGm$)9<-gT1l>I`%28%16Kfd5?I#TWca=@5h}II5 zm=SPQhtQ&j&mznyRv%L~omM=FAqBz1t^bdyw}6WBi@JvuDG5a+r6iwOf;8hJqqX?MbL_I<6`HYv;d{f;yFDoN!hE>b*I+Hz3gwKvBQn)^-sJufn| zt{v@})d_}xN4Ob|a<;{T>oA0M^=bJ|7tIkbyjNhE?CV;ROC9~)A z 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�&~Y zX9vbyl@GvYe^(%EojWn=`oLxk40J@(ps19iD7rcBbsVaMXzqV#MzmMO)@D zPu0Oz>^j=6IrXJjw+&mj(W~I;9g!HX2RVevz2J!HR8^Cx{n_ouoIjy-H0Y=@jW;BU z+idb5*J)AXc@WH=O&j0M<3f_Jjh3NX`@urV4k%_h1OeJs#H6^+m_gnRUKv?DLriT{ zUN5sjMusNNu6KP|_}XR3q9=gkYrZr8&`JAll4f$$#M&av)P7nWBk_DT_I|}AT*S}; zA+{lU{8!Bqsr&?td1|J*si^xFcK>ky*ue234EhK}>@W9k|8M~L@-J7GYt4s~<<93b z=Df3b8p2u{zyx5|mFi<4i|XWkvP=&H#-9F8)2(+yJTmt`&iR#P&vAK}tR!hQ zoqxCZpls+n)E2*0@~%VN=~fms7K#TSRawH@;qv&@VKGYIt&=Z+CUwQJ4ey$}$VqHS zo(Jb^@GJ^;9@=qBC|Y+Ox#0EA=pA_>sIuR?}~zV@E=uBpOmC5B_5b zW{ib?RHle_3V|nQ=p@PyX^a2;NET6AF*tRL30e(hGR5)F74hU!rtM}M0f;Ibi)$t1 zE|R2~bm@zt@Y_9aq7u+fx=zJ+KO%-GCNOlS<_GN(lr5D`ElRN%0UKn2`oaah;^b^X z10DHZ;HL04@N7|ZFc#5zd_9lD7cyw z_ZwGs9<01fq#AqnWdfsAy&~{k*-enMNCgJ!&*!Q%0(}1KFj<5NB<0j+f@B2!~7mCumYcA+BhP+-A1#s|o~&y%{b0tyF5`Rwu41(O3RhI6KDV zJ#;l*d`H_B-T%c}lvgmo)9v|m91n)&FLX>6Q`LuH#Vd&j_w-NWJb!+&7MB;bSF!s@ zk^pauwi0C2(0=n6(@}5mdv0aumBf+a%aNSb{@fe9lT$u^?$62EM3@G_Jp6(})z%9b zPuPtjI~lP+&&Jb-*fyiZjZEx1wff4zW$m>ba&kb10423l;qI9aMNGEqoFlPGbd<^v zb#KlAw|)O+U~afk@YHS6G>klpwBZTU%NV!xS0k#8(Ka5lWG6>gDzn_sI8(jRhH>~= zD2$aWauge$jDx%Tgc`NNF*$BOBz++vc0Uu^@-Ec8aP0{_7O_T8;N%ZfvTl?z%g=J! zw>D^R&xeO^O4p~DcA%dIq87vnK}%LCJtK$c=AaRc)_AWyq36Jepc?fTaBbm+(q(Z3 zd3jRI;J(`{eLYVGk}ftISBkoqymVe?d>JZcAp`whw!E&?_sev@QepC#5}$Gyv3PB% zRTj3&NMeb5JiqJd%xtj)``zylq-t)uNhBkbxA z?6>(Jr#*Yl$Kf%7-kDk)tF~xU1vesaY#vxS4LRsFV|K3zfd+s8 zf2HrL(%ct`enQ-HtQCQ9LnK03X*ronN58lgjD`+HY~<2?=Q0@$t=@GutxR34C9UHXIn76JQPdxh$KYcmokg&K3F*%({5dU<`mieLrzWo zums!UeExIdjzqo#`^Gni@Pj+m5f+K-cvC{;f6VHyam`1<(5?2at>R%N_Mu+S z?=x>0U|*kANB*@vnwR9GXDrhGHz!o{iHcq4^|@7yk?;C!>O+FmV-K=Dv@xcGU{j?Q z+f^^#>gudC5&%;$vl2EgREW@+)*i*hK8}$qDlW?$Z+`!i&F+1vQo>5ce$~ce7 zVnb95W}I7V;71=-eBs*9^XT_yhI!QEQN7I8o887oMncl;CQ|+~d~%fPX8KQJ*Ua<@ z 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

k{D(9<-cz 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

ck7ArA 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 z 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

+ * are input parameters. + */ + +template +class BinghamViscosityLinker + : public StdDataLinker< BinghamViscosityLinker, number, dim> +{ + // Base class type + typedef StdDataLinker< BinghamViscosityLinker, number, dim> base_type; + + // Constructor + public: + BinghamViscosityLinker() : + m_spDensity(NULL), m_spDDensity(NULL), + m_spViscosity(NULL), m_spDViscosity(NULL), + m_spYieldStress(NULL), m_spDYieldStress(NULL), + m_spVelocityGrad(NULL), m_spDVelocityGrad(NULL) + { + // this linker needs exactly four input + this->set_num_input(4); + } + + // function for evaluation at single ip? + inline void evaluate (number& value, + const MathVector& globIP, + number time, int si) const + { + UG_LOG("BinghamViscosityLinker::evaluate single called"); + number density; + number viscosity; + number yieldStress; + MathMatrix velocityGrad; + + (*m_spDensity)(density, globIP, time, si); + (*m_spViscosity)(viscosity, globIP, time, si); + (*m_spYieldStress)(yieldStress, globIP, time, si); + (*m_spVelocityGrad)(velocityGrad, globIP, time, si); + + number innerSum = 0.0; + + // compute inner sum + for(int d1 = 0; d1 < dim; ++d1) + { + for(int d2 = 0; d2 < dim; ++d2) + { + innerSum += pow(velocityGrad(d1,d2) + velocityGrad(d2,d1),2); + } + } + + // compute mu = eta + sigma / \sqrt( delta + 1 / I) + value = viscosity + yieldStress/sqrt(0.5+(1.0/(pow(2, dim))*innerSum)); + value *= 1./density; + } + + // function for evaluation at multiple ips?? + template + inline void evaluate(number vValue[], + const MathVector vGlobIP[], + number time, int si, + GridObject* elem, + const MathVector vCornerCoords[], + const MathVector vLocIP[], + const size_t nip, + LocalVector* u, + const MathMatrix* vJT = NULL) const + { + UG_LOG("BinghamViscosityLinker::evaluate called"); + std::vector vDensity(nip); + std::vector vViscosity(nip); + std::vector vYieldStress(nip); + std::vector > vVelocityGrad(nip); + + (*m_spDensity)(&vDensity[0], vGlobIP, time, si, + elem, vCornerCoords, vLocIP, nip, u, vJT); + (*m_spViscosity)(&vViscosity[0], vGlobIP, time, si, + elem, vCornerCoords, vLocIP, nip, u, vJT); + (*m_spYieldStress)(&vYieldStress[0], vGlobIP, time, si, + elem, vCornerCoords, vLocIP, nip, u, vJT); + (*m_spVelocityGrad)(&vVelocityGrad[0], vGlobIP, time, si, + elem, vCornerCoords, vLocIP, nip, u, vJT); + + for(size_t ip = 0; ip < nip; ++ip) + { + number mu = 0.0; + + // compute inner sum + for(int d1 = 0; d1 < dim; ++d1) + { + for(int d2 = 0; d2 < dim; ++d2) + { + mu += pow(vVelocityGrad[ip](d1,d2) + vVelocityGrad[ip](d2,d1),2); + } + } + + // compute mu = eta + sigma + mu = vViscosity[ip] + vYieldStress[ip]/sqrt(0.5+(1.0/(pow(2, dim))*mu)); + vValue[ip] = mu * 1./vDensity[ip]; + } + } + + template + void eval_and_deriv(number vValue[], + const MathVector vGlobIP[], + number time, int si, + GridObject* elem, + const MathVector vCornerCoords[], + const MathVector vLocIP[], + const size_t nip, + LocalVector* u, + bool bDeriv, + int s, + std::vector > vvvDeriv[], + const MathMatrix* vJT = NULL) const + { + + UG_LOG("BinghamViscosityLinker::eval_and_deriv called"); + // get the data of the ip series + const number* vDensity = m_spDensity->values(s); + const number* vViscosity = m_spViscosity->values(s); + const number* vYieldStress = m_spYieldStress->values(s); + const MathMatrix* vVelocityGrad = m_spVelocityGrad->values(s); + + for(size_t ip = 0; ip < nip; ++ip) + { + number mu = 0.0; + + // compute mu = + for(int d1 = 0; d1 < dim; ++d1) + { + for(int d2 = 0; d2 < dim; ++d2) + { + mu += pow(vVelocityGrad[ip](d1,d2) + vVelocityGrad[ip](d2,d1),2); + } + } + + // compute mu = (eta + tau_F / \sqrt(delta + TrD^2)) / rho + mu = vViscosity[ip] + vYieldStress[ip]/sqrt(0.5+(1.0/(pow(2, dim))*mu)); + vValue[ip] = mu * 1./vDensity[ip]; + } + + // Compute the derivatives at all ips // + ///////////////////////////////////////////// + + // check if something is left to do + if(!bDeriv || this->zero_derivative()) return; + + // clear all derivative values + this->set_zero(vvvDeriv, nip); + + // Derivatives of Density + if(m_spDDensity.valid() && !m_spDDensity->zero_derivative()) + { + for(size_t ip = 0; ip < nip; ++ip) + { + for(size_t fct = 0; fct < m_spDDensity->num_fct(); ++fct) + { + // get derivative of density w.r.t. to all functions + const number* vDDensity = m_spDDensity->deriv(s, ip, fct); + + // get common fct id for this function + const size_t commonFct = this->input_common_fct(_RHO_, fct); + + // loop all shapes and set the derivative + for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh) + { + vvvDeriv[ip][commonFct][sh] -= vDDensity[sh] / vDensity[ip] * vValue[ip]; + } + } + } + } + + // Derivatives of Viscosity + if(m_spDViscosity.valid() && !m_spDViscosity->zero_derivative()) + { + for(size_t ip = 0; ip < nip; ++ip) + { + for(size_t fct = 0; fct < m_spDViscosity->num_fct(); ++fct) + { + // get derivative of viscosity w.r.t. to all functions + const number* vDViscosity = m_spDViscosity->deriv(s, ip, fct); + + // get common fct id for this function + const size_t commonFct = this->input_common_fct(_ETA_, fct); + + // loop all shapes and set the derivative + for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh) + { + vvvDeriv[ip][commonFct][sh] += vDViscosity[sh] / vDensity[ip]; + } + } + } + } + + // Derivatives of yield stress + if(m_spDYieldStress.valid() && !m_spDYieldStress->zero_derivative()) + { + for(size_t ip = 0; ip < nip; ++ip) + { + // Precompute 1 / (rho * \sqrt(delta + TrD^2)) + number rInvariant = vValue[ip] - (vViscosity[ip] / vDensity[ip]); + + for(size_t fct = 0; fct < m_spDYieldStress->num_fct(); ++fct) + { + // get derivative of yield stress w.r.t. to all functions + const number* vDYieldStress = m_spDYieldStress->deriv(s, ip, fct); + + // get common fct id for this function + const size_t commonFct = this->input_common_fct(_TAU_, fct); + + // loop all shapes and set the derivative + for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh) + { + vvvDeriv[ip][commonFct][sh] += vDYieldStress[sh] * rInvariant; + } + } + } + } + + // Derivatives of velocity gradient + UG_LOG("Derivatives of velocity gradient missing"); + /*if(m_spDVelocityGrad.valid() && !m_spDVelocityGrad->zero_derivative()) + { + for(size_t ip = 0; ip < nip; ++ip) + { + for(size_t fct = 0; fct < m_spDYieldStress->num_fct(); ++fct) + { + // get derivative of velocity gradient w.r.t. to all functions + const number* vDYieldStress = m_spDYieldStress->deriv(s, ip, fct); + + // get common fct id for this function + const size_t commonFct = this->input_common_fct(_DV_, fct); + + // loop all shapes and set the derivative + for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh) + { + VecScaleAppend(vvvDeriv[ip][commonFct][sh], vDYieldStress[sh], rInvariant); + } + } + } + }*/ + } + + + + // Setter functions for imports + /// set density import + void set_density(SmartPtr > data) + { + m_spDensity = data; + m_spDDensity = data.template cast_dynamic >(); + base_type::set_input(_RHO_, data, data); + } + + void set_density(number val) + { + set_density(make_sp(new ConstUserNumber(val))); + } + + /// set viscosity import + void set_viscosity(SmartPtr > data) + { + m_spViscosity = data; + m_spDViscosity = data.template cast_dynamic >(); + base_type::set_input(_ETA_, data, data); + } + + void set_viscosity(number val) + { + set_viscosity(make_sp(new ConstUserNumber(val))); + } + + /// set density import + void set_yield_stress(SmartPtr > data) + { + m_spYieldStress = data; + m_spDYieldStress = data.template cast_dynamic >(); + base_type::set_input(_TAU_, data, data); + } + + void set_yield_stress(number val) + { + set_yield_stress(make_sp(new ConstUserNumber(val))); + } + + /// set velocity gradient import + void set_velocity_gradient(SmartPtr, dim> > data) + { + UG_LOG("Debug mark 1\n"); + m_spVelocityGrad = data; + UG_LOG("Debug mark 2\n"); + try{ + UG_LOG(typeid(data).name() << "\n"); + m_spDVelocityGrad = data.template cast_dynamic, dim> >(); + } catch (std::exception& e) { + UG_LOG("Error: " << e.what()); + } + UG_LOG("Debug mark 3\n"); + base_type::set_input(_DV_, data, data); + } + + protected: + // variables for storing imports + /// import for density + static const size_t _RHO_ = 0; + SmartPtr > m_spDensity; + SmartPtr > m_spDDensity; + /// import for viscosity + static const size_t _ETA_ = 1; + SmartPtr > m_spViscosity; + SmartPtr > m_spDViscosity; + /// import for yield stress + static const size_t _TAU_ = 2; + SmartPtr > m_spYieldStress; + SmartPtr > m_spDYieldStress; + /// import for velocity gradient + static const size_t _DV_ = 3; + SmartPtr, dim> > m_spVelocityGrad; + SmartPtr, dim> > m_spDVelocityGrad; +}; + +} // end of namespace ug + +#endif // __H__UG__LIB_DISC__SPATIAL_DISC__BINGHAM_VISCOSITY_LINKER__ diff --git a/ugbase/lib_disc/time_disc/composite_time_disc_impl.h b/ugbase/lib_disc/time_disc/composite_time_disc_impl.h index d09b1dc6b..c4f001e40 100644 --- a/ugbase/lib_disc/time_disc/composite_time_disc_impl.h +++ b/ugbase/lib_disc/time_disc/composite_time_disc_impl.h @@ -213,7 +213,7 @@ void CompositeTimeDiscretization::assemble_rhs(vector_type& b, const G template void CompositeTimeDiscretization::adjust_solution(vector_type& u, const GridLevel& gl) { - for (size_t i = 1; i < m_vTimeDisc.size(); ++i) + for (size_t i = 0; i < m_vTimeDisc.size(); ++i) m_vTimeDisc[i]->adjust_solution(u, gl); } @@ -221,7 +221,7 @@ template SmartPtr > CompositeTimeDiscretization::ass_tuner() { SmartPtr sp = make_sp(new CompositeAssTuner()); - for (size_t i = 1; i < m_vTimeDisc.size(); ++i) + for (size_t i = 0; i < m_vTimeDisc.size(); ++i) sp->add_ass_tuner(((IAssemble*)m_vTimeDisc[i].get())->ass_tuner()); return sp; @@ -237,7 +237,7 @@ template size_t CompositeTimeDiscretization::num_constraints() const { size_t n = 0; - for (size_t i = 1; i < m_vTimeDisc.size(); ++i) + for (size_t i = 0; i < m_vTimeDisc.size(); ++i) n += m_vTimeDisc[i]->num_constraints(); return n; @@ -252,10 +252,12 @@ SmartPtr > CompositeTimeDiscretization::constrai size_t n = 0; size_t k = 0; - while (n += m_vTimeDisc[k]->num_constraints() <= i) + while ((n += m_vTimeDisc[k]->num_constraints()) <= i) ++k; - return m_vTimeDisc[k]->constraint(i - n); + const size_t indInCurTD = i - (n - m_vTimeDisc[k]->num_constraints()); + + return m_vTimeDisc[k]->constraint(indInCurTD); } } // end namespace ug diff --git a/ugbase/lib_grid/CMakeLists.txt b/ugbase/lib_grid/CMakeLists.txt index 0cdf40363..05d5a2e12 100644 --- a/ugbase/lib_grid/CMakeLists.txt +++ b/ugbase/lib_grid/CMakeLists.txt @@ -86,8 +86,11 @@ set(srcAlgorithms algorithms/debug_util.cpp refinement/projectors/projection_handler.cpp refinement/projectors/smooth_projector.cpp refinement/projectors/subdivision_projector.cpp + refinement/projectors/neurite_projector.cpp + refinement/projectors/elliptic_cylinder_projector.cpp refinement/ref_mark_adjusters/local_mark_adjuster.cpp refinement/ref_mark_adjusters/horizontal_anisotropy_adjuster.cpp + refinement/ref_mark_adjusters/shadow_copy_adjuster.cpp refinement/ref_mark_adjusters/mg_hnode_adjuster.cpp refinement/ref_mark_adjusters/std_hnode_adjuster.cpp refinement/adaptive_regular_mg_refiner.cpp diff --git a/ugbase/lib_grid/algorithms/deg_layer_mngr_impl.h b/ugbase/lib_grid/algorithms/deg_layer_mngr_impl.h index bb8e83d19..7613c5759 100644 --- a/ugbase/lib_grid/algorithms/deg_layer_mngr_impl.h +++ b/ugbase/lib_grid/algorithms/deg_layer_mngr_impl.h @@ -34,6 +34,7 @@ * Implementation of the degenerated layer subset manager. */ // ug4 headers +#include "common/util/string_util.h" #include "lib_grid/grid/grid.h" namespace ug { diff --git a/ugbase/lib_grid/algorithms/element_aspect_ratios.h b/ugbase/lib_grid/algorithms/element_aspect_ratios.h index 26edbe130..0d0e5d5fa 100644 --- a/ugbase/lib_grid/algorithms/element_aspect_ratios.h +++ b/ugbase/lib_grid/algorithms/element_aspect_ratios.h @@ -37,6 +37,8 @@ #include "lib_grid/parallelization/distributed_grid.h" #endif +#include + /* system includes */ #include #include @@ -107,47 +109,70 @@ number CalculateMinTriangleHeight(Face* face, TAAPosVRT& aaPos) template number CalculateAspectRatio(Grid& grid, TElem* elem, TAAPosVRT& aaPos); -/// Face (Triangles and Constrained Triangles supported) +/// Quadrilaterals template -number CalculateAspectRatio(Grid& grid, Face* face, TAAPosVRT& aaPos) +number CalculateAspectRatio(Grid& grid, Quadrilateral* quad, TAAPosVRT& aaPos) { + typedef AABox box_t; + Vertex* const* vrts = quad->vertices(); + box_t box(aaPos[vrts[0]], aaPos[vrts[0]]); + for (size_t i = 1; i < quad->num_vertices(); ++i){ + box = box_t(box, aaPos[vrts[i]]); + } + const number xDist = box.max.x() - box.min.x(); + const number yDist = box.max.y() - box.min.y(); + return xDist > yDist ? xDist/yDist : yDist/xDist; +} + +/// Triangles and Constrained Triangles +template +number CalculateAspectRatio(Grid& grid, Triangle* tri, TAAPosVRT& aaPos) { - //PROFILE_FUNC(); - number AspectRatio; number maxEdgeLength; -// Collect element edges, find longest edge and calculate its length + // Collect element edges, find longest edge and calculate its length vector edges; - CollectAssociated(edges, grid, face); + CollectAssociated(edges, grid, tri); Edge* longestEdge = FindLongestEdge(edges.begin(), edges.end(), aaPos); maxEdgeLength = EdgeLength(longestEdge, aaPos); + /* + * optimal aspect ratio of a regular tetrahedron with edge lengths a: + * Q = hmin/lmax = sqrt(3)/2*a / a = 0.866... + * + * Info: return value is normalized by factor 2/sqrt(3) + * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002) + */ + + // Calculate minimal triangle height + number minTriangleHeight = CalculateMinTriangleHeight(tri, aaPos); + + // Calculate the aspect ratio + return 2/std::sqrt(3.0) * minTriangleHeight / maxEdgeLength; +} + +/// CalculateAspectRatio for faces +template +number CalculateAspectRatio(Grid& grid, Face* face, TAAPosVRT& aaPos) +{ switch (face->reference_object_id()) { case ROID_TRIANGLE: { - /* - * optimal aspect ratio of a regular tetrahedron with edge lengths a: - * Q = hmin/lmax = sqrt(3)/2*a / a = 0.866... - * - * Info: return value is normalized by factor 2/sqrt(3) - * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002) - */ - - // Calculate minimal triangle height - number minTriangleHeight = CalculateMinTriangleHeight(face, aaPos); - - // Calculate the aspect ratio - AspectRatio = 2/std::sqrt(3.0) * minTriangleHeight / maxEdgeLength; - return AspectRatio; + return CalculateAspectRatio(grid, static_cast(face), aaPos); + } + + case ROID_QUADRILATERAL: + { + return CalculateAspectRatio(grid, static_cast(face), aaPos); } default: { - UG_THROW("Note: Currently only faces of type triangle supported in aspect ratio calculation."); + UG_THROW("Note: Currently only faces of type triangle and quadrilateral" + " supported in aspect ratio calculation."); break; } } - return NAN; } @@ -155,9 +180,6 @@ number CalculateAspectRatio(Grid& grid, Face* face, TAAPosVRT& aaPos) template number CalculateAspectRatio(Grid& grid, Tetrahedron* tet, TAAPosVRT& aaPos) { - //PROFILE_FUNC(); - number AspectRatio; - /* * optimal Aspect Ratio of a regular tetrahedron with edge lengths a: * Q = hmin/lmax = sqrt(2/3)*a / a = 0.8164... @@ -165,11 +187,14 @@ number CalculateAspectRatio(Grid& grid, Tetrahedron* tet, TAAPosVRT& aaPos) * Info: return value is normalized by factor sqrt(3/2) * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002) */ + return CalculateTetrahedronAspectRatio(grid, tet, aaPos); +} -// Calculate the aspect ratio - AspectRatio = CalculateTetrahedronAspectRatio(grid, tet, aaPos); - - return AspectRatio; +/// Hexahedron +template +number CalculateAspectRatio(Grid& grid, Hexahedron* hex, TAAPosVRT& aaPos) +{ + return CalculateHexahedronAspectRatio(grid, hex, aaPos); } /// Volume @@ -183,9 +208,15 @@ number CalculateAspectRatio(Grid& grid, Volume* vol, TAAPosVRT& aaPos) return CalculateAspectRatio(grid, static_cast(vol), aaPos); } + case ROID_HEXAHEDRON: + { + return CalculateAspectRatio(grid, static_cast(vol), aaPos); + } + default: { - UG_THROW("Note: Currently only volumes of type tetrahedron supported in aspect ratio calculation."); + UG_THROW("Note: Currently only volumes of type tetrahedron and hexahedron" + " supported in aspect ratio calculation."); break; } } @@ -206,7 +237,8 @@ number CalculateVolToRMSFaceAreaRatio(Grid& grid, TElem* elem, TAAPosVRT& aaPos) template number CalculateVolToRMSFaceAreaRatio(Grid& grid, Face* face, TAAPosVRT& aaPos) { - UG_THROW("CalculateVolToRMSFaceAreaRatio: Currently only volumes of type tetrahedron supported in volume to root-mean-square face area ratio calculation."); + UG_THROW("CalculateVolToRMSFaceAreaRatio: Currently only volumes of type tetrahedron" + " supported in volume to root-mean-square face area ratio calculation."); return NAN; } @@ -226,7 +258,7 @@ number CalculateVolToRMSFaceAreaRatio(Grid& grid, Tetrahedron* tet, TAAPosVRT& a * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002) */ -// Calculate the ratio + // Calculate the ratio ratio = CalculateTetrahedronVolToRMSFaceAreaRatio(grid, tet, aaPos); return ratio; @@ -245,7 +277,8 @@ number CalculateVolToRMSFaceAreaRatio(Grid& grid, Volume* vol, TAAPosVRT& aaPos) default: { - UG_THROW("CalculateVolToRMSFaceAreaRatio: Currently only volumes of type tetrahedron supported in aspect ratio calculation."); + UG_THROW("CalculateVolToRMSFaceAreaRatio: Currently only volumes of type tetrahedron" + " supported in volume to root-mean-square face area ratio calculation."); break; } } @@ -493,7 +526,5 @@ FindElementWithLargestVolToRMSFaceAreaRatio(Grid& grid, TIterator elemsBegin, return elementWithLargestRatio; } - - } #endif diff --git a/ugbase/lib_grid/algorithms/geom_obj_util/anisotropy_util.h b/ugbase/lib_grid/algorithms/geom_obj_util/anisotropy_util.h new file mode 100644 index 000000000..cc49a7eb1 --- /dev/null +++ b/ugbase/lib_grid/algorithms/geom_obj_util/anisotropy_util.h @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2009-2015: G-CSC, Goethe University Frankfurt + * Author: Markus Breit + * Date: 2018-05-25 + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef LIB_GRID__ALGORITHMS__GEOM_OBJ_UTIL__ANISOTROPY_UTIL_H +#define LIB_GRID__ALGORITHMS__GEOM_OBJ_UTIL__ANISOTROPY_UTIL_H + +#include "common/types.h" +#include "lib_grid/grid/grid_base_objects.h" +#include "lib_grid/multi_grid.h" + +#include +#include + +namespace ug { + + +enum AnisotropyState +{ + ISOTROPIC = 0, + QUAD_SHORTX, + QUAD_SHORTY, + PRISM_FLAT, + PRISM_LONG, + HEX_SHORTX, + HEX_SHORTY, + HEX_SHORTZ, + HEX_SHORTXY, + HEX_SHORTXZ, + HEX_SHORTYZ +}; + + +template +AnisotropyState is_anisotropic +( + Edge* elem, + const TAAPos& aaPos, + number thresholdRatio +); + + +template +AnisotropyState is_anisotropic +( + Face* elem, + const TAAPos& aaPos, + number thresholdRatio +); + + +template +AnisotropyState is_anisotropic +( + Volume* elem, + const TAAPos& aaPos, + number thresholdRatio +); + + + +template +AnisotropyState close_sides_of_anisotropic_elem +( + Edge* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& sidesOut +); + + +template +AnisotropyState close_sides_of_anisotropic_elem +( + Face* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& sidesOut +); + + +template +AnisotropyState close_sides_of_anisotropic_elem +( + Volume* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& sidesOut +); + + + +template +AnisotropyState long_edges_of_anisotropic_elem +( + Edge* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& longEdges +); + + +template +AnisotropyState long_edges_of_anisotropic_elem +( + Face* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& longEdges +); + + +template +AnisotropyState long_edges_of_anisotropic_elem +( + Volume* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& longEdges +); + + + +} // namespace ug + +#include "anisotropy_util_impl.h" + +#endif // LIB_GRID__ALGORITHMS__GEOM_OBJ_UTIL__ANISOTROPY_UTIL_H diff --git a/ugbase/lib_grid/algorithms/geom_obj_util/anisotropy_util_impl.h b/ugbase/lib_grid/algorithms/geom_obj_util/anisotropy_util_impl.h new file mode 100644 index 000000000..7df6af8f0 --- /dev/null +++ b/ugbase/lib_grid/algorithms/geom_obj_util/anisotropy_util_impl.h @@ -0,0 +1,604 @@ +/* + * Copyright (c) 2009-2015: G-CSC, Goethe University Frankfurt + * Author: Markus Breit + * Date: 2018-05-25 + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#include "lib_grid/algorithms/element_side_util.h" // for GetOpposingSide +#include "lib_grid/grid/grid_util.h" // for CompareVertices + + +namespace ug { + + +template +AnisotropyState is_anisotropic +( + Edge* elem, + const TAAPos& aaPos, + number thresholdRatio +) +{ + return ISOTROPIC; +} + + + +template +static AnisotropyState is_anisotropic +( + Quadrilateral* q, + const TAAPos& aaPos, + number thresholdRatio +) +{ + // check whether elem is anisotropic + number sideLength02 = VertexDistance(q->vertex(0), q->vertex(1), aaPos) + + VertexDistance(q->vertex(2), q->vertex(3), aaPos); + + number sideLength13 = VertexDistance(q->vertex(1), q->vertex(2), aaPos) + + VertexDistance(q->vertex(3), q->vertex(0), aaPos); + + if (sideLength02 < thresholdRatio * sideLength13) + return QUAD_SHORTX; + if (sideLength13 < thresholdRatio * sideLength02) + return QUAD_SHORTY; + + return ISOTROPIC; +} + + + +template +AnisotropyState is_anisotropic +( + Face* elem, + const TAAPos& aaPos, + number thresholdRatio +) +{ + Quadrilateral* q = dynamic_cast(elem); + if (!q) + return ISOTROPIC; + + return is_anisotropic(q, aaPos, thresholdRatio); +} + + + + +template +static AnisotropyState is_anisotropic +( + Prism* p, + const TAAPos& aaPos, + number thresholdRatio +) +{ + // check whether elem is anisotropic + number length = VertexDistance(p->vertex(0), p->vertex(3), aaPos) + + VertexDistance(p->vertex(1), p->vertex(4), aaPos) + + VertexDistance(p->vertex(2), p->vertex(5), aaPos); + number width = VertexDistance(p->vertex(0), p->vertex(1), aaPos) + + VertexDistance(p->vertex(1), p->vertex(2), aaPos) + + VertexDistance(p->vertex(2), p->vertex(0), aaPos) + + VertexDistance(p->vertex(3), p->vertex(4), aaPos) + + VertexDistance(p->vertex(4), p->vertex(5), aaPos) + + VertexDistance(p->vertex(5), p->vertex(3), aaPos); + + number ratio = width ? 2.0*length/width : std::numeric_limits::max(); + + // flat case + if (ratio < thresholdRatio) + return PRISM_FLAT; + + // long case + if (ratio*thresholdRatio > 1) + return PRISM_LONG; + + return ISOTROPIC; +} + + + +template +static AnisotropyState is_anisotropic +( + Hexahedron* hex, + const TAAPos& aaPos, + number thresholdRatio +) +{ + number length1 = VertexDistance(hex->vertex(0), hex->vertex(1), aaPos) + + VertexDistance(hex->vertex(2), hex->vertex(3), aaPos) + + VertexDistance(hex->vertex(4), hex->vertex(5), aaPos) + + VertexDistance(hex->vertex(6), hex->vertex(7), aaPos); + number length2 = VertexDistance(hex->vertex(0), hex->vertex(3), aaPos) + + VertexDistance(hex->vertex(1), hex->vertex(2), aaPos) + + VertexDistance(hex->vertex(4), hex->vertex(7), aaPos) + + VertexDistance(hex->vertex(5), hex->vertex(6), aaPos); + number length3 = VertexDistance(hex->vertex(0), hex->vertex(4), aaPos) + + VertexDistance(hex->vertex(1), hex->vertex(5), aaPos) + + VertexDistance(hex->vertex(2), hex->vertex(6), aaPos) + + VertexDistance(hex->vertex(3), hex->vertex(7), aaPos); + + bool shortx = false; + bool shorty = false; + bool shortz = false; + + if (length1 < thresholdRatio * length2 || length1 < thresholdRatio * length3) + shortx = true; + + if (length2 < thresholdRatio * length1 || length2 < thresholdRatio * length3) + shorty = true; + + if (length3 < thresholdRatio * length1 || length3 < thresholdRatio * length2) + shortz = true; + + if (shortx) + { + if (shorty) + return HEX_SHORTXY; + if (shortz) + return HEX_SHORTXZ; + return HEX_SHORTX; + } + + if (shorty) + { + if (shortz) + return HEX_SHORTYZ; + return HEX_SHORTY; + } + + if (shortz) + return HEX_SHORTZ; + + return ISOTROPIC; +} + + + +template +AnisotropyState is_anisotropic +( + Volume* elem, + const TAAPos& aaPos, + number thresholdRatio +) +{ + // treat prism case + Prism* prism = dynamic_cast(elem); + if (prism) + return is_anisotropic(prism, aaPos, thresholdRatio); + + // treat hexahedron case + Hexahedron* hex = dynamic_cast(elem); + if (hex) + return is_anisotropic(hex, aaPos, thresholdRatio); + + // other cases do not exist + return ISOTROPIC; +} + + + +template +AnisotropyState close_sides_of_anisotropic_elem +( + Edge* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& sidesOut +) +{ + return ISOTROPIC; +} + + +template +AnisotropyState close_sides_of_anisotropic_elem +( + Face* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& sidesOut +) +{ + // check whether this is a quadrilateral + Quadrilateral* q = dynamic_cast(elem); + if (!q) + return ISOTROPIC; + + // check whether element is anisotropic (and which case) + AnisotropyState state = is_anisotropic(q, aaPos, thresholdRatio); + if (state == ISOTROPIC) + return state; + + if (state == QUAD_SHORTX) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, q); + sidesOut.push_back(assEd[1]); + sidesOut.push_back(assEd[3]); + + return state; + } + + if (state == QUAD_SHORTY) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, q); + sidesOut.push_back(assEd[0]); + sidesOut.push_back(assEd[2]); + + return state; + } + + return state; +} + + + +template +AnisotropyState close_sides_of_anisotropic_elem +( + Volume* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& sidesOut +) +{ + // treat prism case + Prism* prism = dynamic_cast(elem); + if (prism) + { + AnisotropyState state = is_anisotropic(prism, aaPos, thresholdRatio); + if (state == ISOTROPIC) + return state; + + // flat case + if (state == PRISM_FLAT) + { + Face* side = grid.get_side(prism, 0); + if (side) + sidesOut.push_back(side); + + side = grid.get_side(prism, 4); + if (side) + sidesOut.push_back(side); + } + + // long case + if (state == PRISM_LONG) + { + Face* side = grid.get_side(prism, 1); + if (side) + sidesOut.push_back(side); + + side = grid.get_side(prism, 2); + if (side) + sidesOut.push_back(side); + + side = grid.get_side(prism, 3); + if (side) + sidesOut.push_back(side); + } + + return state; + } + + + // treat heaxahedron case + Hexahedron* hex = dynamic_cast(elem); + if (hex) + { + AnisotropyState state = is_anisotropic(hex, aaPos, thresholdRatio); + if (state == ISOTROPIC) + return state; + + + // short in x direction + if (state == HEX_SHORTX || state == HEX_SHORTXY || state == HEX_SHORTXZ) + { + Face* side = grid.get_side(hex, 2); + if (side) + sidesOut.push_back(side); + + side = grid.get_side(hex, 4); + if (side) + sidesOut.push_back(side); + } + + // short in y direction + if (state == HEX_SHORTY || state == HEX_SHORTXY || state == HEX_SHORTYZ) + { + Face* side = grid.get_side(hex, 1); + if (side) + sidesOut.push_back(side); + + side = grid.get_side(hex, 3); + if (side) + sidesOut.push_back(side); + } + + // short in z direction + if (state == HEX_SHORTZ || state == HEX_SHORTXZ || state == HEX_SHORTYZ) + { + Face* side = grid.get_side(hex, 0); + if (side) + sidesOut.push_back(side); + + side = grid.get_side(hex, 5); + if (side) + sidesOut.push_back(side); + } + + return state; + } + + + // other elements cannot be anisotropic + return ISOTROPIC; +} + + + + + +template +AnisotropyState long_edges_of_anisotropic_elem +( + Edge* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& longEdges +) +{ + return ISOTROPIC; +} + + +template +AnisotropyState long_edges_of_anisotropic_elem +( + Face* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& longEdges +) +{ + return close_sides_of_anisotropic_elem(elem, grid, aaPos, thresholdRatio, longEdges); +} + + +template +AnisotropyState long_edges_of_anisotropic_elem +( + Volume* elem, + Grid& grid, + const TAAPos& aaPos, + number thresholdRatio, + std::vector& longEdges +) +{ + // treat prism case + Prism* prism = dynamic_cast(elem); + if (prism) + { + AnisotropyState state = is_anisotropic(prism, aaPos, thresholdRatio); + if (state == ISOTROPIC) + return state; + + // flat case + if (state == PRISM_FLAT) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, prism); + + UG_COND_THROW(assEd.size() < 9, "Prism needs to have 9 edges, but only " + << assEd.size() << " found."); + + longEdges.reserve(longEdges.size() + 6); + longEdges.push_back(assEd[0]); + longEdges.push_back(assEd[1]); + longEdges.push_back(assEd[2]); + longEdges.push_back(assEd[6]); + longEdges.push_back(assEd[7]); + longEdges.push_back(assEd[8]); + + return state; + } + + // long case + if (state == PRISM_LONG) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, prism); + + UG_COND_THROW(assEd.size() < 9, "Prism needs to have 9 edges, but only " + << assEd.size() << " found."); + + longEdges.reserve(longEdges.size() + 3); + longEdges.push_back(assEd[3]); + longEdges.push_back(assEd[4]); + longEdges.push_back(assEd[5]); + + return state; + } + + return state; + } + + + // treat heaxahedron case + Hexahedron* hex = dynamic_cast(elem); + if (hex) + { + AnisotropyState state = is_anisotropic(hex, aaPos, thresholdRatio); + if (state == ISOTROPIC) + return state; + + + // short in x direction + if (state == HEX_SHORTX) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, hex); + + UG_COND_THROW(assEd.size() < 12, "Hexahedron needs to have 12 edges, but only " + << assEd.size() << " found."); + + longEdges.reserve(longEdges.size() + 8); + longEdges.push_back(assEd[1]); + longEdges.push_back(assEd[3]); + longEdges.push_back(assEd[4]); + longEdges.push_back(assEd[5]); + longEdges.push_back(assEd[6]); + longEdges.push_back(assEd[7]); + longEdges.push_back(assEd[8]); + longEdges.push_back(assEd[11]); + + return state; + } + + // short in y direction + if (state == HEX_SHORTY) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, hex); + + UG_COND_THROW(assEd.size() < 12, "Hexahedron needs to have 12 edges, but only " + << assEd.size() << " found."); + + longEdges.reserve(longEdges.size() + 8); + longEdges.push_back(assEd[0]); + longEdges.push_back(assEd[2]); + longEdges.push_back(assEd[4]); + longEdges.push_back(assEd[5]); + longEdges.push_back(assEd[6]); + longEdges.push_back(assEd[7]); + longEdges.push_back(assEd[8]); + longEdges.push_back(assEd[10]); + + return state; + } + + // short in z direction + if (state == HEX_SHORTZ) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, hex); + + UG_COND_THROW(assEd.size() < 12, "Hexahedron needs to have 12 edges, but only " + << assEd.size() << " found."); + + longEdges.reserve(longEdges.size() + 8); + longEdges.push_back(assEd[0]); + longEdges.push_back(assEd[1]); + longEdges.push_back(assEd[2]); + longEdges.push_back(assEd[3]); + longEdges.push_back(assEd[8]); + longEdges.push_back(assEd[9]); + longEdges.push_back(assEd[10]); + longEdges.push_back(assEd[11]); + + return state; + } + + // short in x and y direction + if (state == HEX_SHORTXY) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, hex); + + UG_COND_THROW(assEd.size() < 12, "Hexahedron needs to have 12 edges, but only " + << assEd.size() << " found."); + + longEdges.reserve(longEdges.size() + 4); + longEdges.push_back(assEd[4]); + longEdges.push_back(assEd[5]); + longEdges.push_back(assEd[6]); + longEdges.push_back(assEd[7]); + + return state; + } + + // short in x and z direction + if (state == HEX_SHORTXZ) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, hex); + + UG_COND_THROW(assEd.size() < 12, "Hexahedron needs to have 12 edges, but only " + << assEd.size() << " found."); + + longEdges.reserve(longEdges.size() + 4); + longEdges.push_back(assEd[1]); + longEdges.push_back(assEd[3]); + longEdges.push_back(assEd[9]); + longEdges.push_back(assEd[11]); + + return state; + } + + // short in y and z direction + if (state == HEX_SHORTYZ) + { + Grid::SecureEdgeContainer assEd; + grid.associated_elements_sorted(assEd, hex); + + UG_COND_THROW(assEd.size() < 12, "Hexahedron needs to have 12 edges, but only " + << assEd.size() << " found."); + + longEdges.reserve(longEdges.size() + 4); + longEdges.push_back(assEd[0]); + longEdges.push_back(assEd[2]); + longEdges.push_back(assEd[8]); + longEdges.push_back(assEd[10]); + + return state; + } + + return state; + } + + + // other elements cannot be anisotropic + return ISOTROPIC; +} + +} // namespace ug + diff --git a/ugbase/lib_grid/algorithms/geom_obj_util/face_util.cpp b/ugbase/lib_grid/algorithms/geom_obj_util/face_util.cpp index 47c2d9576..b5dcf8985 100644 --- a/ugbase/lib_grid/algorithms/geom_obj_util/face_util.cpp +++ b/ugbase/lib_grid/algorithms/geom_obj_util/face_util.cpp @@ -59,7 +59,7 @@ int GetFaceIndex(Volume* vol, Face* f) //////////////////////////////////////////////////////////////////////// // CalculateNormal -void CalculateNormal(vector3& vNormOut, FaceVertices* face, +void CalculateNormal(vector3& vNormOut, const FaceVertices* face, Grid::AttachmentAccessor& aaPos) { if(face->num_vertices() == 3) @@ -231,7 +231,7 @@ number FaceQuality(FaceVertices* f, } if(numVrts == 3){ - // since at least one angle is <= 60�, we have to normalize the return value + // since at least one angle is <= 60, we have to normalize the return value return quality * 2.; } return quality; @@ -264,7 +264,7 @@ number TriangleQuality(vector3& v1, vector3& v2, vector3& v3) VecScale(d1, d2, -1); } -// since at least one angle is <= 60�, we have to normalize the return value +// since at least one angle is <= 60, we have to normalize the return value return quality * 2.; } diff --git a/ugbase/lib_grid/algorithms/geom_obj_util/face_util.h b/ugbase/lib_grid/algorithms/geom_obj_util/face_util.h index 6fab0c041..6fdb1af3f 100644 --- a/ugbase/lib_grid/algorithms/geom_obj_util/face_util.h +++ b/ugbase/lib_grid/algorithms/geom_obj_util/face_util.h @@ -75,7 +75,7 @@ UG_API int GetFaceIndex(Volume* vol, Face* f); * Performs normalization on the calcluated normals. */ UG_API -void CalculateNormal(vector3& vNormOut, FaceVertices* face, +void CalculateNormal(vector3& vNormOut, const FaceVertices* face, Grid::AttachmentAccessor& aaPos); //////////////////////////////////////////////////////////////////////// @@ -268,7 +268,7 @@ void GetNeighbours(std::vector& vFacesOut, Grid& grid, Face* f, //////////////////////////////////////////////////////////////////////// // template methods //////////////////////////////////////////////////////////////////////// -// CalculateFaceCenter +// CalculateCenter /// calculates the center of a face. /** * TVertexPositionAttachmentAccessor has to be an AttachmentAccessor, @@ -282,14 +282,7 @@ void GetNeighbours(std::vector& vFacesOut, Grid& grid, Face* f, template UG_API typename TVertexPositionAttachmentAccessor::ValueType -CalculateFaceCenter(Face* f, TVertexPositionAttachmentAccessor& aaPosVRT); - -//////////////////////////////////////////////////////////////////////// -template -UG_API -typename TVertexPositionAttachmentAccessor::ValueType CalculateCenter(const FaceVertices* f, TVertexPositionAttachmentAccessor& aaPosVRT); - /** \} */ diff --git a/ugbase/lib_grid/algorithms/geom_obj_util/misc_util.h b/ugbase/lib_grid/algorithms/geom_obj_util/misc_util.h index 754e7de30..de21bcac8 100644 --- a/ugbase/lib_grid/algorithms/geom_obj_util/misc_util.h +++ b/ugbase/lib_grid/algorithms/geom_obj_util/misc_util.h @@ -173,6 +173,12 @@ template number MaxElementDiameter(Grid& grid, TAAPos& aaPos, TIterator iterBegin, TIterator iterEnd); +/// returns the minimal diameter of all elements between iterBegin and iterEnd. +/** In parallel, the global min diameter is returned.*/ +template +number MinElementDiameter(Grid& grid, TAAPos& aaPos, + TIterator iterBegin, TIterator iterEnd); + /// Returns the direction from the center of e1 to the center of e2 template diff --git a/ugbase/lib_grid/algorithms/geom_obj_util/misc_util_impl.hpp b/ugbase/lib_grid/algorithms/geom_obj_util/misc_util_impl.hpp index 77ba054d3..5c87ffc10 100644 --- a/ugbase/lib_grid/algorithms/geom_obj_util/misc_util_impl.hpp +++ b/ugbase/lib_grid/algorithms/geom_obj_util/misc_util_impl.hpp @@ -40,6 +40,8 @@ #include "face_util.h" #include "volume_util.h" +#include + namespace ug { @@ -301,6 +303,23 @@ number MaxElementDiameter(Grid& grid, TAAPos& aaPos, return std::sqrt(max); } +template +number MinElementDiameter(Grid& grid, TAAPos& aaPos, + TIterator iter, TIterator iterEnd) +{ + number min = std::numeric_limits::max(); + for(; iter != iterEnd; ++iter) + min = std::min(min, ElementDiameterSq(grid, aaPos, *iter)); + +#ifdef UG_PARALLEL + // share value between all procs + pcl::ProcessCommunicator com; + min = com.allreduce(min, PCL_RO_MIN); +#endif + + return std::sqrt(min); +} + template typename TAAPos::ValueType diff --git a/ugbase/lib_grid/algorithms/geom_obj_util/volume_util.cpp b/ugbase/lib_grid/algorithms/geom_obj_util/volume_util.cpp index d0cb86e32..f67019c16 100644 --- a/ugbase/lib_grid/algorithms/geom_obj_util/volume_util.cpp +++ b/ugbase/lib_grid/algorithms/geom_obj_util/volume_util.cpp @@ -165,6 +165,59 @@ number CalculateTetrahedronAspectRatio(Grid& grid, Tetrahedron* tet, return aspectRatio; } +//////////////////////////////////////////////////////////////////////////////////////////// +// CalculateHexahedronAspectRatio +//////////////////////////////////////////////////////////////////////////////////////////// +number CalculateHexahedronAspectRatio(Grid& grid, Hexahedron* hex, + Grid::VertexAttachmentAccessor& aaPos) +{ + /* + * Another important indicator of the mesh quality is the aspect ratio. + * The aspect ratio is a measure of the stretching of a cell. It is computed + * as the ratio of the maximum value to the minimum value of any of the + * following distances: the normal distances between the cell centroid and + * face centroids (computed as a dot product of the distance vector and the + * face normal), and the distances between the cell centroid and nodes. + * For a unit cube (see Figure 5.23: Calculating the Aspect Ratio for a Unit + * Cube), the maximum distance is 0.866, and the minimum distance is 0.5, + * so the aspect ratio is 1.732. This type of definition can be applied on + * any type of mesh, including polyhedral. + * + * \see https://www.sharcnet.ca/Software/Ansys/17.0/en-us/help/flu_ug/flu_ug_mesh_quality.html + * + */ + vector faces; + CollectAssociated(faces, grid, hex); + ug::vector3 center = CalculateCenter(hex, aaPos); + + /// Max distance to face center + std::vector As; + for (size_t i = 0; i < faces.size(); i++) + { + vector3 dir; + vector3 faceCenter = CalculateCenter(faces[i], aaPos); + VecSubtract(dir, faceCenter, center); + vector3 n; + CalculateNormal(n, faces[i], aaPos); + number dist = VecDot(dir, n); + As.push_back(dist); + } + number max = *std::max_element(As.begin(), As.end()); + + /// Min distance to node of hexaeder + std::vector Bs; + for (size_t i = 0; i < hex->num_vertices(); i++) + { + number dist = VecDistance(aaPos[hex->vertex(i)], center); + Bs.push_back(dist); + } + number min = *std::min_element(Bs.begin(), Bs.end()); + + UG_COND_WARNING(std::abs(min) < SMALL, "Near 0-length minimum distance detected."); + + return max / min; +} + //////////////////////////////////////////////////////////////////////////////////////////// // CalculateTetrahedronRootMeanSquareFaceArea - mstepnie @@ -303,7 +356,7 @@ double CMesh::calculate_volume_gauss() { for(uint i = 0; i < number_of_triangles; i++) { - �uint a = triangles[i].a; + uint a = triangles[i].a; uint b = triangles[i].b; uint c = triangles[i].c; @@ -319,9 +372,9 @@ double CMesh::calculate_volume_gauss() { if(length > 0.0) { - �x /= length; - � y /= length; - � z /= length; + x /= length; + y /= length; + z /= length; double sx = (vertices[a].x() + vertices[b].x() + vertices[c].x()) / 3.0; double sy = (vertices[a].y() + vertices[b].y() + vertices[c].y()) / 3.0; diff --git a/ugbase/lib_grid/algorithms/geom_obj_util/volume_util.h b/ugbase/lib_grid/algorithms/geom_obj_util/volume_util.h index b181b12a5..d2324cfee 100644 --- a/ugbase/lib_grid/algorithms/geom_obj_util/volume_util.h +++ b/ugbase/lib_grid/algorithms/geom_obj_util/volume_util.h @@ -80,6 +80,13 @@ UG_API number CalculateTetrahedronAspectRatio(Grid& grid, Tetrahedron* tet, Grid::VertexAttachmentAccessor& aaPos); +//////////////////////////////////////////////////////////////////////// +// CalculateHexahedronAspectRatio +/// calculates the aspect ratio of a hexahedral element +UG_API +number CalculateHexahedronAspectRatio(Grid& grid, Hexahedron* tet, + Grid::VertexAttachmentAccessor& aaPos); + //////////////////////////////////////////////////////////////////////////////////////////// // CalculateTetrahedronRootMeanSquareFaceArea - mstepnie diff --git a/ugbase/lib_grid/algorithms/grid_generation/tetrahedralization.cpp b/ugbase/lib_grid/algorithms/grid_generation/tetrahedralization.cpp index e445bc395..cc2523615 100644 --- a/ugbase/lib_grid/algorithms/grid_generation/tetrahedralization.cpp +++ b/ugbase/lib_grid/algorithms/grid_generation/tetrahedralization.cpp @@ -45,22 +45,6 @@ using namespace std; namespace ug { - -#ifdef UG_TETGEN -static const char* VerbosityToTetgenParam(int verbosity) -{ - if(verbosity <= 0) - return ""; - else if(verbosity == 1) - return "V"; - else if(verbosity == 2) - return "VV"; - else - return "VVV"; -} -#endif - - static bool PerformTetrahedralization(Grid& grid, ISubsetHandler* pSH, number quality, diff --git a/ugbase/lib_grid/algorithms/grid_generation/tetrahedralization.h b/ugbase/lib_grid/algorithms/grid_generation/tetrahedralization.h index 1e3ce4d4f..01a591af3 100644 --- a/ugbase/lib_grid/algorithms/grid_generation/tetrahedralization.h +++ b/ugbase/lib_grid/algorithms/grid_generation/tetrahedralization.h @@ -53,8 +53,11 @@ namespace ug * * Using tetgen by Hang Si. * - * \param verbosity number between 0 and 3 indicating how detailed the - * verbosity should be + * \param[in] quality number specifiying grid quality between 0 and 18 + * \param[in] preserveBnds bool to specify if outer boundaries shall be preserved + * \param[in] preserveAll bool to specify if outer and inner boundaries shall be preserved + * \param[in] verbosity number between 0 and 3 to specify level of verbosity + * * \{ */ bool Tetrahedralize(Grid& grid, number quality = 5, @@ -69,6 +72,20 @@ bool Tetrahedralize(Grid& grid, ISubsetHandler& sh, bool preserveAll = false, APosition& aPos = aPosition, int verbosity = 0); + +#ifdef UG_TETGEN +/*! + * \brief Verbosity level specified by an integer to Tetgen verbosity string + * Highest verbosity level is 3 (VVV) and lowest is 0 i.e. empty string ("") + * \param[in] verbosity + * \return \c std::string Tetgen's verbosity string + */ +inline const char* VerbosityToTetgenParam(int verbosity) { + return std::string(std::max(std::min(verbosity, 3), 0), 'V').c_str(); +} +#endif + + /// \} /// If tetrahedrons are already present, this method refines them based on the given volume constraints. diff --git a/ugbase/lib_grid/algorithms/grid_generation/triangle_fill_sweep_line.cpp b/ugbase/lib_grid/algorithms/grid_generation/triangle_fill_sweep_line.cpp index f83061dc5..a5e93c629 100644 --- a/ugbase/lib_grid/algorithms/grid_generation/triangle_fill_sweep_line.cpp +++ b/ugbase/lib_grid/algorithms/grid_generation/triangle_fill_sweep_line.cpp @@ -1112,7 +1112,7 @@ for(SweepLineEdgeIter iter = edges.begin(); iter != edges.end(); ++iter){ // stack and do some administrative stuff if(lastBranchInd == -1){ stk.push(cur); - lastBranchInd = curBranchInd; + //lastBranchInd = curBranchInd; // never used } else{ // if the last branch was on the other side we can now build triangles diff --git a/ugbase/lib_grid/algorithms/orientation_util_impl.hpp b/ugbase/lib_grid/algorithms/orientation_util_impl.hpp index 2979fb544..e59ccdb4a 100644 --- a/ugbase/lib_grid/algorithms/orientation_util_impl.hpp +++ b/ugbase/lib_grid/algorithms/orientation_util_impl.hpp @@ -190,7 +190,7 @@ FixOrientation(Grid& grid, TVolIterator volsBegin, TVolIterator volsEnd, { int numFlips = 0; // iterate through all volumes - for(VolumeIterator iter = volsBegin; iter != volsEnd; ++iter){ + for(TVolIterator iter = volsBegin; iter != volsEnd; ++iter){ // check whether the orientation is fine if(!CheckOrientation(*iter, aaPosVRT)){ grid.flip_orientation(*iter); diff --git a/ugbase/lib_grid/algorithms/remeshing/resolve_intersections.h b/ugbase/lib_grid/algorithms/remeshing/resolve_intersections.h index f9c26d208..d623defba 100644 --- a/ugbase/lib_grid/algorithms/remeshing/resolve_intersections.h +++ b/ugbase/lib_grid/algorithms/remeshing/resolve_intersections.h @@ -7,7 +7,7 @@ * UG4 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License version 3 (as published by the * Free Software Foundation) with the following additional attribution - * requirements (according to LGPL/GPL v3 §7): + * requirements (according to LGPL/GPL v3 ��7): * * (1) The following notice must be displayed in the Appropriate Legal Notices * of covered and combined works: "Based on UG4 (www.ug4.org/license)". @@ -20,7 +20,7 @@ * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively * parallel geometric multigrid solver on hierarchically distributed grids. * Computing and visualization in science 16, 4 (2013), 151-164" - * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * "Vogel, A., Reiter, S., Rupp, M., N��gel, A., and Wittum, G. UG4 -- a novel * flexible software system for simulating pde based models on high performance * computers. Computing and visualization in science 16, 4 (2013), 165-179" * @@ -105,10 +105,21 @@ bool IntersectCloseEdges(Grid& grid, /// returns the index of the first vertex closer to p than snapThreshold. /** returns -1 if nothing was found.*/ template -int FindCloseVertexInArray(std::vector& array, - const typename TAAPosVRT::ValueType& p, +int FindCloseVertexInArray(const std::vector& array, + const typename TAAPosVRT::ValueType& p, TAAPosVRT& aaPos, number snapThreshold); +/// returns the index of the closest vertex to p if closer than snapThreshold. +template +int FindClosestVertexInArray(const std::vector& array, const Vertex* p, + TAAPosVRT& aaPos, number snapThreshold); + +/// returns the index of the closest vertex to p if closer than snapThreshold +template +int FindClosestVertexInPointSet(const vector_t* pointSet, const Vertex* p, + TAAPosVRT& aaPos, number snapThreshold, + size_t numPoints); + //////////////////////////////////////////////////////////////////////// /** This method uses Grid::mark */ diff --git a/ugbase/lib_grid/algorithms/remeshing/resolve_intersections_impl.hpp b/ugbase/lib_grid/algorithms/remeshing/resolve_intersections_impl.hpp index 100a3514f..002b8141c 100644 --- a/ugbase/lib_grid/algorithms/remeshing/resolve_intersections_impl.hpp +++ b/ugbase/lib_grid/algorithms/remeshing/resolve_intersections_impl.hpp @@ -7,7 +7,7 @@ * UG4 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License version 3 (as published by the * Free Software Foundation) with the following additional attribution - * requirements (according to LGPL/GPL v3 §7): + * requirements (according to LGPL/GPL v3 ��7): * * (1) The following notice must be displayed in the Appropriate Legal Notices * of covered and combined works: "Based on UG4 (www.ug4.org/license)". @@ -20,7 +20,7 @@ * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively * parallel geometric multigrid solver on hierarchically distributed grids. * Computing and visualization in science 16, 4 (2013), 151-164" - * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * "Vogel, A., Reiter, S., Rupp, M., N��gel, A., and Wittum, G. UG4 -- a novel * flexible software system for simulating pde based models on high performance * computers. Computing and visualization in science 16, 4 (2013), 165-179" * @@ -1012,6 +1012,42 @@ int FindCloseVertexInArray(std::vector& array, return -1; } +/// returns the index of the closest vertex to p smaller than snapThreshold. +/** returns -1 if nothing was found.*/ +template +int FindClosestVertexInArray(std::vector& array, const Vertex* p, + TAAPosVRT& aaPos, number snapThreshold) +{ + number snapThrSq = snapThreshold * snapThreshold; + + number bestDistance = VecDistanceSq(aaPos[array[0]], aaPos[p]); + int bestElem = 0; + + for (size_t i = 1; i < array.size(); ++i) { + number dist = VecDistanceSq(aaPos[array[i]], aaPos[p]); + if (dist < bestDistance) { + bestDistance = dist; + bestElem = i; + } + } + return (bestDistance < snapThrSq) ? bestElem : -1; +} + +/// returns the index of the closest vertex to p smaller than snapThreshold. +/** returns -1 if nothing was found.*/ +template +int FindClosestVertexInPointSet(const vector_t* pointSet, const Vertex* p, + TAAPosVRT& aaPos, number snapThreshold, + size_t numPoints) { + std::vector vertices; + vertices.resize(numPoints); + for (size_t i = 0; i < numPoints; ++i) { + vertices[i] = pointSet[i]; + } + return FindClosestVertexInArray(vertices, p, aaPos, snapThreshold); +} + + //////////////////////////////////////////////////////////////////////// /// Intersects Coplanar Triangles /** fills a vector with the intersections on tri 1. Each pair of points @@ -1372,7 +1408,6 @@ bool ResolveTriangleIntersections(Grid& grid, TriangleIterator trisBegin, // iterate over all triangles and perform intersecion with other triangles size_t triCounter = 0; - const size_t dbgTriInd(-1); for(TriangleIterator triIter1 = sel.begin(); triIter1 != sel.end(); ++triIter1, ++triCounter) { diff --git a/ugbase/lib_grid/algorithms/selection_util.cpp b/ugbase/lib_grid/algorithms/selection_util.cpp index 26843cf4a..63bb90f8e 100644 --- a/ugbase/lib_grid/algorithms/selection_util.cpp +++ b/ugbase/lib_grid/algorithms/selection_util.cpp @@ -623,7 +623,7 @@ void SelectSmoothEdgePath(Selector& sel, number thresholdDegree, number normalWe if(stopAtSelVrts && sel.is_selected(srcVrt)) srcVrt = NULL; - lastEdge = bestEdge; + // lastEdge = bestEdge; // never used lastDir = bestDir; bLastNormalValid = bBestNormalValid; lastNormal = bestNormal; @@ -1294,4 +1294,38 @@ void SelectElementsByIndex (ISelector& sel, SelectElementsByIndex (sel, volInds); } +void SelectSubset(ISelector& sel, + const ISubsetHandler& sh, + int si, + ISelector::status_t status) +{ + GridObjectCollection goc = sh.get_grid_objects_in_subset(si); + for (size_t lvl = 0; lvl < goc.num_levels(); ++lvl) { + for (VertexIterator iter = goc.begin(lvl); iter != goc.end(lvl); ++iter) { + sel.select(*iter, status); + } + + for (EdgeIterator iter = goc.begin(lvl); iter != goc.end(lvl); ++iter) { + sel.select(*iter, status); + } + + for (FaceIterator iter = goc.begin(lvl); iter != goc.end(lvl); ++iter) { + sel.select(*iter, status); + } + + for (VolumeIterator iter = goc.begin(lvl); iter != goc.end(lvl); ++iter) { + sel.select(*iter, status); + } + } +} + + +// explicit template instantiation +// (although used in the above function, the template functions +// may not be compiled with external linkage!) +template void SelectElementsByIndex(ISelector& sel, const std::vector& inds); +template void SelectElementsByIndex(ISelector& sel, const std::vector& inds); +template void SelectElementsByIndex(ISelector& sel, const std::vector& inds); +template void SelectElementsByIndex(ISelector& sel, const std::vector& inds); + }// end of namespace diff --git a/ugbase/lib_grid/algorithms/selection_util.h b/ugbase/lib_grid/algorithms/selection_util.h index aa4e42fbf..0d7966dde 100644 --- a/ugbase/lib_grid/algorithms/selection_util.h +++ b/ugbase/lib_grid/algorithms/selection_util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2015: G-CSC, Goethe University Frankfurt + * Copyright (c) 2009-2015: G-CSC, Goethe University FrankfurtG * Author: Sebastian Reiter * * This file is part of UG4. @@ -616,6 +616,18 @@ void SelectElementsByIndex (ISelector& sel, /** \} */ +/** + * \brief Select all elements specified by a subset index ans selection status + * \param[in, out] sel + * \param[in] sh + * \param[in] si + * \param[in] status + */ +void SelectSubset(ISelector& sel, + const ISubsetHandler& sh, + int si, + ISelector::status_t status); + /**@}*/ // end of doxygen defgroup command }// end of namespace diff --git a/ugbase/lib_grid/algorithms/subdivision/subdivision_volumes.cpp b/ugbase/lib_grid/algorithms/subdivision/subdivision_volumes.cpp index c0943a3f7..9cd0eb408 100644 --- a/ugbase/lib_grid/algorithms/subdivision/subdivision_volumes.cpp +++ b/ugbase/lib_grid/algorithms/subdivision/subdivision_volumes.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2017: G-CSC, Goethe University Frankfurt + * Copyright (c) 2014-2019: G-CSC, Goethe University Frankfurt * Author: Martin Stepniewski * * This file is part of UG4. @@ -514,7 +514,7 @@ void ProjectHierarchyToLimitSubdivisionSurface(MultiGrid& mg) // Catch use of procedure for MultiGrids with just one level if(mg.num_levels() == 1) { - UG_THROW("Error in ProjectHierarchyToLimitSubdivisionVolume2d: " + UG_THROW("Error in ProjectHierarchyToLimitSubdivisionSurface: " "Procedure only to be used for MultiGrids with more than one level."); } @@ -570,7 +570,7 @@ void ProjectHierarchyToLimitSubdivisionVolume(MultiGrid& mg) // Catch use of procedure for MultiGrids with just one level if(mg.num_levels() == 1) { - UG_THROW("Error in ProjectHierarchyToLimitSubdivisionVolume3d: " + UG_THROW("Error in ProjectHierarchyToLimitSubdivisionVolume: " "Procedure only to be used for MultiGrids with more than one level."); } @@ -618,6 +618,413 @@ void ProjectHierarchyToLimitSubdivisionVolume(MultiGrid& mg) } +//////////////////////////////////////////////////////////////////////////////// +void CalculateSmoothManifoldPosInParentLevelButterflyScheme3d(MultiGrid& mg, MGSubsetHandler& markSH, + MGSubsetHandler& linearManifoldSH, + APosition& aSmoothBndPosOddVrt, + AInt& aNumManifoldEdges) +{ + /* + * Scheme reference: + * + * D. N. Zorin, Interpolating Subdivision for Meshes with Arbitrary Topology, + * SIGGRAPH '96 Proceedings of the 23rd annual conference on Computer graphics + * and interactive techniques, 1996. + */ + +// WARNING: Parallel implementation has to be fixed + #ifdef UG_PARALLEL + UG_LOG("WARNING: CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: " + "Parallel implementation has to be fixed." << std::endl); + #endif + +// Catch use of procedure for MultiGrids with just one level + if(mg.num_levels() == 1) + { + UG_THROW("Error in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: " + "Procedure only to be used for MultiGrids with more than one level."); + } + +// Define attachment accessors + Grid::VertexAttachmentAccessor aaPos(mg, aPosition); + Grid::EdgeAttachmentAccessor aaSmoothBndPosOddVrt(mg, aSmoothBndPosOddVrt); + Grid::VertexAttachmentAccessor aaNumManifoldEdges(mg, aNumManifoldEdges); + + #ifdef UG_PARALLEL + DistributedGridManager& dgm = *mg.distributed_grid_manager(); + #endif + +// Declare centroid coordinate vector + typedef APosition::ValueType pos_type; + pos_type p; + pos_type q; + VecSet(p, 0); + VecSet(q, 0); + + /* + * Smoothing of odd vertices x + * + -1/16 1/8 -1/16 + \ / \ / + 1/2--x--1/2 + / \ / \ + -1/16 1/8 -1/16 + * + */ + +// Calculate smooth position for ODD vertices (EVEN vertices will be interpolated by this scheme) + for(EdgeIterator eIter = mg.begin(mg.top_level()-1); eIter != mg.end(mg.top_level()-1); ++eIter) + { + // Reset centroids + VecSet(p, 0); + VecSet(q, 0); + + Edge* e = *eIter; + + // Skip ghost edges + #ifdef UG_PARALLEL + if(dgm.is_ghost(e)) + continue; + #endif + + // In case of marked manifold edges, which do not belong to the user-specified linear boundary manifold subsets, + // and activated subdivision Butterfly refinement calculate subdivision surfaces smooth position + if(markSH.get_subset_index(e) != -1 && linearManifoldSH.get_subset_index(e) == -1) + { + // REGULAR CASE: both edge vertices are of valence 6 + if(aaNumManifoldEdges[e->vertex(0)] == 6 && aaNumManifoldEdges[e->vertex(1)] == 6) + { + // perform Butterfly subdivision on odd manifold vertices + // get the neighbored manifold triangles + std::vector associatedFaces; + std::vector associatedButterflyFaces; + std::vector associatedManifoldFaces; + std::vector associatedButterflyManifoldFaces; + + CollectAssociated(associatedFaces, mg, e); + + for(size_t i = 0; i < associatedFaces.size(); ++i) + { + // Only consider associated faces, which are marked as manifold faces + if(markSH.get_subset_index(associatedFaces[i]) != -1) + { + // Exclude ghost and horizontal slave manifold faces + #ifdef UG_PARALLEL + if(dgm.is_ghost(associatedFaces[i])) + continue; + + if(dgm.contains_status(associatedFaces[i], ES_H_SLAVE)) + continue; + #endif + + if(associatedManifoldFaces.size() < 2) + { + associatedManifoldFaces.push_back(associatedFaces[i]); + } + } + } + + // THROW, if more then 2 associated manifold faces have been found + if(associatedManifoldFaces.size() <= 2) + { + // Check, if all faces are triangles + for(size_t i = 0; i < associatedManifoldFaces.size(); ++i) + { + if(associatedManifoldFaces[i]->num_vertices() != 3) + { + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: " + "Non triangular faces included in grid: " << ElementDebugInfo(mg, associatedManifoldFaces[i])); + } + } + + // Summate centroid of face adjacent vertices (with corresponding weights 1/8) + for(size_t i = 0; i < associatedManifoldFaces.size(); ++i) + { + VecAdd(p, p, aaPos[GetConnectedVertex(e, associatedManifoldFaces[i])]); + } + + // Extend original "Loop's neighborhood diamond" to include 'BUTTERFLY VERTICES' (with corresponding weights -1/16) + for(size_t i = 0; i < associatedManifoldFaces.size(); ++i) + { + // Iterate over edges of original "Loop's neighborhood diamond" to extend to Butterfly neighborhood + for(size_t j = 0; j < associatedManifoldFaces[i]->num_edges(); ++j) + { + // Clear face container + associatedButterflyFaces.clear(); + associatedButterflyManifoldFaces.clear(); + + // Exclude edge e currently being edited + if(j != (size_t)GetEdgeIndex(associatedManifoldFaces[i], e)) + { + // Collect associated Butterfly face adjacent to edge j + GetNeighbours(associatedButterflyFaces, mg, associatedManifoldFaces[i], j); + + for(size_t k = 0; k < associatedButterflyFaces.size(); ++k) + { + // Only consider associated butterfly faces, which are marked as manifold faces + if(markSH.get_subset_index(associatedButterflyFaces[k]) != -1) + { + // Exclude ghost and horizontal slave manifold faces + #ifdef UG_PARALLEL + if(dgm.is_ghost(associatedButterflyFaces[k])) + continue; + + if(dgm.contains_status(associatedButterflyFaces[k], ES_H_SLAVE)) + continue; + #endif + + if(associatedButterflyFaces[k]->num_vertices() != 3) + { + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: " + "Non triangular faces included in grid: " << ElementDebugInfo(mg, associatedButterflyFaces[k])); + } + + associatedButterflyManifoldFaces.push_back(associatedButterflyFaces[k]); + } + } + + if(associatedButterflyManifoldFaces.size() != 1) + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: number of edge associated Butterfly Manifold faces != 1."); + + // Summate centroid of butterly face adjacent vertex + VecAdd(q, q, aaPos[GetConnectedVertex(mg.get_edge(associatedManifoldFaces[i]->edge_desc(j)), associatedButterflyManifoldFaces[0])]); + } + } + } + + // Exclude ghost and horizontal slaves of the parent edge vertices of the currently smoothed vertex + // to avoid multiple contributions to the centroid of the edge adjacent vertices + #ifdef UG_PARALLEL + if(dgm.is_ghost(e)) + { + continue; + } + + if(dgm.contains_status(e, ES_H_SLAVE)) + { + VecScaleAppend(aaSmoothBndPosOddVrt[e], 0.125, p, -1.0/16, q); + continue; + } + #endif + + VecScaleAppend(aaSmoothBndPosOddVrt[e], 0.5, aaPos[e->vertex(0)], 0.5, aaPos[e->vertex(1)], 0.125, p, -1.0/16, q); + } + else + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: numAssociatedManifoldFaces > 2."); + } + + // IRREGULAR CASE: at least one edge vertex irregular + if(aaNumManifoldEdges[e->vertex(0)] != 6 || aaNumManifoldEdges[e->vertex(1)] != 6) + { + // Number of centroids to calculate (1 or 2, depending on the valence of the vertices of e) + size_t numLoops; + + if((aaNumManifoldEdges[e->vertex(0)] != 6 && aaNumManifoldEdges[e->vertex(1)] == 6) || + (aaNumManifoldEdges[e->vertex(0)] == 6 && aaNumManifoldEdges[e->vertex(1)] != 6)) + { + numLoops = 1; + } + // case aaNumManifoldEdges[e->vertex(0)] != 6 && aaNumManifoldEdges[e->vertex(1)] != 6 + else + numLoops = 2; + + // Loop centroids to calculate + for(size_t n = 0; n < numLoops; ++n) + { + // Reset centroids + VecSet(p, 0); + VecSet(q, 0); + + Vertex* vrt; + Vertex* butterflyVertex; + + std::vector associatedFaces; + std::vector associatedManifoldFaces; + + // Determine smoothing case + if(aaNumManifoldEdges[e->vertex(0)] != 6 && aaNumManifoldEdges[e->vertex(1)] == 6) + { + vrt = e->vertex(0); + + // Push back e->vertex(1) as vertex s_0 + butterflyVertex = e->vertex(1); + } + else if (aaNumManifoldEdges[e->vertex(0)] == 6 && aaNumManifoldEdges[e->vertex(1)] != 6) + { + vrt = e->vertex(1); + + // Push back e->vertex(0) as vertex s_0 + butterflyVertex = e->vertex(0); + } + // case aaNumManifoldEdges[e->vertex(0)] != 6 && aaNumManifoldEdges[e->vertex(1)] != 6 + else + { + vrt = e->vertex(n); + + // Push back the other vertex as vertex s_0 + butterflyVertex = e->vertex(1 - (n % 2)); + } + + // perform Butterfly subdivision on odd manifold vertices + // get the neighbored manifold triangles + CollectAssociated(associatedFaces, mg, e); + + for(size_t i = 0; i < associatedFaces.size(); ++i) + { + // Only consider associated faces, which are marked as manifold faces + if(markSH.get_subset_index(associatedFaces[i]) != -1) + { + // Exclude ghost and horizontal slave manifold faces + #ifdef UG_PARALLEL + if(dgm.is_ghost(associatedFaces[i])) + continue; + + if(dgm.contains_status(associatedFaces[i], ES_H_SLAVE)) + continue; + #endif + + if(associatedManifoldFaces.size() < 2) + { + associatedManifoldFaces.push_back(associatedFaces[i]); + } + } + } + + if(associatedManifoldFaces.size() <= 2) + { + // Check, if all faces are triangles + for(size_t i = 0; i < associatedManifoldFaces.size(); ++i) + { + if(associatedManifoldFaces[i]->num_vertices() != 3) + { + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: " + "Non triangular faces included in grid: " << ElementDebugInfo(mg, associatedManifoldFaces[i])); + } + } + + // Start with one triangle of "Loop's neighborhood diamond" + Face* f = associatedManifoldFaces[0]; + size_t k = (size_t)aaNumManifoldEdges[vrt]; + + number butterflyWeight = 0.0; + std::vector butterflyWeights; + + if(k == 3) + { + butterflyWeights.push_back(5.0/12); + butterflyWeights.push_back(-1.0/12); + butterflyWeights.push_back(-1.0/12); + } + + if(k == 4) + { + butterflyWeights.push_back(3.0/8); + butterflyWeights.push_back(0.0); + butterflyWeights.push_back(-1.0/8); + butterflyWeights.push_back(0.0); + } + + // Special parallel treatment for s_0 in case e is ghost or horizontal slave + if(k != 3 && k != 4) + butterflyWeight = 1.0/k * 7.0/4; + else + butterflyWeight = butterflyWeights[0]; + + VecScaleAppend(p, butterflyWeight, aaPos[butterflyVertex]); + + // Ordered traversing of associated edges of currently considered irregular vertex vrt + for(size_t i = 1; i < k; ++i) + { + // Clear face containers + associatedFaces.clear(); + associatedManifoldFaces.clear(); + + // Get connecting edge of next butterfly vertex s_i in line to vrt + if(f->get_opposing_object(butterflyVertex).first != EDGE) + { + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: " + "Opposing object of butterfly vertex in manifold face is not an edge: " + << ElementDebugInfo(mg, f)) + } + + Edge* egdeOfNextFace = mg.get_edge(f, f->get_opposing_object(butterflyVertex).second); + + // Store butterfly vertex s_i + egdeOfNextFace->get_opposing_side(vrt, &butterflyVertex); + + // butterfly weight s_i + if(k != 3 && k != 4) + butterflyWeight = 1.0/k * (1.0/4 + cos(2*i*PI/k) + 1.0/2*cos(4*i*PI/k)); + else + butterflyWeight = butterflyWeights[i]; + + // Summate centroid of butterly vertices s_i + VecScaleAppend(q, butterflyWeight, aaPos[butterflyVertex]); + + // Get next face to traverse + GetNeighbours(associatedFaces, mg, f, GetEdgeIndex(f, egdeOfNextFace)); + + for(size_t j = 0; j < associatedFaces.size(); ++j) + { + // Only consider associated faces, which are marked as manifold faces + if(markSH.get_subset_index(associatedFaces[j]) != -1) + { + // Exclude ghost and horizontal slave manifold faces + #ifdef UG_PARALLEL + if(dgm.is_ghost(associatedFaces[j])) + continue; + + if(dgm.contains_status(associatedFaces[j], ES_H_SLAVE)) + continue; + #endif + + associatedManifoldFaces.push_back(associatedFaces[j]); + } + } + + if(associatedManifoldFaces.size() != 1) + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: number of edge associated Butterfly Manifold faces != 1."); + + // Store next face in line to traverse in next iteration + f = associatedManifoldFaces[0]; + } + + // Exclude ghost and horizontal slaves of the parent edge vertices of the currently smoothed vertex + // to avoid multiple contributions to the centroid of the edge adjacent vertices + #ifdef UG_PARALLEL + if(dgm.is_ghost(e)) + { + continue; + } + + if(dgm.contains_status(e, ES_H_SLAVE)) + { + VecScaleAppend(aaSmoothBndPosOddVrt[e], 1.0/numLoops, q); + continue; + } + #endif + + VecScaleAppend(aaSmoothBndPosOddVrt[e], 1.0/numLoops*3.0/4, aaPos[vrt], 1.0/numLoops, p, 1.0/numLoops, q); + } + else + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelButterflyScheme3d: numAssociatedManifoldFaces > 2."); + } + } + } + } + +// Manage vertex and edge attachment communication in parallel case -> COMMUNICATE aSmoothBndPosEvenVrt, aSmoothBndPosOddVrt + #ifdef UG_PARALLEL + // Reduce add operations: + // sum up h_slaves into h_masters + + // Copy operations: + // copy h_masters to h_slaves for consistency + AttachmentAllReduce(mg, aSmoothBndPosOddVrt, PCL_RO_SUM); + #endif +} + + //////////////////////////////////////////////////////////////////////////////// void CalculateSmoothManifoldPosInParentLevelLoopScheme2d(MultiGrid& mg, MGSubsetHandler& markSH, MGSubsetHandler& linearManifoldSH, @@ -625,10 +1032,17 @@ void CalculateSmoothManifoldPosInParentLevelLoopScheme2d(MultiGrid& mg, MGSubset APosition2& aSmoothBndPosOddVrt, AInt& aNumManifoldEdges) { + /* + * Scheme reference: + * + * C. Loop, Smooth subdivision surfaces based on triangles, + * master’s thesis, University of Utah, 1987. + */ + // Catch use of procedure for MultiGrids with just one level if(mg.num_levels() == 1) { - UG_THROW("Error in CalculateSmoothManifoldPosInParentLevel: " + UG_THROW("Error in CalculateSmoothManifoldPosInParentLevelLoopScheme2d: " "Procedure only to be used for MultiGrids with more than one level."); } @@ -775,7 +1189,7 @@ void CalculateSmoothManifoldPosInParentLevelLoopScheme2d(MultiGrid& mg, MGSubset { if(associatedManifoldFaces[i]->num_vertices() != 3) { - UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevel2d: " + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelLoopScheme2d: " "Non triangular faces included in grid: " << ElementDebugInfo(mg, associatedManifoldFaces[i])); } } @@ -804,7 +1218,7 @@ void CalculateSmoothManifoldPosInParentLevelLoopScheme2d(MultiGrid& mg, MGSubset VecScaleAppend(aaSmoothBndPosOddVrt[e], 0.375, aaPos[e->vertex(0)], 0.375, aaPos[e->vertex(1)], 0.125, p); } else - UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevel2d: numAssociatedManifoldFaces > 2."); + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelLoopScheme2d: numAssociatedManifoldFaces > 2."); } } @@ -828,10 +1242,17 @@ void CalculateSmoothManifoldPosInParentLevelLoopScheme3d(MultiGrid& mg, MGSubset APosition& aSmoothBndPosOddVrt, AInt& aNumManifoldEdges) { + /* + * Scheme reference: + * + * C. Loop, Smooth subdivision surfaces based on triangles, + * master’s thesis, University of Utah, 1987. + */ + // Catch use of procedure for MultiGrids with just one level if(mg.num_levels() == 1) { - UG_THROW("Error in CalculateSmoothManifoldPosInParentLevel: " + UG_THROW("Error in CalculateSmoothManifoldPosInParentLevelLoopScheme3d: " "Procedure only to be used for MultiGrids with more than one level."); } @@ -978,7 +1399,7 @@ void CalculateSmoothManifoldPosInParentLevelLoopScheme3d(MultiGrid& mg, MGSubset { if(associatedManifoldFaces[i]->num_vertices() != 3) { - UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevel3d: " + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelLoopScheme3d: " "Non triangular faces included in grid: " << ElementDebugInfo(mg, associatedManifoldFaces[i])); } } @@ -1007,7 +1428,7 @@ void CalculateSmoothManifoldPosInParentLevelLoopScheme3d(MultiGrid& mg, MGSubset VecScaleAppend(aaSmoothBndPosOddVrt[e], 0.375, aaPos[e->vertex(0)], 0.375, aaPos[e->vertex(1)], 0.125, p); } else - UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevel: numAssociatedManifoldFaces > 2."); + UG_THROW("ERROR in CalculateSmoothManifoldPosInParentLevelLoopScheme3d: numAssociatedManifoldFaces > 2."); } } @@ -1030,6 +1451,13 @@ void CalculateSmoothManifoldPosInTopLevelAveragingScheme2d(MultiGrid& mg, MGSubs APosition2& aSmoothBndPos_tri, APosition2& aSmoothBndPos_quad) { + /* + * Scheme reference: + * + * J. Warren and H. Weimer, Subdivision Methods for Geometric Design: A Constructive Approach, + * Morgan Kaufmann Publishers Inc., San Francisco, CA, USA, 1st ed., 2001. + */ + // Define attachment accessors Grid::VertexAttachmentAccessor aaPos(mg, aPosition2); Grid::VertexAttachmentAccessor aaSmoothBndPos_tri(mg, aSmoothBndPos_tri); @@ -1132,6 +1560,13 @@ void CalculateSmoothManifoldPosInTopLevelAveragingScheme3d(MultiGrid& mg, MGSubs APosition& aSmoothBndPos_tri, APosition& aSmoothBndPos_quad) { + /* + * Scheme reference: + * + * J. Warren and H. Weimer, Subdivision Methods for Geometric Design: A Constructive Approach, + * Morgan Kaufmann Publishers Inc., San Francisco, CA, USA, 1st ed., 2001. + */ + // Define attachment accessors Grid::VertexAttachmentAccessor aaPos(mg, aPosition); Grid::VertexAttachmentAccessor aaSmoothBndPos_tri(mg, aSmoothBndPos_tri); @@ -1234,6 +1669,15 @@ void CalculateSmoothVolumePosInTopLevel(MultiGrid& mg, MGSubsetHandler& markSH, APosition& aSmoothVolPos_prism, APosition& aSmoothVolPos_hex) { + /* + * Scheme references: + * + * S. Schaefer, J. Hakenberg, and J. Warren, Smooth subdivision of tetrahedral meshes, + * Proceedings of the 2004 Eurographics/ACM Symposium on Geometry Processing. + * + * J. Hakenberg, Smooth Subdivision for Mixed Volumetric Meshes, thesis, 2004 + */ + #ifdef UG_PARALLEL DistributedGridManager& dgm = *mg.distributed_grid_manager(); #endif @@ -1473,7 +1917,7 @@ void CalculateConstrainedSmoothVolumePosInTopLevel(MultiGrid& mg, MGSubsetHandle { if(GetVertexIndex(vol, oppVrt) == -1) { - UG_THROW("ERROR in CalculateSmoothVolumePosInTopLevel: identified opposing vertex actually not included in current volume."); + UG_THROW("ERROR in CalculateConstrainedSmoothVolumePosInTopLevel: identified opposing vertex actually not included in current volume."); } if(j != i && j != (size_t)GetVertexIndex(vol, oppVrt)) @@ -2129,6 +2573,132 @@ void ApplySmoothManifoldPosToTopLevelLoopScheme3d(MultiGrid& mg, MGSubsetHandler } +//////////////////////////////////////////////////////////////////////////////// +void ApplySmoothManifoldPosToTopLevelButterflyScheme3d(MultiGrid& mg, MGSubsetHandler& markSH, + MGSubsetHandler& linearManifoldSH) +{ +// Catch use of procedure for MultiGrids with just one level + if(mg.num_levels() == 1) + { + UG_THROW("Error in ApplySmoothManifoldPosToTopLevelButterflyScheme3d: " + "Procedure only to be used for MultiGrids with more than one level."); + } + + +/***************************************** + * + * (1) SETUP + * + *****************************************/ + +// Vertex attachments for associated number of manifold edges and smooth position +// (distinguish between volume and boundary smooth vertex positions +// and in case of boundary between EVEN and ODD smooth vertex positions) + AInt aNumManifoldEdges; + APosition aSmoothBndPosOddVrt; + +// attach previously declared vertex attachments with initial value 0 + mg.attach_to_vertices_dv(aNumManifoldEdges, 0); + mg.attach_to_edges_dv(aSmoothBndPosOddVrt, vector3(0, 0, 0)); + +// Define attachment accessors + Grid::VertexAttachmentAccessor aaPos(mg, aPosition); + Grid::EdgeAttachmentAccessor aaSmoothBndPosOddVrt(mg, aSmoothBndPosOddVrt); + +// Manage vertex attachment communication in parallel case: +// - Setup communication policy for the above attachment aPosition +// - Setup interface communicator +// - Setup distributed grid manager +// - Setup grid layout map + #ifdef UG_PARALLEL + // Attachment communication policies COPY + ComPol_CopyAttachment comPolCopyAPosition(mg, aPosition); + + // Interface communicators and distributed domain manager + pcl::InterfaceCommunicator com; + DistributedGridManager& dgm = *mg.distributed_grid_manager(); + GridLayoutMap& glm = dgm.grid_layout_map(); + #endif + + +/***************************************** + * + * (2) DETERMINE aNumManifoldEdges + * + *****************************************/ + + CalculateNumManifoldEdgesVertexAttachmentInParentLevel(mg, markSH, aNumManifoldEdges); + + +/***************************************** + * + * (3) CALCULATE aSmoothBndPosEvenVrt, + * aSmoothBndPosOddVrt + * + *****************************************/ + +// Calculate aSmoothBndPosOddVrt + CalculateSmoothManifoldPosInParentLevelButterflyScheme3d(mg, markSH, linearManifoldSH, aSmoothBndPosOddVrt, aNumManifoldEdges); + + +/***************************************** + * + * (4) APPLY + * + *****************************************/ + +// Loop all vertices of top_level + for(VertexIterator vrtIter = mg.begin(mg.top_level()); vrtIter != mg.end(mg.top_level()); ++vrtIter) + { + Vertex* vrt = *vrtIter; + + // Catch vertices without parent + if(mg.get_parent(vrt) == NULL) + continue; + + // In case of marked manifold vertices, which do not belong to the user-specified linear boundary manifold subsets, + // and activated Loop scheme refinement apply subdivision surfaces smoothing, else linear refinement + if(markSH.get_subset_index(vrt) != -1 && linearManifoldSH.get_subset_index(vrt) == -1) + { + // ODD VERTEX + if(mg.get_parent(vrt)->reference_object_id() == ROID_EDGE) + { + // Get parent edge + Edge* parentEdge = static_cast(mg.get_parent(vrt)); + + aaPos[vrt] = aaSmoothBndPosOddVrt[parentEdge]; + } + } + } + + +/***************************************** + * + * (5) COMMUNICATE VERTICALLY + * AFTER SUBDIVISION SURFACES + * + *****************************************/ + +// Communicate aPosition in parallel case + #ifdef UG_PARALLEL + // copy ghosts = VMASTER to v_slaves + com.exchange_data(glm, INT_V_MASTER, INT_V_SLAVE, comPolCopyAPosition); + com.communicate(); + #endif + + +/***************************************** + * + * (6) CLEAN UP + * + *****************************************/ + +// detach vertex attachments + mg.detach_from_vertices(aNumManifoldEdges); + mg.detach_from_edges(aSmoothBndPosOddVrt); +} + + //////////////////////////////////////////////////////////////////////////////// void ApplySmoothManifoldPosToTopLevelAveragingScheme2d(MultiGrid& mg, MGSubsetHandler& markSH, MGSubsetHandler& linearManifoldSH) @@ -2562,7 +3132,7 @@ void ApplySmoothSubdivisionSurfacesToTopLevel3d(MultiGrid& mg, MGSubsetHandler& // Catch use of procedure for MultiGrids with just one level if(mg.num_levels() == 1) { - UG_THROW("Error in ApplySmoothSubdivisionToTopLevel: " + UG_THROW("Error in ApplySmoothSubdivisionSurfacesToTopLevel3d: " "Procedure only to be used for MultiGrids with more than one level."); } @@ -2581,10 +3151,12 @@ void ApplySmoothSubdivisionSurfacesToTopLevel3d(MultiGrid& mg, MGSubsetHandler& ApplySmoothManifoldPosToTopLevelLoopScheme3d(mg, markSH, linearManifoldSH); else if(g_boundaryRefinementRule == SUBDIV_SURF_AVERAGING_SCHEME) ApplySmoothManifoldPosToTopLevelAveragingScheme3d(mg, markSH, linearManifoldSH); + else if(g_boundaryRefinementRule == SUBDIV_SURF_BUTTERFLY_SCHEME) + ApplySmoothManifoldPosToTopLevelButterflyScheme3d(mg, markSH, linearManifoldSH); else if(g_boundaryRefinementRule == SUBDIV_VOL){} else if(g_boundaryRefinementRule == LINEAR){} else - UG_THROW("ERROR in ApplySubdivisionSurfacesToTopLevel: Unknown boundary refinement rule. Known rules are 'subdiv_surf_loop_scheme', 'subdiv_surf_averaging_scheme' or 'linear'."); + UG_THROW("ERROR in ApplySmoothSubdivisionSurfacesToTopLevel3d: Unknown boundary refinement rule. Known rules are 'subdiv_surf_loop_scheme', 'subdiv_surf_averaging_scheme', 'subdiv_surf_butterfly_scheme' or 'linear'."); } @@ -2626,10 +3198,12 @@ void ApplySmoothSubdivisionVolumesToTopLevel(MultiGrid& mg, MGSubsetHandler& sh, ApplySmoothManifoldPosToTopLevelLoopScheme3d(mg, markSH, linearManifoldSH); else if(g_boundaryRefinementRule == SUBDIV_SURF_AVERAGING_SCHEME) ApplySmoothManifoldPosToTopLevelAveragingScheme3d(mg, markSH, linearManifoldSH); + else if(g_boundaryRefinementRule == SUBDIV_SURF_BUTTERFLY_SCHEME) + ApplySmoothManifoldPosToTopLevelButterflyScheme3d(mg, markSH, linearManifoldSH); else if(g_boundaryRefinementRule == SUBDIV_VOL){} else if(g_boundaryRefinementRule == LINEAR){} else - UG_THROW("ERROR in ApplySubdivisionVolumesToTopLevel: Unknown boundary refinement rule. Known rules are 'subdiv_surf_loop_scheme', 'subdiv_surf_averaging_scheme', 'linear' or 'subdiv_vol'."); + UG_THROW("ERROR in ApplySubdivisionVolumesToTopLevel: Unknown boundary refinement rule. Known rules are 'subdiv_surf_loop_scheme', 'subdiv_surf_averaging_scheme', 'subdiv_surf_butterfly_scheme', 'linear' or 'subdiv_vol'."); /***************************************** diff --git a/ugbase/lib_grid/algorithms/subdivision/subdivision_volumes.h b/ugbase/lib_grid/algorithms/subdivision/subdivision_volumes.h index f9bbaf022..e552b9936 100644 --- a/ugbase/lib_grid/algorithms/subdivision/subdivision_volumes.h +++ b/ugbase/lib_grid/algorithms/subdivision/subdivision_volumes.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2017: G-CSC, Goethe University Frankfurt + * Copyright (c) 2014-2019: G-CSC, Goethe University Frankfurt * Author: Martin Stepniewski * * This file is part of UG4. @@ -66,6 +66,7 @@ enum GlobalBoundaryRefinementRule LINEAR, SUBDIV_SURF_LOOP_SCHEME, SUBDIV_SURF_AVERAGING_SCHEME, + SUBDIV_SURF_BUTTERFLY_SCHEME, SUBDIV_VOL }; @@ -178,6 +179,22 @@ void CalculateSmoothManifoldPosInParentLevelLoopScheme3d(MultiGrid& mg, MGSubset AInt& aNumManifoldEdges); +/// Parent level vertex smoothing function for subdivision surfaces refinement (Butterfly scheme) +/** This function calculates the smoothed positions of all parent level vertices + * determined by the subdivision surfaces refinement. + * + * @param mg reference to MultiGrid + * @param markSH reference to SubsetHandler markSH containing marked (inner) boundary manifold + * @param linearManifoldSH reference to user-specified linearManifoldSubsets SubsetHandler + * @param aSmoothBndPosOddVrt reference to aSmoothBndPosOddVrt + * @param aNumManifoldEdges reference to aNumManifoldEdges +**/ +void CalculateSmoothManifoldPosInParentLevelButterflyScheme3d(MultiGrid& mg, MGSubsetHandler& markSH, + MGSubsetHandler& linearManifoldSH, + APosition& aSmoothBndPosOddVrt, + AInt& aNumManifoldEdges); + + /// Toplevel vertex smoothing function for subdivision surfaces refinement (Averaging scheme) /** This function calculates the smoothed positions of all toplevel vertices * determined by the subdivision surfaces refinement. @@ -291,6 +308,19 @@ void ApplySmoothManifoldPosToTopLevelLoopScheme3d(MultiGrid& mg, MGSubsetHandler MGSubsetHandler& linearManifoldSH); +/// Toplevel vertex repositioning function for subdivision surfaces refinement (Butterfly scheme) +/** This function repositions all toplevel manifold vertices to their smoothed positions + * determined by the subdivision surfaces refinement. + * + * @param mg reference to MultiGrid + * @param markSH reference to SubsetHandler markSH containing marked (inner) boundary manifold + * @param linearManifoldSH reference to user-specified linearManifoldSubsets SubsetHandler + * @param aSmoothBndPosOddVrt reference to aSmoothBndPosOddVrt +**/ +void ApplySmoothManifoldPosToTopLevelButterflyScheme3d(MultiGrid& mg, MGSubsetHandler& markSH, + MGSubsetHandler& linearManifoldSH); + + /// Toplevel vertex repositioning function for subdivision surfaces refinement (Averaging scheme) /** This function repositions all toplevel manifold vertices to their smoothed positions * determined by the subdivision surfaces refinement. diff --git a/ugbase/lib_grid/algorithms/volume_calculation.h b/ugbase/lib_grid/algorithms/volume_calculation.h index 621bea0f6..a05540ae8 100644 --- a/ugbase/lib_grid/algorithms/volume_calculation.h +++ b/ugbase/lib_grid/algorithms/volume_calculation.h @@ -95,6 +95,8 @@ inline number CalculateVolume(TIterator begin, TIterator end, TAAPos aaPos); /** \} */ +template +void CalculateBoundingBox(size_t npoints, const MathVector points[], MathVector &vMinBB, MathVector &vMaxBB); /** \} */ //end of ingroup diff --git a/ugbase/lib_grid/algorithms/volume_calculation_impl.hpp b/ugbase/lib_grid/algorithms/volume_calculation_impl.hpp index 9309d82be..13113fb18 100644 --- a/ugbase/lib_grid/algorithms/volume_calculation_impl.hpp +++ b/ugbase/lib_grid/algorithms/volume_calculation_impl.hpp @@ -144,6 +144,25 @@ number CalculateVolume(TIterator begin, TIterator end, TAAPos aaPos) return totalVolume; } +//! Determine the bounding box for a set of points. +template +void CalculateBoundingBox(size_t npoints, const MathVector points[], MathVector &vMinBB, MathVector &vMaxBB) +{ + // determine bounding box + vMinBB= points[0]; + vMaxBB = points[0]; + + for(size_t ii = 1; ii < npoints; ++ii) + { + for(int i = 0; i < dim; ++i) + { + const MathVector& v = points[ii]; + if(v[i] < vMinBB[i]) vMinBB[i] = v[i]; + else if(v[i] > vMaxBB[i]) vMaxBB[i] = v[i]; + } + } +} + }// end of namespace #endif diff --git a/ugbase/lib_grid/common_attachments.h b/ugbase/lib_grid/common_attachments.h index 915f8b5dc..b300e1a67 100644 --- a/ugbase/lib_grid/common_attachments.h +++ b/ugbase/lib_grid/common_attachments.h @@ -101,6 +101,7 @@ extern ANormal aNormal; * Valid types for TAttachment are: * - APosition (AVector3) the default 3d position type. Returns aPosition. * - APosition2 (AVector2) the default 2d position type. Returns aPosition2. + * - APosition1 (AVector1) the default 1d position type. Returns aPosition1. */ template UG_API diff --git a/ugbase/lib_grid/file_io/file_io.cpp b/ugbase/lib_grid/file_io/file_io.cpp index 9b0d2ff4d..4dfaa1023 100644 --- a/ugbase/lib_grid/file_io/file_io.cpp +++ b/ugbase/lib_grid/file_io/file_io.cpp @@ -579,11 +579,11 @@ static void AssignSubsetsBySurfaceViewState(SubsetHandler& sh, const SurfaceView } for(int i = 0; i < sh.num_subsets(); ++i) sh.subset_info(i).name = "unknown"; - sh.subset_info(SurfaceView::MG_SHADOW_PURE).name = "unassigned"; - sh.subset_info(SurfaceView::MG_SURFACE_PURE).name = "pure-surface"; - sh.subset_info(SurfaceView::MG_SURFACE_RIM).name = "shadowing"; - sh.subset_info(SurfaceView::MG_SHADOW_RIM_COPY).name = "shadow-copy"; - sh.subset_info(SurfaceView::MG_SHADOW_RIM_NONCOPY).name = "shadow-noncopy"; + sh.subset_info(SurfaceView::MG_SHADOW_PURE).name = "shadow-pure"; + sh.subset_info(SurfaceView::MG_SURFACE_PURE).name = "surface-pure"; + sh.subset_info(SurfaceView::MG_SURFACE_RIM).name = "surface-rim"; + sh.subset_info(SurfaceView::MG_SHADOW_RIM_COPY).name = "shadow-rim-copy"; + sh.subset_info(SurfaceView::MG_SHADOW_RIM_NONCOPY).name = "shadow-rim-noncopy"; //EraseEmptySubsets(sh); } @@ -697,7 +697,42 @@ void CopyGridLevel(MultiGrid& srcMG, Grid& destGrid, } template -bool SaveGridLevel(MultiGrid& srcMG, ISubsetHandler& srcSH, int lvl, const char* filename, TAPos aPos) +void CopyGrid(Grid& srcGrid, Grid& destGrid, + ISubsetHandler& srcSH, ISubsetHandler& destSH, + TAPos aPos) +{ + Grid::VertexAttachmentAccessor aaPos(destGrid, aPos); + Grid::VertexAttachmentAccessor aaSrcPos(srcGrid, aPos); + GridObjectCollection goc = srcGrid.get_grid_objects(); + + AVertex aNewVrt; + srcGrid.attach_to_vertices(aNewVrt); + Grid::VertexAttachmentAccessor aaNewVrt(srcGrid, aNewVrt); + + for(int si = destSH.num_subsets(); si < srcSH.num_subsets(); ++si) + { + destSH.subset_info(si) = srcSH.subset_info(si); + } + + for(VertexIterator vrtIter = goc.begin(); vrtIter != goc.end(); ++vrtIter) + { + Vertex* srcVrt = *vrtIter; + Vertex* destVrt = *destGrid.create_by_cloning(srcVrt); + aaNewVrt[srcVrt] = destVrt; + aaPos[destVrt] = aaSrcPos[srcVrt]; + destSH.assign_subset(destVrt, srcSH.get_subset_index(srcVrt)); + } + + CopyGridElements(srcGrid, destGrid, srcSH, destSH, aNewVrt); + CopyGridElements(srcGrid, destGrid, srcSH, destSH, aNewVrt); + CopyGridElements(srcGrid, destGrid, srcSH, destSH, aNewVrt); + + srcGrid.detach_from_vertices(aNewVrt); +} + +template +bool SaveGridLevel(MultiGrid& srcMG, ISubsetHandler& srcSH, + int lvl, const char* filename, TAPos aPos) { Grid destGrid; SubsetHandler destSH(destGrid); @@ -710,6 +745,88 @@ bool SaveGridLevel(MultiGrid& srcMG, ISubsetHandler& srcSH, int lvl, const char* return true; } +template +void MergeGrids +( + Grid& mrgGrid, + Grid& grid, + ISubsetHandler& mrgSH, + ISubsetHandler& sh, + TAPos aPos, + bool joinSubsets +) +{ + // add offset to not join subsets with same index + int subsetBaseInd = joinSubsets ? 0 : mrgSH.num_subsets(); + + // attach data + AVertex aVrt; + grid.attach_to_vertices(aVrt); + + // attachments accessors for position and vertex index + Grid::AttachmentAccessor aaPosMRG(mrgGrid, aPos, true); + Grid::AttachmentAccessor aaPos(grid, aPos, true); + Grid::AttachmentAccessor aaVrt(grid, aVrt); + + // copy vertices + for (VertexIterator iter = grid.begin(); + iter != grid.end(); ++iter) + { + Vertex* nvrt = *mrgGrid.create_by_cloning(*iter); + aaPosMRG[nvrt] = aaPos[*iter]; + aaVrt[*iter] = nvrt; + mrgSH.assign_subset(nvrt, subsetBaseInd + sh.get_subset_index(*iter)); + } + + // copy edges + EdgeDescriptor ed; + for (EdgeIterator iter = grid.begin(); + iter != grid.end(); ++iter) + { + Edge* eSrc = *iter; + ed.set_vertices(aaVrt[eSrc->vertex(0)], aaVrt[eSrc->vertex(1)]); + Edge* e = *mrgGrid.create_by_cloning(eSrc, ed); + mrgSH.assign_subset(e, subsetBaseInd + sh.get_subset_index(eSrc)); + } + + // copy faces + FaceDescriptor fd; + for (FaceIterator iter = grid.begin(); + iter != grid.end(); ++iter) + { + Face* fSrc = *iter; + fd.set_num_vertices((uint)fSrc->num_vertices()); + for (size_t i = 0; i < fd.num_vertices(); ++i) { + fd.set_vertex((uint)i, aaVrt[fSrc->vertex(i)]); + } + Face* f = *mrgGrid.create_by_cloning(fSrc, fd); + mrgSH.assign_subset(f, subsetBaseInd + sh.get_subset_index(fSrc)); + } + + // copy volumes + VolumeDescriptor vd; + for (VolumeIterator iter = grid.begin(); + iter != grid.end(); ++iter) + { + Volume* vSrc = *iter; + vd.set_num_vertices((uint)vSrc->num_vertices()); + for (size_t i = 0; i < vd.num_vertices(); ++i) { + vd.set_vertex((uint)i, aaVrt[vSrc->vertex(i)]); + } + + Volume* v = *mrgGrid.create_by_cloning(vSrc, vd); + mrgSH.assign_subset(v, subsetBaseInd + sh.get_subset_index(vSrc)); + } + + // remove the temporary attachment + mrgGrid.detach_from_vertices(aVrt); + + // overwrite subset names + for (int i_sub = 0; i_sub < sh.num_subsets(); ++i_sub){ + mrgSH.subset_info(subsetBaseInd + i_sub) = sh.subset_info(i_sub); + } +} + bool SaveGridLevelToFile(MultiGrid& srcMG, ISubsetHandler& srcSH, int lvl, const char* filename) { // check whether one of the standard attachments is attached and call @@ -743,4 +860,12 @@ template bool SaveGridToFile(Grid&, const char*, AVector1&); template bool SaveGridToFile(Grid&, const char*, AVector2&); template bool SaveGridToFile(Grid&, const char*, AVector3&); +template void CopyGrid(Grid&, Grid&, ISubsetHandler&, ISubsetHandler&, APosition1); +template void CopyGrid(Grid&, Grid&, ISubsetHandler&, ISubsetHandler&, APosition2); +template void CopyGrid(Grid&, Grid&, ISubsetHandler&, ISubsetHandler&, APosition3); + +template void MergeGrids(Grid&, Grid&, ISubsetHandler&, ISubsetHandler&, APosition1, bool); +template void MergeGrids(Grid&, Grid&, ISubsetHandler&, ISubsetHandler&, APosition2, bool); +template void MergeGrids(Grid&, Grid&, ISubsetHandler&, ISubsetHandler&, APosition3, bool); + }// end of namespace diff --git a/ugbase/lib_grid/file_io/file_io.h b/ugbase/lib_grid/file_io/file_io.h index 9e0e19fac..331c8c98b 100644 --- a/ugbase/lib_grid/file_io/file_io.h +++ b/ugbase/lib_grid/file_io/file_io.h @@ -36,7 +36,8 @@ #include "common/types.h" #include "common/ug_config.h" #include "common/error.h" - +#include +#include namespace ug { @@ -164,6 +165,49 @@ void CopyGridLevel(MultiGrid& srcMG, Grid& destGrid, int lvl, TAPos aPos); +//////////////////////////////////////////////////////////////////////////////// +/// Copies a grid to a separate grid. +/** + * Extracts the grid from a given Grid with a given SubsetHandler + * and copies it to a new grid. Position data is read from aPos. + * Note: To copy a grid w/o subset information can use Grid's copy constructor + * \param[in] srcGrid the grid to be copied + * \param[out] destGrid the copied grid + * \param[in] srcSh the SubsetHandler for the srcGrid + * \param[out] destSh the SubsetHandler for the destGrid + * \tparam[in] aPos position attachment + */ +template +void CopyGrid +( + Grid& srcGrid, + Grid& destGrid, + ISubsetHandler& srcSH, + ISubsetHandler& destSH, + TAPos aPos +); + +/// Merges to grids into one grid. +/** + * Merges all grid elements and subset information from grid to mrgGrid + * \param[in,out] mrgGrid merged grid + * \param[in] grid input to be merged into merged grid + * \param[in] mrgSH the SubsetHandler for mrgGrid + * \param[in,out] sh the SubsetHandler for grid + * \tparam[in] aPos position attachment + * \param[in] joinSubsets if true then subsets will be joined otherwise not + */ +template +void MergeGrids +( + Grid& mrgGrid, + Grid& grid, + ISubsetHandler& mrgSh, + ISubsetHandler& sh, + TAPos aPos, + bool joinSubsets +); + /// Saves a grid level to a file. /** * Extracts a specified level from a given MultiGrid with a given SubsetHandler @@ -182,7 +226,15 @@ bool SaveGridLevel(MultiGrid& srcMG, ISubsetHandler& srcSH, int lvl, bool SaveGridLevelToFile(MultiGrid& srcMG, ISubsetHandler& srcSH, int lvl, const char* filename); +/// Copy grid elements of type TElem from srcGrid to destGrid +template +void CopyGridElements(Grid& srcGrid, Grid& destGrid, + ISubsetHandler& srcSH, ISubsetHandler& destSH, + Attachment& aNewVrt); +/// end namespace ug +} -}; +/// include implementation +#include "file_io_impl.h" #endif diff --git a/ugbase/lib_grid/file_io/file_io_impl.h b/ugbase/lib_grid/file_io/file_io_impl.h new file mode 100644 index 000000000..f272ada99 --- /dev/null +++ b/ugbase/lib_grid/file_io/file_io_impl.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2009-2019: G-CSC, Goethe University Frankfurt + * Author: Stephan Grein + * Creation date: 2019-07-05 + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__LIB_GRID__FILE_IO_IMPL__ +#define __H__LIB_GRID__FILE_IO_IMPL__ + +#include "file_io.h" +#include "lib_grid/algorithms/attachment_util.h" +#include "lib_grid/algorithms/subset_util.h" + +namespace ug { + template + void CopyGridElements(Grid& srcGrid, Grid& destGrid, + ISubsetHandler& srcSH, ISubsetHandler& destSH, + Attachment& aNewVrt) + { + Grid::VertexAttachmentAccessor > aaNewVrt(srcGrid, aNewVrt); + GridObjectCollection goc = srcGrid.get_grid_objects(); + CustomVertexGroup vrts; + + typedef typename Grid::traits::iterator iter_t; + + for (iter_t eIter = goc.begin(); eIter != goc.end(); ++eIter) + { + TElem* e = *eIter; + vrts.resize(e->num_vertices()); + + for (size_t iv = 0; iv < e->num_vertices(); ++iv) + { + vrts.set_vertex(iv, aaNewVrt[e->vertex(iv)]); + } + + TElem* ne = *destGrid.create_by_cloning(e, vrts); + destSH.assign_subset(ne, srcSH.get_subset_index(e)); + } + } +} + +#endif /* __H__LIB_GRID__FILE_IO_IMPL__ */ diff --git a/ugbase/lib_grid/file_io/file_io_swc.cpp b/ugbase/lib_grid/file_io/file_io_swc.cpp index bd7071701..d424a8a26 100644 --- a/ugbase/lib_grid/file_io/file_io_swc.cpp +++ b/ugbase/lib_grid/file_io/file_io_swc.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2015: G-CSC, Goethe University Frankfurt - * Author: Sebastian Reiter + * Author: Markus Breit * * This file is part of UG4. * @@ -111,11 +111,14 @@ bool FileReaderSWC::load_file(const char* fileName) int type = boost::lexical_cast(strs[1]); switch (type) { + case 0: pt.type = swc_types::SWC_UNDF; break; case 1: pt.type = swc_types::SWC_SOMA; break; case 2: pt.type = swc_types::SWC_AXON; break; case 3: pt.type = swc_types::SWC_DEND; break; case 4: pt.type = swc_types::SWC_APIC; break; - default: pt.type = swc_types::SWC_UNDF; + case 5: pt.type = swc_types::SWC_FORK; break; + case 6: pt.type = swc_types::SWC_END; break; + default: pt.type = swc_types::SWC_CUSTOM; } // coordinates @@ -205,6 +208,9 @@ bool FileReaderSWC::create_grid(Grid& g, ISubsetHandler* pSH, number scale_lengt pSH->set_subset_name("axon", 1); pSH->set_subset_name("dend", 2); pSH->set_subset_name("apic", 3); + pSH->set_subset_name("fork", 4); + pSH->set_subset_name("end", 5); + pSH->set_subset_name("custom", 6); EraseEmptySubsets(*pSH); return true; @@ -212,6 +218,20 @@ bool FileReaderSWC::create_grid(Grid& g, ISubsetHandler* pSH, number scale_lengt +const std::vector& FileReaderSWC::swc_points() const +{ + return m_vPts; +} + + + +std::vector& FileReaderSWC::swc_points() +{ + return m_vPts; +} + + + bool LoadGridFromSWC(Grid& g, ISubsetHandler* pSH, const char* fileName, AVector3& aPos) { // now read the file @@ -269,6 +289,12 @@ bool ExportGridToSWC(Grid& g, ISubsetHandler* pSH, const char* fileName, AVector vType[i] = 4; else if (name.find("DEND") != std::string::npos) vType[i] = 3; + else if (name.find("END") != std::string::npos) + vType[i] = 6; + else if (name.find("FORK") != std::string::npos) + vType[i] = 5; + else if (name.find("CUSTOM") != std::string::npos) + vType[i] = 7; else vType[i] = 0; } diff --git a/ugbase/lib_grid/file_io/file_io_swc.h b/ugbase/lib_grid/file_io/file_io_swc.h index a92d46d09..90bfa7218 100644 --- a/ugbase/lib_grid/file_io/file_io_swc.h +++ b/ugbase/lib_grid/file_io/file_io_swc.h @@ -43,11 +43,14 @@ namespace swc_types { enum swc_type { - SWC_UNDF = 0, - SWC_SOMA = 1, - SWC_AXON = 2, - SWC_DEND = 3, - SWC_APIC = 4 + SWC_UNDF = 0, + SWC_SOMA = 1, + SWC_AXON = 2, + SWC_DEND = 3, + SWC_APIC = 4, + SWC_FORK = 5, + SWC_END = 6, + SWC_CUSTOM = 7 }; struct SWCPoint @@ -72,6 +75,8 @@ class FileReaderSWC bool load_file(const char* fileName); bool create_grid(Grid& g, ISubsetHandler* pSH, number scale_length = 1.0); + const std::vector& swc_points() const; + std::vector& swc_points(); protected: std::vector m_vPts; diff --git a/ugbase/lib_grid/file_io/file_io_ugx.cpp b/ugbase/lib_grid/file_io/file_io_ugx.cpp index 1bbe2a93d..80bdcc988 100644 --- a/ugbase/lib_grid/file_io/file_io_ugx.cpp +++ b/ugbase/lib_grid/file_io/file_io_ugx.cpp @@ -415,7 +415,7 @@ init_grid_attachments(Grid& grid) AssignIndices(grid.begin(), grid.end(), aaIndFACE, baseInd); baseInd += grid.num(); AssignIndices(grid.begin(), grid.end(), aaIndFACE, baseInd); - baseInd += grid.num(); + //baseInd += grid.num(); // never used AssignIndices(grid.begin(), grid.end(), aaIndVOL, 0); } diff --git a/ugbase/lib_grid/file_io/file_io_ugx_impl.hpp b/ugbase/lib_grid/file_io/file_io_ugx_impl.hpp index bc3f7cf98..6cd96985f 100644 --- a/ugbase/lib_grid/file_io/file_io_ugx_impl.hpp +++ b/ugbase/lib_grid/file_io/file_io_ugx_impl.hpp @@ -273,6 +273,7 @@ create_constrained_vertex_node(ConstrainedVertexIterator vrtsBegin, // write the vertices to a temporary stream stringstream ss; + ss.precision(18); for(ConstrainedVertexIterator iter = vrtsBegin; iter != vrtsEnd; ++iter) { for(int i = 0; i < numCoords; ++i) diff --git a/ugbase/lib_grid/global_attachments.h b/ugbase/lib_grid/global_attachments.h index 8c801ae21..81819233a 100644 --- a/ugbase/lib_grid/global_attachments.h +++ b/ugbase/lib_grid/global_attachments.h @@ -36,6 +36,7 @@ #include "attachments/attachment_info_traits.h" #include "attachments/attachment_io_traits.h" #include "algorithms/serialization.h" +#include namespace ug{ @@ -67,6 +68,20 @@ class GlobalAttachments { functions().push_back(FunctionEntry()); } + template + static void undeclare_attachment(const std::string& name) { + UG_COND_THROW(!is_declared(name), "Trying undeclaring a non-declared attachment."); + AttachmentEntry& ae = attachment_entry(name); + remove_function_entry(ae); + remove_function_entry(ae); + remove_function_entry(ae); + remove_function_entry(ae); + attachment_names().erase(std::remove(attachment_names().begin(), attachment_names().end(), name), attachment_names().end()); + attachments().erase(name); + const char* typeName = attachment_info_traits::type_name(); + attachment_types().erase(typeName); + } + static void declare_attachment (const std::string& name, const std::string& typeName, bool passOnBehaviour = false) @@ -211,7 +226,6 @@ class GlobalAttachments { } }; - struct IAttachmentType { IAttachmentType() : declareFunc(0) {} void (*declareFunc) (const std::string&, bool); @@ -298,6 +312,12 @@ class GlobalAttachments { return functions().at(ae.functionIndex); } + template + static + void remove_function_entry(const AttachmentEntry& ae) { + functions().erase(functions().begin() + ae.functionIndex); + } + template static void read_attachment_from_stream ( diff --git a/ugbase/lib_grid/grid/grid.h b/ugbase/lib_grid/grid/grid.h index 2a6cc34ca..8df280146 100644 --- a/ugbase/lib_grid/grid/grid.h +++ b/ugbase/lib_grid/grid/grid.h @@ -267,14 +267,14 @@ class UG_API Grid Grid(uint options); /// copies all elements and some attachments from the passed grid to this grid. - /** While all elements and the options are copied completly from the source-grid, + /** While all elements and the options are copied completely from the source-grid, * the attachments are only copied if their pass-on behaviour is set to true.*/ Grid(const Grid& grid); virtual ~Grid(); /// copies all elements and some attachments from the passed grid to this grid. - /** While all elements and the options are copied completly from the source-grid, + /** While all elements and the options are copied completely from the source-grid, * the attachments are only copied if their pass-on behaviour is set to true. * Attachments that were already attached to this grid are removed prior to * copying if their pass-on behaviour was set to true. They will be kept otherwise. diff --git a/ugbase/lib_grid/grid/neighborhood_util.cpp b/ugbase/lib_grid/grid/neighborhood_util.cpp index 093f73f7c..cc83695c7 100644 --- a/ugbase/lib_grid/grid/neighborhood_util.cpp +++ b/ugbase/lib_grid/grid/neighborhood_util.cpp @@ -1,4 +1,4 @@ -/* +/*! * Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt * Author: Markus Breit * @@ -31,6 +31,8 @@ */ #include "neighborhood_util.h" +#include "grid.h" +#include "common/common.h" namespace ug { diff --git a/ugbase/lib_grid/grid/neighborhood_util.h b/ugbase/lib_grid/grid/neighborhood_util.h index 799db4f2a..d8c2d6768 100644 --- a/ugbase/lib_grid/grid/neighborhood_util.h +++ b/ugbase/lib_grid/grid/neighborhood_util.h @@ -1,4 +1,4 @@ -/* +/*! * Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt * Author: Markus Breit * @@ -33,19 +33,41 @@ #ifndef __H__LIB_GRID__NEIGHBORHOOD_UTIL__ #define __H__LIB_GRID__NEIGHBORHOOD_UTIL__ -#include "../grid/grid.h" +#include "grid.h" namespace ug { -/** - * @brief Finds the neighbor connected through a side. - * If such a neighbor does not exist - * +/*! + * \brief Finds the neighbor connected through a side. + * \param[in] g + * \param[in] face + * \param[in] elem + * If such a neighbor does not exist, NULL is returned. */ template TBaseElem* GetConnectedNeighbor(Grid& g, typename TBaseElem::side* face, TBaseElem* elem); +/*! + * \brief Finds the neighborhood of a given size for specified element and type + * \param[in] grid + * \param[in] extSize size of neighborhood + * \param[in] elem start element + * \param[out] begin iterator + * \param[out] end iterator + * Returns iterators begin and end for accessing elements of type + */ +template +void GetNeighborhood +( + Grid& grid, + size_t extSize, + TElem* elem, + typename geometry_traits::const_iterator& begin, + typename geometry_traits::const_iterator& end +); } // namespace ug +#include "neighborhood_util_impl.hpp" + #endif // __H__LIB_GRID__NEIGHBORHOOD_UTIL__ diff --git a/ugbase/lib_grid/grid/neighborhood_util_impl.hpp b/ugbase/lib_grid/grid/neighborhood_util_impl.hpp new file mode 100644 index 000000000..46ec73e59 --- /dev/null +++ b/ugbase/lib_grid/grid/neighborhood_util_impl.hpp @@ -0,0 +1,77 @@ +/*! + * Copyright (c) 2010-2019: G-CSC, Goethe University Frankfurt + * Author: Stephan Grein + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#include "neighborhood_util.h" +#include "grid.h" +#include "lib_grid/selector.h" +#include "lib_grid/algorithms/selection_util.h" + +namespace ug { + //////////////////////////////////////////////////////////////////////// + template + void GetNeighborhood + ( + Grid& grid, + size_t extSize, + TElem* elem, + typename geometry_traits::const_iterator& begin, + typename geometry_traits::const_iterator& end + ) { + Selector sel(grid); + typedef typename geometry_traits::const_iterator Iter; + sel.template select(elem); + grid.begin_marking(); + for (size_t extIters = 0; extIters < extSize; ++extIters) + { + SelectAssociatedGridObjects(sel, 1); + for(size_t lvl = 0; lvl < sel.num_levels(); ++lvl){ + for(Iter iter = sel.template begin(lvl); + iter != sel.template end(lvl); ++iter) + { + TElem* el = *iter; + if(!grid.is_marked(el)){ + grid.mark(el); + typename Grid::traits::secure_container elemsOut; + grid.template associated_elements(elemsOut, el); + size_t size = elemsOut.size(); + for (size_t i = 0; i < size; i++) { + sel.template select(elemsOut[i], 1); + } + } + } + } + } + grid.end_marking(); + begin = sel.template begin(); + end = sel.template end(); + } +} // namespace ug diff --git a/ugbase/lib_grid/grid_objects/grid_dim_traits.h b/ugbase/lib_grid/grid_objects/grid_dim_traits.h index 057a87381..0cae3bf1f 100644 --- a/ugbase/lib_grid/grid_objects/grid_dim_traits.h +++ b/ugbase/lib_grid/grid_objects/grid_dim_traits.h @@ -89,7 +89,7 @@ template <> struct grid_dim_traits<2> { typedef boost::mpl::list DimElemList; typedef boost::mpl::list AllElemList; - typedef boost::mpl::list ManifoldElemList; + typedef boost::mpl::list ManifoldElemList; typedef geometry_traits::const_iterator const_iterator; typedef geometry_traits::iterator iterator; diff --git a/ugbase/lib_grid/grid_objects/grid_objects_2d.cpp b/ugbase/lib_grid/grid_objects/grid_objects_2d.cpp index 2138c54a8..5bc9d1a5f 100644 --- a/ugbase/lib_grid/grid_objects/grid_objects_2d.cpp +++ b/ugbase/lib_grid/grid_objects/grid_objects_2d.cpp @@ -164,6 +164,11 @@ refine(std::vector& vNewFacesOut, { switch(numNewVrts) { + case 0: // this may happen when the triangle belongs to a prism being anisotropically refined + // and the volume on the other side is not being refined + vNewFacesOut.push_back(new RefTriType(vrts[0], vrts[1], vrts[2])); + return true; + case 1: { // get the index of the edge that will be refined @@ -477,11 +482,21 @@ refine(std::vector& vNewFacesOut, switch(numNewVrts) { case 0: - // create four new triangles - vNewFacesOut.push_back(new RefTriType(vrts[0], vrts[1], newFaceVertex)); - vNewFacesOut.push_back(new RefTriType(vrts[1], vrts[2], newFaceVertex)); - vNewFacesOut.push_back(new RefTriType(vrts[2], vrts[3], newFaceVertex)); - vNewFacesOut.push_back(new RefTriType(vrts[3], vrts[0], newFaceVertex)); + // refine with mid point if it exists + if (newFaceVertex) + { + // create four new triangles + vNewFacesOut.push_back(new RefTriType(vrts[0], vrts[1], newFaceVertex)); + vNewFacesOut.push_back(new RefTriType(vrts[1], vrts[2], newFaceVertex)); + vNewFacesOut.push_back(new RefTriType(vrts[2], vrts[3], newFaceVertex)); + vNewFacesOut.push_back(new RefTriType(vrts[3], vrts[0], newFaceVertex)); + return true; + } + + // in case the mid point does not exists, we need a simple copy + // This may happen when the quad belongs to a hexahedron being anisotropically refined + // and the volume on the other side is not being refined. + vNewFacesOut.push_back(new RefQuadType(vrts[0], vrts[1], vrts[2], vrts[3])); return true; case 1: diff --git a/ugbase/lib_grid/grid_objects/grid_objects_3d.h b/ugbase/lib_grid/grid_objects/grid_objects_3d.h index 4d5bac468..02a609203 100644 --- a/ugbase/lib_grid/grid_objects/grid_objects_3d.h +++ b/ugbase/lib_grid/grid_objects/grid_objects_3d.h @@ -193,7 +193,7 @@ typedef geometry_traits::const_iterator ConstTetrahedronIterator; //////////////////////////////////////////////////////////////////////// // HexahedronDescriptor -/// only used to initialize a hexahedron. for all other tasks you should use VolumeDescripor. +/// only used to initialize a hexahedron. for all other tasks you should use VolumeDescriptor. /** * please be sure to pass the vertices in the correct order: * v1, v2, v3, v4: bottom-vertices in counterclockwise order (if viewed from the top). diff --git a/ugbase/lib_grid/parallelization/load_balancer.cpp b/ugbase/lib_grid/parallelization/load_balancer.cpp index a85da8aa5..b3b2a4d26 100644 --- a/ugbase/lib_grid/parallelization/load_balancer.cpp +++ b/ugbase/lib_grid/parallelization/load_balancer.cpp @@ -374,16 +374,16 @@ estimate_distribution_quality_impl(std::vector* pLvlQualitiesOut) MultiGrid& mg = *m_mg; DistributedGridManager& distGridMgr = *mg.distributed_grid_manager(); - number minQuality = 1; + number optLevelLoadSum = 0.0; + number maxLevelLoadSum = 0.0; + number levelLoadSum = 0.0; if(pLvlQualitiesOut) pLvlQualitiesOut->clear(); // calculate the quality estimate. -//todo The quality of a level could be weighted by the total amount of elements -// in each level. + bool participatesInAllLevels = true; const ProcessHierarchy* procH = m_processHierarchy.get(); - for(size_t lvl = 0; lvl < mg.num_levels(); ++lvl){ size_t hlvl = procH->hierarchy_level_from_grid_level(lvl); int numProcs = procH->num_global_procs_involved(hlvl); @@ -394,40 +394,59 @@ estimate_distribution_quality_impl(std::vector* pLvlQualitiesOut) } pcl::ProcessCommunicator procComAll = procH->global_proc_com(hlvl); + + number localWeight = 0; + IBalanceWeights& wgts = *m_balanceWeights; + for(ElemIter iter = mg.begin(lvl); + iter != mg.end(lvl); ++iter) + { + if(!distGridMgr.is_ghost(*iter)) + localWeight += wgts.get_weight(*iter); + } + if(procComAll.size() == 0){ - pLvlQualitiesOut->push_back(-1); + participatesInAllLevels = false; + if(pLvlQualitiesOut) + pLvlQualitiesOut->push_back(-1); } else if(procComAll.size() == 1){ - pLvlQualitiesOut->push_back(1); + if(pLvlQualitiesOut) + pLvlQualitiesOut->push_back(1); + optLevelLoadSum += localWeight; + maxLevelLoadSum += localWeight; + levelLoadSum += localWeight; } else{ - number localWeight = 0; - IBalanceWeights& wgts = *m_balanceWeights; - for(ElemIter iter = mg.begin(lvl); - iter != mg.end(lvl); ++iter) - { - if(!distGridMgr.is_ghost(*iter)) - localWeight += wgts.get_weight(*iter); - } - number maxW = procComAll.allreduce(localWeight, PCL_RO_MAX); //number minW = procComAll.allreduce(localWeight, PCL_RO_MIN); number totalW = procComAll.allreduce(localWeight, PCL_RO_SUM); size_t numProcs = procComAll.size(); - if(maxW > 0){ - number quality = (totalW - maxW) / (maxW * number(numProcs - 1)); - minQuality = min(minQuality, quality); - if(pLvlQualitiesOut) + optLevelLoadSum += totalW / numProcs; + maxLevelLoadSum += maxW; + levelLoadSum += totalW; + + if(pLvlQualitiesOut) + { + if(maxW > 0){ + number quality = (totalW - maxW) / (maxW * number(numProcs - 1)); pLvlQualitiesOut->push_back(quality); + } + else + pLvlQualitiesOut->push_back(-1); } - else if(pLvlQualitiesOut) - pLvlQualitiesOut->push_back(-1); } } + number totalQuality = 1.0; + if (levelLoadSum != optLevelLoadSum && maxLevelLoadSum != 0) + totalQuality = ((levelLoadSum - maxLevelLoadSum) * optLevelLoadSum) + / ((levelLoadSum - optLevelLoadSum) * maxLevelLoadSum); + if (!participatesInAllLevels) + totalQuality = 1.0; + pcl::ProcessCommunicator comGlobal; - return comGlobal.allreduce(minQuality, PCL_RO_MIN); + return comGlobal.allreduce(totalQuality, PCL_RO_MIN); } number LoadBalancer:: @@ -543,4 +562,22 @@ print_quality_records() const UG_LOG(m_qualityRecords << "\n"); } +void LoadBalancer::print_last_quality_record() const +{ + const size_t lastRow = m_qualityRecords.num_rows() - 1; + + if (lastRow < 1) + return; + + const size_t nCols = m_qualityRecords.num_cols(); + StringTable tmp(2, nCols); + for (size_t j = 0; j < nCols; ++j) + { + tmp(0, j) = m_qualityRecords(0, j).str(); + tmp(1, j) = m_qualityRecords(lastRow, j).str(); + } + + UG_LOG(tmp << "\n"); +} + } // end of namespace diff --git a/ugbase/lib_grid/parallelization/load_balancer.h b/ugbase/lib_grid/parallelization/load_balancer.h index 01b3d5141..dd50ac57d 100644 --- a/ugbase/lib_grid/parallelization/load_balancer.h +++ b/ugbase/lib_grid/parallelization/load_balancer.h @@ -149,6 +149,7 @@ class LoadBalancer{ void create_quality_record(const char* label); void print_quality_records() const; + void print_last_quality_record() const; private: template diff --git a/ugbase/lib_grid/parallelization/parallelization_util.cpp b/ugbase/lib_grid/parallelization/parallelization_util.cpp index 232deb8c1..248f9597f 100644 --- a/ugbase/lib_grid/parallelization/parallelization_util.cpp +++ b/ugbase/lib_grid/parallelization/parallelization_util.cpp @@ -77,7 +77,7 @@ class ToElementPosition template -bool TestGridLayoutMap(MultiGrid& mg, GridLayoutMap& glm, TAPos& aPos) +bool TestGridLayoutMap(MultiGrid& mg, GridLayoutMap& glm, TAPos& aPos, bool verbose = true) { typedef typename TAPos::ValueType TValue; typedef VertexLayout::LevelLayout VrtLevelLayout; @@ -85,7 +85,6 @@ bool TestGridLayoutMap(MultiGrid& mg, GridLayoutMap& glm, TAPos& aPos) typedef FaceLayout::LevelLayout FaceLevelLayout; bool bSuccess = true; - const bool verbose = true; // check the interfaces pcl::InterfaceCommunicator comVrt; @@ -210,14 +209,14 @@ bool TestGridLayoutMap(MultiGrid& mg, GridLayoutMap& glm, TAPos& aPos) return pcl::AllProcsTrue(bSuccess); } -bool TestGridLayoutMap(MultiGrid& mg, GridLayoutMap& glm) +bool TestGridLayoutMap(MultiGrid& mg, GridLayoutMap& glm, bool verbose) { if(mg.has_vertex_attachment(aPosition)) - return TestGridLayoutMap(mg, glm, aPosition); + return TestGridLayoutMap(mg, glm, aPosition, verbose); else if(mg.has_vertex_attachment(aPosition2)) - return TestGridLayoutMap(mg, glm, aPosition2); + return TestGridLayoutMap(mg, glm, aPosition2, verbose); else if(mg.has_vertex_attachment(aPosition1)) - return TestGridLayoutMap(mg, glm, aPosition1); + return TestGridLayoutMap(mg, glm, aPosition1, verbose); else UG_LOG("ERROR in TestGridLayoutMap: A standard position attachment" " is required.\n"); diff --git a/ugbase/lib_grid/parallelization/parallelization_util.h b/ugbase/lib_grid/parallelization/parallelization_util.h index d9ff06a8f..c7959a30c 100644 --- a/ugbase/lib_grid/parallelization/parallelization_util.h +++ b/ugbase/lib_grid/parallelization/parallelization_util.h @@ -73,7 +73,7 @@ void CreateAndDistributeGlobalIDs(Grid& g, GridLayoutMap& glm, //////////////////////////////////////////////////////////////////////// /// Checks whether the grid-layout-map on this proc is consistent with connected ones. -bool TestGridLayoutMap(MultiGrid& mg, GridLayoutMap& glm); +bool TestGridLayoutMap(MultiGrid& mg, GridLayoutMap& glm, bool verbose = true); /// @} }// end of namespace diff --git a/ugbase/lib_grid/parallelization/util/compol_copy_attachment.h b/ugbase/lib_grid/parallelization/util/compol_copy_attachment.h index c7d661ed7..0b7245606 100644 --- a/ugbase/lib_grid/parallelization/util/compol_copy_attachment.h +++ b/ugbase/lib_grid/parallelization/util/compol_copy_attachment.h @@ -30,7 +30,9 @@ * GNU Lesser General Public License for more details. */ +#include "lib_grid/grid/grid.h" // for Grid::AttachmentAccessor #include "pcl/pcl_base.h" +#include "pcl/pcl_communication_structs.h" // for ICommunicationPolicy #include "common/serialization.h" #ifndef __H__PLG__COMPOL_COPY_ATTACHMENT__ diff --git a/ugbase/lib_grid/parallelization/util/compol_subset.h b/ugbase/lib_grid/parallelization/util/compol_subset.h index 64cdd1c82..ad87a63d4 100644 --- a/ugbase/lib_grid/parallelization/util/compol_subset.h +++ b/ugbase/lib_grid/parallelization/util/compol_subset.h @@ -81,7 +81,7 @@ class ComPol_Subset : public pcl::ICommunicationPolicy virtual bool extract(ug::BinaryBuffer& buff, const Interface& interface) { - int nsi; + int nsi = -1; bool retVal = true; for(InterfaceIter iter = interface.begin(); iter != interface.end(); ++iter) diff --git a/ugbase/lib_grid/refinement/global_fractured_media_refiner.cpp b/ugbase/lib_grid/refinement/global_fractured_media_refiner.cpp index 07b405ae5..86ff440c9 100644 --- a/ugbase/lib_grid/refinement/global_fractured_media_refiner.cpp +++ b/ugbase/lib_grid/refinement/global_fractured_media_refiner.cpp @@ -799,18 +799,18 @@ assign_elem_and_side_marks() // unmarked sides as fixed sides for(size_t i_side = 0; i_side < sides.size(); ++i_side){ Side* s = sides[i_side]; - if(!m_marker.is_marked(s)) + if(!m_marker.is_marked(s)){ // in 3d we'll also have to mark sides of sides, to guarantee, // that fixed marks are communicated correctly. fixedMarker.mark(s); + } - if(Side::dim == 2){ - CollectAssociated(sidesOfSides, mg, s); - for(size_t i = 0; i < sidesOfSides.size(); ++i) - fixedMarker.mark(sidesOfSides[i]); - } + if(Side::dim == 2){ + CollectAssociated(sidesOfSides, mg, s); + for(size_t i = 0; i < sidesOfSides.size(); ++i) + fixedMarker.mark(sidesOfSides[i]); + } } - } else{ // this should only happen if we're on a cap-element. Store the element for later use. diff --git a/ugbase/lib_grid/refinement/hanging_node_refiner_base.cpp b/ugbase/lib_grid/refinement/hanging_node_refiner_base.cpp index 3d329a1b0..1f49fd0db 100644 --- a/ugbase/lib_grid/refinement/hanging_node_refiner_base.cpp +++ b/ugbase/lib_grid/refinement/hanging_node_refiner_base.cpp @@ -768,8 +768,7 @@ void HangingNodeRefinerBase::perform_refinement() // a normal edge may have previously been created by replacing a // constrained or constraining edge. Those edges won't be considered here - // FIXME: This is not correct at least for constrained edges! Remove marked_to_normal()! - if((!refinement_is_allowed(e)) || marked_to_normal(e)){ + if(!refinement_is_allowed(e)){ continue; } @@ -1317,6 +1316,13 @@ assign_hnode_marks() } } } + + // FIXME: Also take care of (unmarkable) SHADOW_COPY edges + // whose children are marked for refinement: + // These children need to be marked HNRM_TO_CONSTRAINING! + // How can these be identified!? + // This is now only implemented in HaningNodeRefiner_MultiGrid::assign_hnode_marks + } } @@ -2031,7 +2037,7 @@ refine_volume_with_normal_vertex(Volume* v, Vertex** newCornerVrts) if(vNewEdgeVertices[i]) noEdgeVrts = false; UG_COND_THROW(!(marked_adaptive(v) || vNewEdgeVertices[i]), - "In order to fully refine a volume, all edges have" + "In order to fully refine a volume, all edges have " "to contain a new vertex!"); } } diff --git a/ugbase/lib_grid/refinement/hanging_node_refiner_multi_grid.cpp b/ugbase/lib_grid/refinement/hanging_node_refiner_multi_grid.cpp index d27ad7ed6..cac8ff21b 100644 --- a/ugbase/lib_grid/refinement/hanging_node_refiner_multi_grid.cpp +++ b/ugbase/lib_grid/refinement/hanging_node_refiner_multi_grid.cpp @@ -170,6 +170,56 @@ refinement_is_allowed(Volume* elem) return !m_pMG->has_children(elem); } +void HangingNodeRefiner_MultiGrid::assign_hnode_marks() +{ + // first call the base implementation + BaseClass::assign_hnode_marks(); + + // now use multigrid info to do another important set of hnode assignments + if (!m_pMG) + throw(UGError("HangingNodeRefiner_MultiGrid::refine: No grid assigned.")); + + MultiGrid& mg = *m_pMG; + + // TODO: This had better be done in the base implementation. But how? + // Also take care of (unmarkable) SHADOW_COPY edges + // whose children are marked for refinement: + // These children need to be marked HNRM_TO_CONSTRAINING! + Grid::face_traits::secure_container fl; + EdgeIterator it = mg.begin(); + EdgeIterator itEnd = mg.end(); + for (; it != itEnd; ++it) + { + Edge* e = *it; + + // find out whether this is a SHADOW-COPY edge; + // which is the case iff it has exactly one child + // and there exists an associated face that does not have any + if (mg.num_child_edges(e) != 1) + continue; + + bool faceWithoutChildExists = false; + mg.associated_elements(fl, e); + const size_t flSz = fl.size(); + for (size_t f = 0; f < flSz; ++f) + { + if (refinement_is_allowed(fl[f]) && !mg.num_child_faces(fl[f])) + { + faceWithoutChildExists = true; + break; + } + } + + if (!faceWithoutChildExists) + continue; + + Edge* child = mg.get_child_edge(e, 0); + + if (marked_refine(child)) + add_hmark(child, HNRM_TO_CONSTRAINING); + } +} + void HangingNodeRefiner_MultiGrid:: pre_refine() { @@ -1118,7 +1168,6 @@ debug_save(sel, "coarsen_marks_02_restricted_to_surface_families"); // has anybody marked an element as invalid? If not, exit adjustment. if(!one_proc_true(foundInvalid)){ - running = false; break; } @@ -1726,7 +1775,7 @@ We have to handle elements as follows: char parentType = mg.parent_type(elem); if((parentType == EDGE) || (parentType == FACE)){ hv = *mg.create_and_replace(elem); - elem = hv; + // elem = hv; // never used } else break; diff --git a/ugbase/lib_grid/refinement/hanging_node_refiner_multi_grid.h b/ugbase/lib_grid/refinement/hanging_node_refiner_multi_grid.h index 1659fc610..bac824dc8 100644 --- a/ugbase/lib_grid/refinement/hanging_node_refiner_multi_grid.h +++ b/ugbase/lib_grid/refinement/hanging_node_refiner_multi_grid.h @@ -154,6 +154,8 @@ class HangingNodeRefiner_MultiGrid : public HangingNodeRefinerBase * during construction and destruction.*/ void set_grid(MultiGrid* mg); + virtual void assign_hnode_marks(); + /// creates required vertices in higher levels. virtual void pre_refine(); diff --git a/ugbase/lib_grid/refinement/projectors/elliptic_cylinder_projector.cpp b/ugbase/lib_grid/refinement/projectors/elliptic_cylinder_projector.cpp new file mode 100644 index 000000000..e8bc3334d --- /dev/null +++ b/ugbase/lib_grid/refinement/projectors/elliptic_cylinder_projector.cpp @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2016: G-CSC, Goethe University Frankfurt + * Author: Markus Breit + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#include "elliptic_cylinder_projector.h" + +#include "common/math/misc/math_util.h" +#include "refinement_projector.h" + + +namespace ug { + + +EllipticCylinderProjector::EllipticCylinderProjector() +: m_center(0, 0, 0), + m_cylinder_axis(0, 0, 1), + m_ellipse_axis1(1, 0, 0), + m_ellipse_axis2(0, 1, 0), + m_radius(-1), + m_influenceRadius(-1), + m_ellipseNormal(0, 0, 1), + m_a(1.0), + m_b(1.0) +{} + + +EllipticCylinderProjector::EllipticCylinderProjector +( + const vector3& center, + const vector3& cylAxis, + const vector3& ellipseAxis1, + const vector3& ellipseAxis2 +) +: m_center(center), + m_cylinder_axis(cylAxis), + m_ellipse_axis1(ellipseAxis1), + m_ellipse_axis2(ellipseAxis2), + m_radius(-1), + m_influenceRadius(-1), + m_a(VecLength(ellipseAxis1)), + m_b(VecLength(ellipseAxis2)) +{ + VecCross(m_ellipseNormal, m_ellipse_axis1, m_ellipse_axis2); +} + + +EllipticCylinderProjector::EllipticCylinderProjector +( + const vector3& center, + const vector3& cylAxis, + const vector3& ellipseAxis1, + const vector3& ellipseAxis2, + number radius +) +: m_center(center), + m_cylinder_axis(cylAxis), + m_ellipse_axis1(ellipseAxis1), + m_ellipse_axis2(ellipseAxis2), + m_radius(radius), + m_influenceRadius(-1), + m_a(VecLength(ellipseAxis1)), + m_b(VecLength(ellipseAxis2)) +{ + UG_LOGN("Constructor5"); + VecCross(m_ellipseNormal, m_ellipse_axis1, m_ellipse_axis2); +} + + +EllipticCylinderProjector::EllipticCylinderProjector +( + const vector3& center, + const vector3& cylAxis, + const vector3& ellipseAxis1, + const vector3& ellipseAxis2, + number radius, + number influenceRadius +) +: m_center(center), + m_cylinder_axis(cylAxis), + m_ellipse_axis1(ellipseAxis1), + m_ellipse_axis2(ellipseAxis2), + m_radius(radius), + m_influenceRadius(influenceRadius), + m_a(VecLength(ellipseAxis1)), + m_b(VecLength(ellipseAxis2)) +{ + VecCross(m_ellipseNormal, m_ellipse_axis1, m_ellipse_axis2); +} + + +EllipticCylinderProjector::EllipticCylinderProjector +( + SPIGeometry3d geometry, + const vector3& center, + const vector3& cylAxis, + const vector3& ellipseAxis1, + const vector3& ellipseAxis2, + number radius, + number influenceRadius +) +: RefinementProjector(geometry), + m_center(center), + m_cylinder_axis(cylAxis), + m_ellipse_axis1(ellipseAxis1), + m_ellipse_axis2(ellipseAxis2), + m_radius(radius), + m_influenceRadius(influenceRadius), + m_a(VecLength(ellipseAxis1)), + m_b(VecLength(ellipseAxis2)) +{ + VecCross(m_ellipseNormal, m_ellipse_axis1, m_ellipse_axis2); +} + + +EllipticCylinderProjector::~EllipticCylinderProjector() +{} + + + +void EllipticCylinderProjector::set_center(const vector3& center) +{ + m_center = center; +} + +const vector3& EllipticCylinderProjector::center() const +{ + return m_center; +} + + +void EllipticCylinderProjector::set_cylinder_axis(const vector3& axis) +{ + m_cylinder_axis = axis; +} + +const vector3& EllipticCylinderProjector::cylinder_axis() const +{ + return m_cylinder_axis; +} + + +void EllipticCylinderProjector::set_ellipse_axis1(const vector3& axis) +{ + m_ellipse_axis1 = axis; + VecCross(m_ellipseNormal, m_ellipse_axis1, m_ellipse_axis2); + m_a = VecLength(axis); +} + +const vector3& EllipticCylinderProjector::ellipse_axis1() const +{ + return m_ellipse_axis1; +} + + +void EllipticCylinderProjector::set_ellipse_axis2(const vector3& axis) +{ + m_ellipse_axis2 = axis; + VecCross(m_ellipseNormal, m_ellipse_axis1, m_ellipse_axis2); + m_b = VecLength(axis); +} + +const vector3& EllipticCylinderProjector::ellipse_axis2() const +{ + return m_ellipse_axis2; +} + + +void EllipticCylinderProjector::set_radius(number radius) +{ + m_radius = radius; +} + +number EllipticCylinderProjector::radius() const +{ + return m_radius; +} + + +void EllipticCylinderProjector::set_influence_radius(number influenceRadius) +{ + m_influenceRadius = influenceRadius; +} + +number EllipticCylinderProjector::influence_radius() const +{ + return m_influenceRadius; +} + + + +number EllipticCylinderProjector::new_vertex(Vertex* vrt, Edge* parent) +{ + return perform_projection(vrt, parent); +} + +number EllipticCylinderProjector::new_vertex(Vertex* vrt, Face* parent) +{ + return perform_projection(vrt, parent); +} + +number EllipticCylinderProjector::new_vertex(Vertex* vrt, Volume* parent) +{ + return perform_projection(vrt, parent); +} + + + +number EllipticCylinderProjector::radial_ellipse_coord(const vector3& v) +{ + // project coordinates along cylinder axis to ellipse plane + vector3 proj2Ellipse; + number dummy; + RayPlaneIntersection(proj2Ellipse, dummy, v, m_cylinder_axis, m_center, m_ellipseNormal); + + // get x and y coordinates + const number x = VecDot(m_ellipse_axis1, proj2Ellipse) / m_a; + const number y = VecDot(m_ellipse_axis2, proj2Ellipse) / m_b; + + return sqrt(x*x/(m_a*m_a) + y*y/(m_b*m_b)); +} + + +number EllipticCylinderProjector::scale_point_to_radius(vector3& vIO, number r) +{ + // project coordinates along cylinder axis to ellipse plane + vector3 proj2Ellipse; + number dummy; + RayPlaneIntersection(proj2Ellipse, dummy, vIO, m_cylinder_axis, m_center, m_ellipseNormal); + + VecSubtract(vIO, vIO, proj2Ellipse); + + // current radius + const number x = VecDot(m_ellipse_axis1, proj2Ellipse) / m_a; + const number y = VecDot(m_ellipse_axis2, proj2Ellipse) / m_b; + const number rcur = sqrt(x*x/(m_a*m_a) + y*y/(m_b*m_b)); + + // scale and undo projection + if (rcur > SMALL * r) + VecScaleAdd(vIO, 1.0, vIO, r / rcur, proj2Ellipse); + else + // if current position is in the center of the cylinder, leave it there + VecAdd(vIO, vIO, m_center); + + return rcur; +} + + +template +number EllipticCylinderProjector::perform_projection(Vertex* vrt, TElem* parent) +{ + // General method: + // The "radius" of all parent vertices is averaged + // and used for the radius of the projected child. + // The (Cartesian) coordinates of all parents are averaged. + // The resulting coordinates are scaled around the axis + // within the ellipse plane to reach the previously determined radius. + // TODO: It might be better to also average arc lengths and axial coords of parents + // and project the child to averaged radius, arc length and axial coords. + + // average parent vertex positions and radii + typename TElem::ConstVertexArray vrts = parent->vertices(); + const size_t numVrts = parent->num_vertices(); + + if (numVrts == 0) + { + set_pos(vrt, vector3(0, 0, 0)); + return 1; + } + + number avgR = 0; + vector3 proj(0, 0, 0); + for (size_t i = 0; i < numVrts; ++i) + { + const vector3& p = pos(vrts[i]); + avgR += radial_ellipse_coord(p); + proj += p; + } + avgR /= numVrts; + VecScale(proj, proj, 1.0 / numVrts); + + // move averaged position to new radius + const number curR = scale_point_to_radius(proj, avgR); + set_pos(vrt, proj); + + if (m_influenceRadius > 0) + { + if (m_radius > m_influenceRadius) + { + const number dist = m_radius - m_influenceRadius; + return clip((curR - m_influenceRadius) / dist, 0, 1); + } + else if (m_radius >= 0) + { + const number dist = m_influenceRadius - m_radius; + if (dist > 0) + return clip(1 - (curR - m_radius) / dist, 0, 1); + return curR < m_radius ? 1 : 0; + } + else + return clip(1 - curR / m_influenceRadius, 0, 1); + } + + return 1; +} + + +} // namespace ug diff --git a/ugbase/lib_grid/refinement/projectors/elliptic_cylinder_projector.h b/ugbase/lib_grid/refinement/projectors/elliptic_cylinder_projector.h new file mode 100644 index 000000000..e51f9f753 --- /dev/null +++ b/ugbase/lib_grid/refinement/projectors/elliptic_cylinder_projector.h @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2016: G-CSC, Goethe University Frankfurt + * Author: Markus Breit + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef UG__LIB_GRID__REFINEMENT__PROJECTORS__ELLIPTIC_CYLINDER_PROJECTOR_H +#define UG__LIB_GRID__REFINEMENT__PROJECTORS__ELLIPTIC_CYLINDER_PROJECTOR_H + +#include "common/math/math_vector_matrix/math_vector_functions.h" // VecLength etc. +#include "refinement_projector.h" + + +namespace ug { +/// Projects new vertices onto a cylinder with an elliptic base. +/** For projection during refinement the radius property is ignored. Instead + * the distance to the center of a newly inserted vertex is calculated + * as the average distance of the vertices of the parent element to the center. + * The radius property thus defaults to -1. + * + * You may still specify a radius. This radius can be used for auto-fitting of + * the center and for reprojecting a set of vertices onto the sphere. + */ +class EllipticCylinderProjector +: public RefinementProjector +{ + public: + EllipticCylinderProjector(); + + EllipticCylinderProjector + ( + const vector3& center, + const vector3& cylAxis, + const vector3& ellipseAxis1, + const vector3& ellipseAxis2 + ); + + EllipticCylinderProjector + ( + const vector3& center, + const vector3& cylAxis, + const vector3& ellipseAxis1, + const vector3& ellipseAxis2, + number radius + ); + + EllipticCylinderProjector + ( + const vector3& center, + const vector3& cylAxis, + const vector3& ellipseAxis1, + const vector3& ellipseAxis2, + number radius, + number influenceRadius + ); + + EllipticCylinderProjector + ( + SPIGeometry3d geometry, + const vector3& center, + const vector3& cylAxis, + const vector3& ellipseAxis1, + const vector3& ellipseAxis2, + number radius, + number influenceRadius + ); + + virtual ~EllipticCylinderProjector(); + + void set_center(const vector3& center); + const vector3& center() const; + + void set_cylinder_axis(const vector3& axis); + const vector3& cylinder_axis() const; + + void set_ellipse_axis1(const vector3& axis); + const vector3& ellipse_axis1() const; + + void set_ellipse_axis2(const vector3& axis); + const vector3& ellipse_axis2() const; + + void set_radius(number radius); + number radius() const; + + void set_influence_radius(number influenceRadius); + number influence_radius() const; + + + /// called when a new vertex was created from an old edge + virtual number new_vertex(Vertex* vrt, Edge* parent); + + /// called when a new vertex was created from an old face + virtual number new_vertex(Vertex* vrt, Face* parent); + + /// called when a new vertex was created from an old volume + virtual number new_vertex(Vertex* vrt, Volume* parent); + + + private: + number radial_ellipse_coord(const vector3& v); + number scale_point_to_radius(vector3& vIO, number r); + + template + number perform_projection(Vertex* vrt, TElem* parent); + + friend class boost::serialization::access; + + template + void serialize(Archive& ar, const unsigned int version) + { + ar & make_nvp("center", m_center); + ar & make_nvp("cylAxis", m_cylinder_axis); + ar & make_nvp("ellipseAxis1", m_ellipse_axis1); + ar & make_nvp("ellipseAxis2", m_ellipse_axis2); + ar & make_nvp("radius", m_radius); + ar & make_nvp("influence radius", m_influenceRadius); + UG_EMPTY_BASE_CLASS_SERIALIZATION(EllipticCylinderProjector, RefinementProjector); + + // this is only needed during load, but does not hurt during save either + VecCross(m_ellipseNormal, m_ellipse_axis1, m_ellipse_axis2); + m_a = VecLength(m_ellipse_axis1); + m_b = VecLength(m_ellipse_axis2); + } + + + private: + vector3 m_center; + vector3 m_cylinder_axis; + vector3 m_ellipse_axis1; + vector3 m_ellipse_axis2; + number m_radius; + number m_influenceRadius; + + vector3 m_ellipseNormal; + number m_a; + number m_b; +}; + +} // namespace ug + +#endif // UG__LIB_GRID__REFINEMENT__PROJECTORS__ELLIPTIC_CYLINDER_PROJECTOR_H diff --git a/ugbase/lib_grid/refinement/projectors/neurite_projector.cpp b/ugbase/lib_grid/refinement/projectors/neurite_projector.cpp new file mode 100644 index 000000000..8e414c7c8 --- /dev/null +++ b/ugbase/lib_grid/refinement/projectors/neurite_projector.cpp @@ -0,0 +1,1659 @@ +/* + * Copyright (c) 2016: G-CSC, Goethe University Frankfurt + * Author: Markus Breit + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * Created on: 2016-12-19 + */ + +#include "neurite_projector.h" +#include "common/error.h" +#include "lib_grid/global_attachments.h" +#include "lib_grid/algorithms/debug_util.h" // ElementDebugInfo + +#include +#include +#include // for distance + +namespace ug { + +static number VecProd(const vector3& a, const vector3& b) +{ + return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; +} + +static number VecNormSquared(const vector3& a) +{ + return a[0]*a[0] + a[1]*a[1] + a[2]*a[2]; +} + +static number VecNorm(const vector3& a) +{ + return sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]); +} + + +NeuriteProjector::NeuriteProjector() +//: m_quadOrder(80) +{ + typedef Attachment NPSurfParam; + if (!GlobalAttachments::is_declared("npSurfParams")) + GlobalAttachments::declare_attachment("npSurfParams", true); + + // If branching points extend 5r in each direction and we integrate over twice that size + // we add around quadOrder/2 Gaussians with sigma=r over a total length of 20r. + // So we should use about quadOrder=80 to ensure a smooth surface + // that does not look like a pearl necklace. + prepare_quadrature(); +} + + +NeuriteProjector::NeuriteProjector(SPIGeometry3d geometry) +: RefinementProjector(geometry) + //m_quadOrder(80) +{ + typedef Attachment NPSurfParam; + if (!GlobalAttachments::is_declared("npSurfParams")) + GlobalAttachments::declare_attachment("npSurfParams", true); + + attach_surf_params(); + prepare_quadrature(); +} + + +NeuriteProjector::~NeuriteProjector() +{} + + +void NeuriteProjector::set_geometry(SPIGeometry3d geometry) +{ + // call base class method + RefinementProjector::set_geometry(geometry); + + attach_surf_params(); +} + + +number NeuriteProjector::new_vertex(Vertex* vrt, Vertex* parent) +{ + m_aaSurfParams[vrt].neuriteID = m_aaSurfParams[parent].neuriteID; + m_aaSurfParams[vrt].axial = m_aaSurfParams[parent].axial; + m_aaSurfParams[vrt].angular = m_aaSurfParams[parent].angular; + m_aaSurfParams[vrt].radial = m_aaSurfParams[parent].radial; + + set_pos(vrt, pos(parent)); + + return 1.0; +} + + +number NeuriteProjector::new_vertex(Vertex* vrt, Edge* parent) +{ + return push_into_place(vrt, parent); +} + + +number NeuriteProjector::new_vertex(Vertex* vrt, Face* parent) +{ + return push_into_place(vrt, parent); +} + + +number NeuriteProjector::new_vertex(Vertex* vrt, Volume* parent) +{ + return push_into_place(vrt, parent); +} + + +void NeuriteProjector::project(Vertex* vrt) +{ + push_into_place(vrt, (IVertexGroup*) NULL); +} + + +void NeuriteProjector::direction_at_grid_object(vector3& dirOut, GridObject* o) const +{ + // treat vertex separately as it is no vertex group + if (o->base_object_id() == VERTEX) + { + Vertex* v = dynamic_cast(o); + UG_COND_THROW(!v, "Non-vertex with VERTEX base object id.") + + const SurfaceParams& sp = m_aaSurfParams[v]; + uint32_t nid = sp.neuriteID & ((1 << 20) - 1); + float t = sp.axial; + + const Section& sec = *get_section_iterator(nid, t); + + number te = sec.endParam; + const number* s = &sec.splineParamsX[0]; + number& v0 = dirOut[0]; + v0 = -3.0*s[0]*(te-t) - 2.0*s[1]; + v0 = v0*(te-t) - s[2]; + + s = &sec.splineParamsY[0]; + number& v1 = dirOut[1]; + v1 = -3.0*s[0]*(te-t) - 2.0*s[1]; + v1 = v1*(te-t) - s[2]; + + s = &sec.splineParamsZ[0]; + number& v2 = dirOut[2]; + v2 = -3.0*s[0]*(te-t) - 2.0*s[1]; + v2 = v2*(te-t) - s[2]; + + return; + } + + IVertexGroup* vrtGrp = dynamic_cast(o); + UG_COND_THROW(!vrtGrp, "Non-vertex element which is not a vertex group."); + + uint32_t nid; + float t, dummy1, dummy2; + average_params(nid, t, dummy1, dummy2, vrtGrp); + + const Section& sec = *get_section_iterator(nid, t); + + number te = sec.endParam; + const number* s = &sec.splineParamsX[0]; + number& v0 = dirOut[0]; + v0 = -3.0*s[0]*(te-t) - 2.0*s[1]; + v0 = v0*(te-t) - s[2]; + + s = &sec.splineParamsY[0]; + number& v1 = dirOut[1]; + v1 = -3.0*s[0]*(te-t) - 2.0*s[1]; + v1 = v1*(te-t) - s[2]; + + s = &sec.splineParamsZ[0]; + number& v2 = dirOut[2]; + v2 = -3.0*s[0]*(te-t) - 2.0*s[1]; + v2 = v2*(te-t) - s[2]; +} + + + +void NeuriteProjector::attach_surf_params() +{ + Grid& grid = this->geometry()->grid(); + + UG_COND_THROW(!GlobalAttachments::is_declared("npSurfParams"), + "GlobalAttachment 'npSurfParams' not declared."); + m_aSurfParams = GlobalAttachments::attachment >("npSurfParams"); + + // make sure surfaceParams attachment is attached + UG_COND_THROW(!grid.has_vertex_attachment(m_aSurfParams), + "No surface parameter attachment for neurite projector attached to grid."); + + m_aaSurfParams.access(grid, m_aSurfParams); +} + + +void NeuriteProjector::debug_neurites() const +{ + UG_LOGN("BPs of neurites in projector:") + // print out branching region data + for (size_t n = 0; n < m_vNeurites.size(); ++n) + { + UG_LOGN("Neurite " << n); + const NeuriteProjector::Neurite& neurite = m_vNeurites[n]; + const std::vector vBR = neurite.vBR; + + for (size_t b = 0; b < vBR.size(); ++b) + { + UG_LOGN(" BR " << b << ": " << vBR[b].t); + SmartPtr bp = vBR[b].bp; + + UG_LOGN(" associated BP data:") + size_t bpSz = bp->vNid.size(); + if (bpSz != bp->vRegions.size()) + { + UG_LOGN( "Size mismatch: vNid " << bpSz << ", vRegions " << bp->vRegions.size()); + } + else + { + for (size_t i = 0; i < bpSz; ++i) + { + UG_LOGN(" " << bp->vNid[i] << " (" << bp->vRegions[i]->t << ")"); + } + } + } + } +} + + +std::vector& NeuriteProjector::neurites() +{ + return m_vNeurites; +} + + +const NeuriteProjector::Neurite& NeuriteProjector::neurite(uint32_t nid) const +{ + UG_COND_THROW(nid >= m_vNeurites.size(), + "Requested neurite index " << nid << " that is not present in the neurite."); + return m_vNeurites[nid]; +} + + +Grid::VertexAttachmentAccessor >& +NeuriteProjector::surface_params_accessor() +{ + return m_aaSurfParams; +} + + +const Grid::VertexAttachmentAccessor >& +NeuriteProjector::surface_params_accessor() const +{ + return m_aaSurfParams; +} + + +const std::vector >& NeuriteProjector::quadrature_points() const +{ + return m_qPoints; +}; + + + +std::vector::const_iterator +NeuriteProjector::get_section_iterator(uint32_t nid, float t) const +{ + Section cmpSec(t); + const std::vector
& vSections = m_vNeurites[nid].vSec; + std::vector
::const_iterator itSec = + std::lower_bound(vSections.begin(), vSections.end(), cmpSec, CompareSections()); + + UG_COND_THROW(itSec == vSections.end(), + "Could not find section for parameter t = " << t << " in neurite " << nid << "."); + + return itSec; +} + + +static bool cmpQPairs(const std::pair& a, const std::pair& b) +{return a.first < b.first;} + +void NeuriteProjector::prepare_quadrature() +{ + /* + GaussLegendre gl(m_quadOrder); + size_t nPts = gl.size(); + m_qPoints.resize(nPts); + for (size_t i = 0; i < nPts; ++i) + { + m_qPoints[i].first = gl.point(i)[0]; + m_qPoints[i].second = gl.weight(i); + } + */ + m_qPoints.resize(40); + m_qPoints[0].first = 4.8061379124697458903340327798768835266e-1; + m_qPoints[1].first = 5.1938620875302541096659672201231164734e-1; + m_qPoints[2].first = 4.4195796466237239575827435779598794312e-1; + m_qPoints[3].first = 5.5804203533762760424172564220401205688e-1; + m_qPoints[4].first = 4.0365120964931445014224157396742505259e-1; + m_qPoints[5].first = 5.9634879035068554985775842603257494741e-1; + m_qPoints[6].first = 3.6592390749637315942940782759570190829e-1; + m_qPoints[7].first = 6.3407609250362684057059217240429809171e-1; + m_qPoints[8].first = 3.2900295458712076349625375941040284497e-1; + m_qPoints[9].first = 6.7099704541287923650374624058959715503e-1; + m_qPoints[10].first = 2.9311039781419749923756012709814315851e-1; + m_qPoints[11].first = 7.0688960218580250076243987290185684149e-1; + m_qPoints[12].first = 2.584620991569106435457167128775884977e-1; + m_qPoints[13].first = 7.415379008430893564542832871224115023e-1; + m_qPoints[14].first = 2.2526643745243589896203434723524101488e-1; + m_qPoints[15].first = 7.7473356254756410103796565276475898512e-1; + m_qPoints[16].first = 1.9372305516600988102369377488465256131e-1; + m_qPoints[17].first = 8.0627694483399011897630622511534743869e-1; + m_qPoints[18].first = 1.6402165769291022581032274251925294501e-1; + m_qPoints[19].first = 8.3597834230708977418967725748074705499e-1; + m_qPoints[20].first = 1.3634087240503644835950177412253472572e-1; + m_qPoints[21].first = 8.6365912759496355164049822587746527428e-1; + m_qPoints[22].first = 1.1084717428674030615251422724675257599e-1; + m_qPoints[23].first = 8.8915282571325969384748577275324742401e-1; + m_qPoints[24].first = 8.7693884583344168401839884666950613046e-2; + m_qPoints[25].first = 9.1230611541665583159816011533304938695e-1; + m_qPoints[26].first = 6.7020248393870248089609095822690018215e-2; + m_qPoints[27].first = 9.3297975160612975191039090417730998179e-1; + m_qPoints[28].first = 4.8950596515562851635873334565753448208e-2; + m_qPoints[29].first = 9.5104940348443714836412666543424655179e-1; + m_qPoints[30].first = 3.3593595860661733319573916577397141783e-2; + m_qPoints[31].first = 9.6640640413933826668042608342260285822e-1; + m_qPoints[32].first = 2.1041590393104172097729500273620357453e-2; + m_qPoints[33].first = 9.7895840960689582790227049972637964255e-1; + m_qPoints[34].first = 1.1370025008112868668314858143548096511e-2; + m_qPoints[35].first = 9.8862997499188713133168514185645190349e-1; + m_qPoints[36].first = 4.6368806502714967734728238893139225189e-3; + m_qPoints[37].first = 9.9536311934972850322652717611068607748e-1; + m_qPoints[38].first = 8.8114514472039982518864878970675383211e-4; + m_qPoints[39].first = 9.9911885485527960017481135121029324617e-1; + + m_qPoints[0].second = 3.8752973989212405631861981479163163482e-2; + m_qPoints[1].second = 3.8752973989212405631861981479163163482e-2; + m_qPoints[2].second = 3.8519909082123982794153767141905124262e-2; + m_qPoints[3].second = 3.8519909082123982794153767141905124262e-2; + m_qPoints[4].second = 3.8055180950313121185779037961247411506e-2; + m_qPoints[5].second = 3.8055180950313121185779037961247411506e-2; + m_qPoints[6].second = 3.7361584528984132100094668130662336596e-2; + m_qPoints[7].second = 3.7361584528984132100094668130662336596e-2; + m_qPoints[8].second = 3.6443291197902029530255341721258917929e-2; + m_qPoints[9].second = 3.6443291197902029530255341721258917929e-2; + m_qPoints[10].second = 3.530582369564338984774181542764341618e-2; + m_qPoints[11].second = 3.530582369564338984774181542764341618e-2; + m_qPoints[12].second = 3.3956022907616951912845054115961992992e-2; + m_qPoints[13].second = 3.3956022907616951912845054115961992992e-2; + m_qPoints[14].second = 3.2402006728300519037277264783376365016e-2; + m_qPoints[15].second = 3.2402006728300519037277264783376365016e-2; + m_qPoints[16].second = 3.0653121246464469583268998204199297951e-2; + m_qPoints[17].second = 3.0653121246464469583268998204199297951e-2; + m_qPoints[18].second = 2.87198845496957756833088654552129928e-2; + m_qPoints[19].second = 2.87198845496957756833088654552129928e-2; + m_qPoints[20].second = 2.6613923491968412177498239886130252278e-2; + m_qPoints[21].second = 2.6613923491968412177498239886130252278e-2; + m_qPoints[22].second = 2.4347903817536116030717080224073194034e-2; + m_qPoints[23].second = 2.4347903817536116030717080224073194034e-2; + m_qPoints[24].second = 2.1935454092836635995837343020857747906e-2; + m_qPoints[25].second = 2.1935454092836635995837343020857747906e-2; + m_qPoints[26].second = 1.9391083987236008819986015645223081127e-2; + m_qPoints[27].second = 1.9391083987236008819986015645223081127e-2; + m_qPoints[28].second = 1.6730097641273923696339091543205424489e-2; + m_qPoints[29].second = 1.6730097641273923696339091543205424489e-2; + m_qPoints[30].second = 1.3968503490011700549244578753860538651e-2; + m_qPoints[31].second = 1.3968503490011700549244578753860538651e-2; + m_qPoints[32].second = 1.1122924597083478630752162092104286604e-2; + m_qPoints[33].second = 1.1122924597083478630752162092104286604e-2; + m_qPoints[34].second = 8.2105291909539443564317424411819636462e-3; + m_qPoints[35].second = 8.2105291909539443564317424411819636462e-3; + m_qPoints[36].second = 5.2491422655764068073710855336398261884e-3; + m_qPoints[37].second = 5.2491422655764068073710855336398261884e-3; + m_qPoints[38].second = 2.2606385492665956292358664390926663639e-3; + + std::sort(m_qPoints.begin(), m_qPoints.end(), cmpQPairs); +} + +static void compute_first_section_end_points +( + vector3& pos0Out, + vector3& pos1Out, + std::vector::const_iterator secIt +) +{ + number te = secIt->endParam; + const number* s = &secIt->splineParamsX[0]; + number& p0 = pos0Out[0]; + p0 = s[0]*te + s[1]; + p0 = p0*te + s[2]; + p0 = p0*te + s[3]; + pos1Out[0] = s[3]; + + s = &secIt->splineParamsY[0]; + number& p1 = pos0Out[1]; + p1 = s[0]*te + s[1]; + p1 = p1*te + s[2]; + p1 = p1*te + s[3]; + pos1Out[1] = s[3]; + + s = &secIt->splineParamsZ[0]; + number& p2 = pos0Out[2]; + p2 = s[0]*te + s[1]; + p2 = p2*te + s[2]; + p2 = p2*te + s[3]; + pos1Out[2] = s[3]; +} + + +static void compute_position_and_velocity_in_section +( + vector3& posAxOut, + vector3& velOut, + number& radiusOut, + std::vector::const_iterator secIt, + float t +) +{ + number te = secIt->endParam; + const number* s = &secIt->splineParamsX[0]; + number& p0 = posAxOut[0]; + number& v0 = velOut[0]; + p0 = s[0]*(te-t) + s[1]; v0 = -3.0*s[0]*(te-t) - 2.0*s[1]; + p0 = p0*(te-t) + s[2]; v0 = v0*(te-t) - s[2]; + p0 = p0*(te-t) + s[3]; + + s = &secIt->splineParamsY[0]; + number& p1 = posAxOut[1]; + number& v1 = velOut[1]; + p1 = s[0]*(te-t) + s[1]; v1 = -3.0*s[0]*(te-t) - 2.0*s[1]; + p1 = p1*(te-t) + s[2]; v1 = v1*(te-t) - s[2]; + p1 = p1*(te-t) + s[3]; + + s = &secIt->splineParamsZ[0]; + number& p2 = posAxOut[2]; + number& v2 = velOut[2]; + p2 = s[0]*(te-t) + s[1]; v2 = -3.0*s[0]*(te-t) - 2.0*s[1]; + p2 = p2*(te-t) + s[2]; v2 = v2*(te-t) - s[2]; + p2 = p2*(te-t) + s[3]; + + s = &secIt->splineParamsR[0]; + radiusOut = s[0]*(te-t) + s[1]; + radiusOut = radiusOut*(te-t) + s[2]; + radiusOut = radiusOut*(te-t) + s[3]; +} + + +static inline void compute_ONB +( + vector3& firstOut, + vector3& secondOut, + vector3& thirdOut, + const vector3& firstIn, + const vector3& refDir +) +{ + VecNormalize(firstOut, firstIn); + number fac = VecProd(refDir, firstOut); + VecScaleAdd(secondOut, 1.0, refDir, -fac, firstOut); + VecNormalize(secondOut, secondOut); + + VecCross(thirdOut, firstOut, secondOut); +} + + +// computes the polar angle phi of a vector +// given a rotational axis direction and two additional +// directions, together being a orthoNORMAL basis +static inline number compute_angle +( + const vector3& axis, + const vector3& secondAxis, + const vector3& thirdAxis, + const vector3& posFromAxis +) +{ + // eliminate component in axis direction + vector3 posFromAxisCopy; + VecScaleAdd(posFromAxisCopy, 1.0, posFromAxis, -VecProd(posFromAxis, axis), axis); + + // compute coord vector (components 2 and 3) w.r.t. ONB + vector2 relCoord; + relCoord[0] = VecProd(posFromAxis, secondAxis); + VecScaleAdd(posFromAxisCopy, 1.0, posFromAxisCopy, -relCoord[0], secondAxis); + relCoord[1] = VecProd(posFromAxisCopy, thirdAxis); + VecNormalize(relCoord, relCoord); + + // get angle from coord vector + number angle; + if (fabs(relCoord[0]) < 1e-8) + angle = relCoord[1] < 0 ? 1.5*PI : 0.5*PI; + else + angle = relCoord[0] < 0 ? PI - atan(-relCoord[1]/relCoord[0]) : atan(relCoord[1]/relCoord[0]); + + // angle should be in [0,2*PI) + if (angle < 0) angle += 2.0*PI; + + return angle; +} + + +void NeuriteProjector::average_params +( + uint32_t& neuriteID, + float& t, + float& angle, + float& radius, + const IVertexGroup* parent +) const +{ + // find neurite ID parent belongs to + size_t nVrt = parent->num_vertices(); + //std::vector > > candidates(nVrt); + std::map candidates; + std::map branchInfo; + for (size_t i = 0; i < nVrt; ++i) + { + const SurfaceParams& surfParams = m_aaSurfParams[parent->vertex(i)]; + uint32_t thisNID = surfParams.neuriteID & ((1 << 20) - 1); + ++candidates[thisNID]; + + if (surfParams.neuriteID > (1 << 20)) // vrt also belongs to branch(es) + { + const uint32_t br = (surfParams.neuriteID & (255 << 20)) >> 20; + const std::vector& vNID = m_vNeurites[thisNID].vBR[br].bp->vNid; + const uint32_t children = surfParams.neuriteID >> 28; + for (int j = 0; j < 4; ++j) + { + if (children & (1 << j)) + { + ++candidates[vNID[j+1]]; + branchInfo[vNID[j+1]] = (br << 20) + (1 << (28+j)); + } + } + } + } + + // vertex gets all NIDs that have maximal counts + std::vector maxCands; + size_t maxCnt = 0; + + std::map::const_iterator it = candidates.begin(); + std::map::const_iterator itEnd = candidates.end(); + for (; it != itEnd; ++it) + if (it->second > maxCnt) + maxCnt = it->second; + for (it = candidates.begin(); it != itEnd; ++it) + if (it->second == maxCnt) + maxCands.push_back(it->first); + + const size_t nMaxCands = maxCands.size(); + if (nMaxCands == 1) + neuriteID = maxCands[0]; + else + { + neuriteID = *std::min_element(maxCands.begin(), maxCands.end()); + for (size_t i = 0; i < nMaxCands; ++i) + { + std::map::const_iterator it2 = branchInfo.find(maxCands[i]); + if (it2 != branchInfo.end()) + neuriteID = neuriteID | it2->second; + } + } + + + // special case: + // when refining the initial BP volume the center vertex needs to belong + // to all branches and the parent + if (branchInfo.size() && nVrt == 8) + { + // all must have the same radius and parent + // and all children need to have count 4 + const number firstRad = m_aaSurfParams[parent->vertex(0)].radial; + const uint32_t firstParent = m_aaSurfParams[parent->vertex(0)].neuriteID & ((1 << 20) - 1); + bool allSame = true; + for (size_t i = 1; i < 8; ++i) + { + if (m_aaSurfParams[parent->vertex(i)].radial != firstRad + || (m_aaSurfParams[parent->vertex(i)].neuriteID & ((1 << 20) - 1)) != firstParent) + { + allSame = false; + break; + } + } + + if (allSame) + { + bool allChildCounts4 = true; + + std::map::const_iterator it2 = branchInfo.begin(); + std::map::const_iterator it2End = branchInfo.end(); + for (; it2 != it2End; ++it2) + { + if (candidates[it2->first] != 4) + { + allChildCounts4 = false; + break; + } + } + + if (allChildCounts4) + { + neuriteID = candidates.begin()->first; + for (it2 = branchInfo.begin(); it2 != it2End; ++it2) + neuriteID = neuriteID | it2->second; + } + } + } + + // special case: + // when refining the initial connecting quadrilateral face of a branch + // the center vertex needs to belong exclusively to the branch, not to the parent + if (nMaxCands == 2 && nVrt == 4 && maxCnt == 4) + neuriteID = std::max(maxCands[0], maxCands[1]); + + const uint32_t plainNID = neuriteID & ((1 << 20) - 1); + + + // average t, phi, r + t = 0.0; + float minRad = 1.0; + float maxRad = 0.0; + vector2 v(0.0); + size_t nForeignParents = 0; + std::vector foreignParentRad(8, 0.0); + vector3 foreignParentPosCenter = 0.0; + number foreignParentsCenterRadial = 0.0; + + size_t nForeignChildren = 0; + vector3 foreignChildrenPosCenter = 0.0; + + for (size_t i = 0; i < nVrt; ++i) + { + const SurfaceParams& surfParams = m_aaSurfParams[parent->vertex(i)]; + uint32_t nid = surfParams.neuriteID & ((1 << 20) - 1); + minRad = std::min(minRad, surfParams.radial); + maxRad = std::max(maxRad, surfParams.radial); + + // parent vertex belongs to our branch + if (nid == plainNID) + { + t += surfParams.axial; + if (surfParams.radial > 0 && surfParams.axial < 2.0) + { + const float phi = surfParams.angular; + VecAdd(v, v, vector2(surfParams.radial*cos(phi), surfParams.radial*sin(phi))); + } + } + + // parent vertex belongs to parent branch + else if (nid < plainNID) + { + foreignParentPosCenter += this->pos(parent->vertex(i)); + foreignParentRad[nForeignParents] = surfParams.radial; + ++nForeignParents; + } + + // parent vertex belongs to child branch + else + { + foreignChildrenPosCenter += this->pos(parent->vertex(i)); + ++nForeignChildren; + } + } + + // for parent vertices, calculate the t and phi params of their center + // w.r.t. branching neurite + if (nForeignParents) + { + foreignParentPosCenter /= nForeignParents; + + std::vector
::const_iterator secIt = m_vNeurites[plainNID].vSec.begin(); + vector3 pos0, pos1; + compute_first_section_end_points(pos0, pos1, secIt); + VecSubtract(pos1, pos1, pos0); + VecSubtract(pos0, foreignParentPosCenter, pos0); + number axPos = VecProd(pos0, pos1) / VecNormSquared(pos1) * secIt->endParam; + + vector3 vel; + number surfRadius; + compute_position_and_velocity_in_section(pos1, vel, surfRadius, secIt, axPos); + const vector3& refDir = m_vNeurites[plainNID].refDir; + vector3 posRefDir, thirdDir; + compute_ONB(vel, posRefDir, thirdDir, vel, refDir); + vector3 posFromAxis; + VecSubtract(posFromAxis, foreignParentPosCenter, pos1); + number phi = compute_angle(vel, posRefDir, thirdDir, posFromAxis); + + t += nForeignParents*axPos; + foreignParentsCenterRadial = VecNorm(posFromAxis) / surfRadius; + VecScaleAdd(v, 1.0, v, nForeignParents, vector2(foreignParentsCenterRadial*cos(phi), foreignParentsCenterRadial*sin(phi))); + } + + // for child vertices, calculate the t and phi params of their center + // w.r.t. parent neurite TODO: ATM this is not done as it is not overly important. + if (nForeignChildren) + { + t *= ((number) nVrt) / (nVrt - nForeignChildren); + VecScale(v, v, ((number) nVrt) / (nVrt - nForeignChildren)); + } + + + t /= nVrt; + radius = 0.5*(maxRad + minRad); + + // special case initial face of a branch: + // move frontier between branch and parent into branch + if (nForeignParents == 4 && nVrt == 4) + t *= sqrt(2.0); + + // special case tip of neurite + if (fabs(t-2.0) < 1e-8) + return; + + if (VecTwoNorm(v) / nVrt < 0.4 * radius && (nVrt == 4 || nVrt == 8)) + { + if (VecTwoNorm(v) / nVrt > 0.2 * radius) + { + UG_LOGN("HERE: radius " << radius << " -> 0 (real: " << VecTwoNorm(v) / nVrt << ")"); + //UG_LOGN(" plainNID " << plainNID); + UG_LOGN(" nVrt " << nVrt); + UG_LOGN(" parent vertex positions"); + for (size_t i = 0; i < nVrt; ++i) + UG_LOGN(" " << this->position(parent->vertex(i))); + } + angle = 0.0; + radius = 0.0; + } + + if (fabs(v[0]) < 1e-4) + { + if (fabs(v[1]) < 1e-4) // do not alter radius in tip + { + angle = 0.0; // center angle is 0.0 by default + radius = 0.0; + } + else + angle = v[1] < 0 ? 1.5*PI : 0.5*PI; + } + else + angle = v[0] < 0 ? PI - atan(-v[1]/v[0]) : atan(v[1]/v[0]); + + if (angle < 0) + angle += 2.0*PI; + +} + + +void NeuriteProjector::average_pos_from_parent(vector3& posOut, const IVertexGroup* const parent) const +{ + posOut = 0.0; + size_t nVrt = parent->num_vertices(); + for (size_t i = 0; i < nVrt; ++i) + posOut += this->pos(parent->vertex(i)); + posOut /= (number) nVrt; +} + + +/* +void NeuriteProjector::average_pos_from_parent_weighted(vector3& posOut, const IVertexGroup* parent) const +{ + MultiGrid* mg = dynamic_cast(&this->geometry()->grid()); + UG_COND_THROW(!mg, "Underlying grid is not a multigrid."); + int lv = mg->get_level(parent->vertex(0)); + if (lv == 0) + lv = 1; + + posOut = 0.0; + size_t nVrt = parent->num_vertices(); + std::vector vSheathID(nVrt); + vSheathID[0] = 0; + int sheathID[2] = {std::round(m_aaSurfParams[parent->vertex(0)].radial*(1 << (lv-1))), -1}; + int count[2] = {1, 0}; + for (size_t i = 1; i < nVrt; ++i) + { + int thisSheathID = std::round(m_aaSurfParams[parent->vertex(i)].radial*(1 << (lv-1))); + if (thisSheathID != sheathID[0] && sheathID[1] == -1) + sheathID[1] = thisSheathID; + if (thisSheathID == sheathID[0]) + { + ++count[0]; + vSheathID[i] = 0; + } + else if (thisSheathID == sheathID[1]) + { + ++count[1]; + vSheathID[i] = 1; + } + else + UG_THROW("An element must only be part of at most 2 sheaths."); + } + + if (!count[1]) + count[1] = 1; + + for (size_t i = 0; i < nVrt; ++i) + VecScaleAppend(posOut, count[1-vSheathID[i]], this->pos(parent->vertex(i))); + + posOut /= 2*count[0]*count[1]; +} +*/ + + +vector3 NeuriteProjector::position(Vertex* vrt) const +{ + return this->pos(vrt); +} + +number NeuriteProjector::axial_range_around_branching_region +( + uint32_t nid, + size_t brInd, + number numberOfRadii +) const +{ + const Neurite& neurite = m_vNeurites[nid]; + const BranchingRegion& br = neurite.vBR[brInd]; + + std::vector
::const_iterator secIt; + try {secIt = get_section_iterator(nid, br.t);} + UG_CATCH_THROW("Could not get section iterator to branching region " << brInd << " at t = " << br.t + << " of neurite " << nid << " (which has " << neurite.vBR.size() << " branching regions)."); + + vector3 secStartPos; + vector3 secEndPos; + const number te = secIt->endParam; + number ts = 0.0; + if (secIt == m_vNeurites[nid].vSec.begin()) + compute_first_section_end_points(secStartPos, secEndPos, secIt); + else + { + secEndPos[0] = secIt->splineParamsX[3]; + secEndPos[1] = secIt->splineParamsY[3]; + secEndPos[2] = secIt->splineParamsZ[3]; + --secIt; + ts = secIt->endParam; + secStartPos[0] = secIt->splineParamsX[3]; + secStartPos[1] = secIt->splineParamsY[3]; + secStartPos[2] = secIt->splineParamsZ[3]; + ++secIt; + } + const number neuriteLengthApprox = VecDistance(secEndPos, secStartPos) / (te - ts); + + const number* s = &secIt->splineParamsR[0]; + number radius = s[0]*(te-br.t) + s[1]; + radius = radius*(te-br.t) + s[2]; + radius = radius*(te-br.t) + s[3]; + + return numberOfRadii*radius / neuriteLengthApprox; +} + + +void NeuriteProjector::print_surface_params(const Vertex* const v) const +{ + const SurfaceParams& sp = m_aaSurfParams[v]; + UG_LOGN("neuriteID: " << sp.neuriteID); + UG_LOGN("axial: " << sp.axial); + UG_LOGN("angular: " << sp.angular); + UG_LOGN("radial: " << sp.radial); +} + + +static void bp_defect_and_gradient +( + number& defectOut, + vector3& gradientOut, + const std::vector& bpList, + const vector3& x, + number rad, + const vector3& constAngleSurfNormal, + const NeuriteProjector* np +) +{ + // get integration rule points and weights + const std::vector >& qPoints = np->quadrature_points(); + size_t nPts = qPoints.size(); + + // evaluate integrand at points + defectOut = 0.0; + gradientOut = 0.0; + size_t nParts = bpList.size(); + for (size_t i = 0; i < nParts; ++i) + { + const NeuriteProjector::BPProjectionHelper& helper = bpList[i]; + const number& start = helper.start; + const number& end = helper.end; + std::vector::const_iterator secIt = helper.sec_start; + + // iterate IPs + for (size_t j = 0; j < nPts; ++j) + { + // transform point coords to current context + float t = (float) (start + qPoints[j].first*(end-start)); + while (secIt->endParam < t) ++secIt; // this should be safe as last section must end with 1.0 + + vector3 posAx, vel, blub; + number radius; + compute_position_and_velocity_in_section(posAx, vel, radius, secIt, t); + + number radInv = 1.0 / (rad*radius); + VecSubtract(posAx, posAx, x); + number posNormSq = VecNormSquared(posAx); + number velNorm = sqrt(VecNormSquared(vel)); + number integrandVal = radInv*exp(-posNormSq*radInv*radInv) * velNorm; + number gradIntegrandVal = 2.0*radInv*radInv * integrandVal; + VecScale(blub, posAx, gradIntegrandVal); + + number w = qPoints[j].second; + defectOut += integrandVal * w * (end-start); + VecScaleAdd(gradientOut, 1.0, gradientOut, w * (end-start), blub); + + /* + UG_LOGN(" Ival: " << integrandVal << ", iExp: " << -posNormSq*radInv*radInv + << ", velNorm: " << velNorm << ", weight: " << w + << ", t: " << t << ", intvl: " << end-start + << ", posAx: " << posAx); + */ + } + } + + defectOut -= sqrt(PI)*exp(-1.0); + + // project gradient to surface of constant angle + VecScaleAppend(gradientOut, -VecDot(constAngleSurfNormal, gradientOut), constAngleSurfNormal); +} + +static void pos_on_surface_soma +( + vector3& posOut, + const NeuriteProjector::Neurite& neurite, + const NeuriteProjector* np, + const IVertexGroup* parent +) +{ + if (parent) np->average_pos_from_parent(posOut, parent); +} + +static void bp_defect_and_gradient_soma +( + number& defectOut, + vector3& gradientOut, + const std::vector& bpList, + const vector3& x, + const NeuriteProjector* np +) +{ + // get integration rule points and weights + const std::vector >& qPoints = np->quadrature_points(); + size_t nPts = qPoints.size(); + + // evaluate integrand at points + defectOut = 0.0; + gradientOut = 0.0; + const NeuriteProjector::BPProjectionHelper& helper = bpList[0]; + const number& start = helper.start; + const number& end = helper.end; + const number& somaRadius = helper.sr->radius; + const vector3& posSoma = helper.sr->center; + std::vector::const_iterator secIt = helper.sec_start; + + // iterate IPs + for (size_t j = 0; j < nPts; ++j) + { + /// NEURITE part + // transform point coords to current context + float t = (float) (start + qPoints[j].first*(end-start)); + + vector3 posAx, vel, blub; + number radius; + /// First section is always BP to soma + compute_position_and_velocity_in_section(posAx, vel, radius, secIt, t); + + number radInv = 1.0 / radius; + VecSubtract(posAx, posAx, x); + number posNormSq = VecNormSquared(posAx); + number velNorm = sqrt(VecNormSquared(vel)); + number integrandVal = radInv*exp(-posNormSq*radInv*radInv) * velNorm; + number gradIntegrandVal = 2.0*radInv*radInv * integrandVal; + VecScale(blub, posAx, gradIntegrandVal); + + number w = qPoints[j].second; + defectOut += integrandVal * w * (end-start); + VecScaleAdd(gradientOut, 1.0, gradientOut, w * (end-start), blub); + + /// SOMA part + number posNormSomaSq = VecNormSquared(posSoma); + number radInvSoma = 1.0 / somaRadius; + number gradIntegrandValSoma = radInvSoma * exp(-posNormSomaSq*radInvSoma*radInvSoma) * 1.0; + defectOut += gradIntegrandValSoma * w * (end-start); + } + + defectOut -= sqrt(PI)*exp(-1.0); +} + +static void newton_for_soma_bp_projection +( + vector3& posOut, + const std::vector& vProjHelp, + const NeuriteProjector* np +) +{ + vector3 posStart = posOut; + // calculate start defect and gradient + number def; + number def_init; + vector3 grad; + bp_defect_and_gradient_soma(def, grad, vProjHelp, posOut, np); + def_init = fabs(def); + + // perform some kind of Newton search for the correct position + size_t maxIt = 100; + number minDef = 1e-8*sqrt(PI)*exp(-1.0); + size_t iter = 0; + while (fabs(def) > minDef && fabs(def) > 1e-8 * def_init && ++iter <= maxIt) + { +//UG_LOGN(iter << " " << def << " " << grad << " " << posOut); + vector3 posTest; + vector3 gradTest; + number defTest; + VecScaleAdd(posTest, 1.0, posOut, -def / VecNormSquared(grad), grad); + bp_defect_and_gradient_soma(defTest, gradTest, vProjHelp, posTest, np); + + // line search + number lambda = 0.5; + number bestDef = defTest; + vector3 bestGrad = gradTest; + vector3 bestPos = posTest; + while (fabs(defTest) >= fabs(def) && lambda > 0.001) + { +//UG_LOGN(" line search with lambda = " << lambda); + VecScaleAdd(posTest, 1.0, posOut, -lambda*def / VecNormSquared(grad), grad); + bp_defect_and_gradient_soma(defTest, gradTest, vProjHelp, posTest, np); + if (fabs(defTest) < fabs(bestDef)) + { + bestDef = defTest; + bestGrad = gradTest; + bestPos = posTest; + } + lambda *= 0.5; + } + def = bestDef; + grad = gradTest; + posOut = bestPos; + } + UG_COND_THROW(def != def, + "Newton iteration did not converge for soma branching point projection at " << posStart << ". Defect is NaN.") + UG_COND_THROW(fabs(def) > minDef && fabs(def) > 1e-8 * def_init, + "Newton iteration did not converge for soma branching point projection at " << posStart << ".") +} + + + + +/* +static void pos_on_neurite_spine +( + vector3& posOut, + const NeuriteProjector::Neurite& neurite, + size_t neuriteID, + float& t +) +{ + const std::vector& vSections = neurite.vSec; + + // find correct section + NeuriteProjector::Section cmpSec(t); + std::vector::const_iterator it = + std::lower_bound(vSections.begin(), vSections.end(), cmpSec, NeuriteProjector::CompareSections()); + + UG_COND_THROW(it == vSections.end(), + "Could not find section for parameter t = " << t << " in neurite " << neuriteID << "."); + + // calculate correct axial position + // and velocity dir + vector3 vel_dummy; + number radius_dummy; + compute_position_and_velocity_in_section(posOut, vel_dummy, radius_dummy, it, t); +} +*/ + + +static void newton_for_bp_projection +( + vector3& posOut, + const std::vector& vProjHelp, + float rad, + const vector3& constAngleSurfNormal, + const NeuriteProjector* np +) +{ + vector3 posStart = posOut; + // calculate start defect and gradient + number def; + number def_init; + vector3 grad; + bp_defect_and_gradient(def, grad, vProjHelp, posOut, rad, constAngleSurfNormal, np); + def_init = fabs(def); + + // perform some kind of Newton search for the correct position + size_t maxIt = 10; + number minDef = 1e-8*sqrt(PI)*exp(-1.0); + size_t iter = 0; + number corr = 1.0; + + //UG_LOGN(iter << " " << def << " " << grad << " " << posOut); + while (fabs(def) > minDef && fabs(def) > 1e-8 * def_init && ++iter <= maxIt) + { + corr /= 2; // start with reduced step size to prevent overshooting in case the start position is too bad + vector3 posTest; + vector3 gradTest; + number defTest; + VecScaleAdd(posTest, 1.0, posOut, -(1.0-corr)*def / VecNormSquared(grad), grad); + bp_defect_and_gradient(defTest, gradTest, vProjHelp, posTest, rad, constAngleSurfNormal, np); + + // line search + number lambda = 0.5; + number bestDef = defTest; + vector3 bestGrad = gradTest; + vector3 bestPos = posTest; + while (fabs(defTest) >= fabs(def) && lambda > 0.001) + { + //UG_LOGN(" line search with lambda = " << lambda); + VecScaleAdd(posTest, 1.0, posOut, -lambda*def / VecNormSquared(grad), grad); + bp_defect_and_gradient(defTest, gradTest, vProjHelp, posTest, rad, constAngleSurfNormal, np); + if (fabs(defTest) < fabs(bestDef)) + { + bestDef = defTest; + bestGrad = gradTest; + bestPos = posTest; + } + lambda *= 0.5; + } + def = bestDef; + grad = gradTest; + posOut = bestPos; + + //UG_LOGN(iter << " " << def << " " << grad << " " << posOut); + } + UG_COND_THROW(def != def, + "Newton iteration did not converge for branching point projection at " << posStart << ". Defect is NaN.") + UG_COND_THROW(fabs(def) > minDef && fabs(def) > 1e-8 * def_init, + "Newton iteration did not converge for branching point projection at " << posStart << ".") +} + + +static void pos_in_neurite +( + vector3& posOut, + const NeuriteProjector::Neurite& neurite, + size_t neuriteID, + float t, + float angle, + float rad +) +{ + const std::vector& vSections = neurite.vSec; + + // find correct section + NeuriteProjector::Section cmpSec(t); + std::vector::const_iterator it = + std::lower_bound(vSections.begin(), vSections.end(), cmpSec, NeuriteProjector::CompareSections()); + + UG_COND_THROW(it == vSections.end(), + "Could not find section for parameter t = " << t << " in neurite " << neuriteID << "."); + + // calculate correct axial position + // and velocity dir + vector3 posAx, vel; + number radius; + compute_position_and_velocity_in_section(posAx, vel, radius, it, t); + + // calculate orthonormal basis vectors + vector3 projRefDir, thirdDir; + compute_ONB(vel, projRefDir, thirdDir, vel, neurite.refDir); + + // calculate new position + VecScaleAdd(posOut, 1.0, posAx, rad*radius*cos(angle), projRefDir, rad*radius*sin(angle), thirdDir); +} + + +#if 0 +static void bp_newton_start_pos +( + vector3& initOut, + uint32_t neuriteID, + float t, + float angle, + float rad, + const IVertexGroup* parent, + const NeuriteProjector* np +) +{ + // If t1, t2 are the axial positions of the (edge) parent vertices, + // then construct the spline vectors v1, v2 corresponding to these + // axial coordinates. Then construct the spline vector v3 corresponding + // to t3 = 0.5*(t1+t2) and calculate: + // q = ||v3 - 0.5*(v1+v2)|| / ||v1 - v2|| + // Then if q is smaller than some threshold value, the underlying + // spline is quasi-linear on the parent, so we can use the averaged + // vertex positions as initial solution. + // Otherwise, we take the neurite surface position of t3. + // Or, even better, some weighted version of this which coincides + // with the first case if its condition applies. + vector3 pos_avg; + np->average_pos_from_parent(pos_avg, parent); + vector3 pos_avg_onNeurite; + pos_in_neurite(pos_avg_onNeurite, np->neurite(neuriteID), neuriteID, t, angle, rad); + + number distSq = VecDistanceSq(pos_avg_onNeurite, pos_avg); + + number qSq; + if (rad*rad <= 1e-8*distSq) + qSq = 0.0; + else + qSq = distSq / (rad*rad); + number w1 = qSq*qSq / (qSq*qSq + 1e-4); // in [0,1] with w1 = 0.5 for q = 0.1; + VecScaleAdd(initOut, w1, pos_avg_onNeurite, 1.0-w1, pos_avg); +} +#endif + +static void pos_on_surface_soma_bp +( + vector3& posOut, + const NeuriteProjector::Neurite& neurite, + size_t neuriteID, + float& t, + float& angle, + const IVertexGroup* parent, + const NeuriteProjector* np, + float rad, + Vertex* vrt, + const NeuriteProjector::SomaRegion& sr +) { + // 1. preparations for Newton method: + // save integration start and end positions of soma connection + // also save a section iterator to start from + std::vector vProjHelp(1); + number& start = vProjHelp[0].start; + number& end = vProjHelp[0].end; + std::vector::const_iterator& sec_start = vProjHelp[0].sec_start; + number range = 0.0; + try {range = np->axial_range_around_soma_region(sr, 10.0*rad, neuriteID, vrt); } + UG_CATCH_THROW("Range around soma region could not be calculated."); + start = 0.0; + end = range; + vProjHelp[0].sr = &sr; + sec_start = (&np->neurite(neuriteID).vSec)->begin(); + + // 2. determine suitable start position for Newton iteration + pos_on_surface_soma(posOut, np->neurite(neuriteID), np, parent); + + // 3. perform Newton iteration + try {newton_for_soma_bp_projection(posOut, vProjHelp, np);} + UG_CATCH_THROW("Newton iteration for neurite projection at branching point failed."); +} + + +static void pos_in_bp +( + vector3& posOut, + const NeuriteProjector::Neurite& neurite, + uint32_t neuriteID, + float& t, + float& angle, + float rad, + std::vector::const_iterator& it, + const IVertexGroup* parent, + const NeuriteProjector* np +) +{ + // if vertex is on the neurite backbone, simply project onto spline + // (Newton iteration will not succeed for Jacobian is zero) + if (rad < 1e-5) + { + pos_in_neurite(posOut, np->neurite(neuriteID), neuriteID, t, angle, rad); + return; + } + + // preparations for Newton method: + // save integration start and end positions of all BRs of this BP, + // also save a section iterator to start from + SmartPtr bp = it->bp; + size_t nParts = bp->vRegions.size(); + std::vector vProjHelp(nParts); + const std::vector* secs; + for (size_t i = 0; i < nParts; ++i) + { + number& start = vProjHelp[i].start; + number& end = vProjHelp[i].end; + std::vector::const_iterator& sec_start = vProjHelp[i].sec_start; + + uint32_t nid = bp->vNid[i]; + const NeuriteProjector::BranchingRegion* br = bp->vRegions[i]; + + UG_COND_THROW(!br, "Requested branching region not accessible."); + + // integrate over twice the size of the original BR (i.e., 10 times rad*radius in each direction) + number range = 0.0; + try {range = np->axial_range_around_branching_region(nid, + (size_t) (br - &np->neurite(nid).vBR[0]), 10.0*rad);} + UG_CATCH_THROW("Range around branching region could not be calculated."); + start = std::max(br->t - range, 0.0); + end = std::min(br->t + range, 1.0); + + secs = &np->neurite(nid).vSec; + if (start == 0.0) + sec_start = secs->begin(); + else + { + NeuriteProjector::Section cmpSec(start); + sec_start = std::lower_bound(secs->begin(), secs->end(), cmpSec, NeuriteProjector::CompareSections()); + UG_COND_THROW(sec_start == secs->end(), + "Could not find section for start parameter t = " << start << "."); + } + } + + // also calculate normal of constant-angle surface + vector3 constAngleSurfNormal; + NeuriteProjector::Section cmpSec(t); + const std::vector& vSections = neurite.vSec; + std::vector::const_iterator secIt = + std::lower_bound(vSections.begin(), vSections.end(), cmpSec, NeuriteProjector::CompareSections()); + + vector3 s, v; + number radius; + compute_position_and_velocity_in_section(s, v, radius, secIt, t); + vector3 projRefDir; + vector3 thirdDir; + compute_ONB(constAngleSurfNormal, projRefDir, thirdDir, v, neurite.refDir); + VecScaleAdd(constAngleSurfNormal, sin(angle), projRefDir, -cos(angle), thirdDir); + + // determine suitable start position for Newton iteration + if (parent) + np->average_pos_from_parent(posOut, parent); // best results on regular BPs + //pos_in_neurite(posOut, np->neurite(neuriteID), neuriteID, t, angle, rad); + //bp_newton_start_pos(posOut, neuriteID, t, angle, rad, parent, np); + + + // perform Newton iteration + try {newton_for_bp_projection(posOut, vProjHelp, rad, constAngleSurfNormal, np);} + UG_CATCH_THROW("Newton iteration for neurite projection at branching point failed" + " in neurite " << neuriteID << "."); + + + // update the surface param info to the new position + // In order not to have to compute zeros of a 5th order polynomial, + // we make a linearity approximation here: + // s(t) = s(t0) + v(t0)*(t-t0); + // v(t) = v(t0) + // Then from v(t) * (s(t)-pos) = 0, we get: + // t = t0 + v(t0) * (pos - s(t0)) / (v(t0)*v(t0)) + VecSubtract(s, posOut, s); + t += VecProd(v,s) / VecProd(v,v); + + // and now angle + if (rad > 1e-5) + angle = compute_angle(v, projRefDir, thirdDir, s); + + // and radius + //rad = VecNorm(s) / radius; + + /* + // if we have ended up outside of the BP, then use the usual positioning + if (t > it->tend) + { + vector3 posAx; + number radius; + compute_position_and_velocity_in_section(posAx, v, radius, secIt, t); + VecScaleAdd(posOut, 1.0, posAx, rad*radius*cos(angle), projRefDir, rad*radius*sin(angle), thirdDir); + } + */ +} + + +static void pos_on_surface_tip +( + vector3& posOut, + const NeuriteProjector::Neurite& neurite, + const IVertexGroup* parent, + const NeuriteProjector* np, + number rad +) +{ + const std::vector& vSections = neurite.vSec; + + // initial position: regular refinement + // in case there is no parent (projection of an existing vertex), keep the position + if (parent) + np->average_pos_from_parent(posOut, parent); + + // project to half-sphere with given radius over tip center + // TODO: One might think about something more sophisticated, + // as the current approach ensures only continuity of the radius + // at tips, but not differentiability. + const NeuriteProjector::Section& sec = vSections[vSections.size()-1]; + vector3 tipCenter(sec.splineParamsX[3], sec.splineParamsY[3], sec.splineParamsZ[3]); + number radius = sec.splineParamsR[3]; + + vector3 radialVec; + VecSubtract(radialVec, posOut, tipCenter); + number radNorm = sqrt(VecProd(radialVec, radialVec)); + + // only project if we are not in the center of the half sphere + if (radNorm >= 1e-5*rad*radius) + { + VecScale(radialVec, radialVec, rad*radius/radNorm); + VecAdd(posOut, tipCenter, radialVec); + } +} + +number NeuriteProjector::axial_range_around_soma_region +( + const SomaRegion& sr, + const number rad, + const size_t nid, + Vertex* vrt +) const +{ + // soma parameters + const float somaRad = sr.radius; + vector3 bp = sr.bp; + + std::vector::const_iterator secIt; + try {secIt = get_section_iterator(nid, sr.t);} + UG_CATCH_THROW("Could not get section iterator to soma region: " << sr.t); + + vector3 secStartPos; + vector3 secEndPos; + const number te = secIt->endParam; + number ts = 0.0; + if (secIt == m_vNeurites[nid].vSec.begin()) + compute_first_section_end_points(secStartPos, secEndPos, secIt); + else + { + secEndPos[0] = secIt->splineParamsX[3]; + secEndPos[1] = secIt->splineParamsY[3]; + secEndPos[2] = secIt->splineParamsZ[3]; + --secIt; + ts = secIt->endParam; + secStartPos[0] = secIt->splineParamsX[3]; + secStartPos[1] = secIt->splineParamsY[3]; + secStartPos[2] = secIt->splineParamsZ[3]; + ++secIt; + } + + const number neuriteLengthApprox = VecDistance(secEndPos, secStartPos) / (te - ts); + const number* s = &secIt->splineParamsR[0]; + number radius = s[0]*(te-sr.t) + s[1]; + radius = radius*(te-sr.t) + s[2]; + radius = radius*(te-sr.t) + s[3]; + + const number bpToVrt = VecDistance(bp, position(vrt)); + const number neurite_length_to_soma = neuriteLengthApprox + bpToVrt; + const number radii = (rad * (somaRad + radius)/2.0)/neurite_length_to_soma; + return radii; +} + +bool NeuriteProjector::is_in_axial_range_around_soma_region +( + const SomaRegion& sr, + number radius, + size_t nid, + Vertex* vrt +) const { + return IsElementInsideSphere(vrt, sr.bp, axial_range_around_soma_region(sr, 5.0*radius, nid, vrt)); +} + +number NeuriteProjector::push_into_place(Vertex* vrt, const IVertexGroup* parent) +{ + // average axial and angular params from parent; + // also decide on neuriteID + uint32_t neuriteID; + float t; + float angle; + float rad; + if (parent) + average_params(neuriteID, t, angle, rad, parent); + else + { + neuriteID = m_aaSurfParams[vrt].neuriteID; + t = m_aaSurfParams[vrt].axial; + angle = m_aaSurfParams[vrt].angular; + rad = m_aaSurfParams[vrt].radial; + } + + //UG_LOGN("averaged params: nid " << neuriteID << " t " << t << " angle " + // << angle << " rad " << rad); + + const uint32_t plainNID = (neuriteID << 12) >> 12; + + UG_COND_THROW(plainNID >= m_vNeurites.size(), "Requested neurite ID which is not present."); + + const Neurite& neurite = m_vNeurites[plainNID]; + const std::vector& vBR = neurite.vBR; + const std::vector& vSR = neurite.vSR; + + // vector for new position + vector3 pos(position(vrt)); + + // FIVE CASES can occur: + // 1. We are at a branching point. + // 2. We are at a soma branching point + // 3. We are well inside a regular piece of neurite. + // 4. We are well inside a regular piece of soma. + // 5. We are at the tip of a neurite. + + bool isBP = false; + BranchingRegion cmpBR(t); + std::vector::const_iterator it = + std::lower_bound(vBR.begin(), vBR.end(), cmpBR, CompareBranchingRegionEnds()); + + bool isSP = false; + SomaRegion cmpSR(t); + std::vector::const_iterator it2 = + std::lower_bound(vSR.begin(), vSR.end(), cmpSR, CompareSomaRegionsEnd()); + + /// This determines if the point is considered to be in the soma branching region by a distance criterion + if (it2 != vSR.end()) { + isSP = is_in_axial_range_around_soma_region(*it2, 5.0*rad, plainNID, vrt); + } + + if (!isSP && it2 != vSR.begin()) { + isSP = is_in_axial_range_around_soma_region(*it2, 5.0*rad, plainNID, vrt); + } + + if (it != vBR.end()) + { + number range = 0.0; + try {range = axial_range_around_branching_region(plainNID, std::distance(vBR.begin(), it), 5.0*rad);} + UG_CATCH_THROW("Range around branching region could not be determined."); + if (it->t - t < range) + { + isBP = true; + } + } + + if (!isBP && it != vBR.begin()) + { + --it; + number range = 0.0; + try {range = axial_range_around_branching_region(plainNID, std::distance(vBR.begin(), it), 5.0*rad);} + UG_CATCH_THROW("Range around branching region could not be determined."); + if (t - it->t < range) + { + isBP = true; + } + } + + // case 1: branching point + if (isBP) + { + pos_in_bp(pos, neurite, plainNID, t, angle, rad, it, parent, this); + } + + // case 2: soma branching point + else if (isSP) + { + /// This should integrate along the neurite [0, END_SOMA_BRANCHING_REGION] + /// but not [-range, range] to avoid dints in the soma interior close to + /// the surface. A new position for the vertex based on the average of the + /// (first) neurite section and the soma sphere position and radius will + /// be calculated based on the SomaRegion information stored in a struct. + pos_on_surface_soma_bp(pos, neurite, neuriteID, t, angle, parent, this, rad, vrt, *it2); + } + + // case 3: normal neurite position + else if (t >= 0.0 && t <= 1.0) + { + pos_in_neurite(pos, neurite, plainNID, t, angle, rad); + } + + // case 4: normal soma position + else if (t < 0 && t >= -1.0) + { + pos_on_surface_soma(pos, neurite, this, parent); + } + + // case 5: tip of neurite + else + { + pos_on_surface_tip(pos, neurite, parent, this, rad); + } + + // save new surface params for new vertex + m_aaSurfParams[vrt].neuriteID = neuriteID; + m_aaSurfParams[vrt].axial = t; + m_aaSurfParams[vrt].angular = angle; + m_aaSurfParams[vrt].radial = rad; + + // set position + set_pos(vrt, pos); + + return 1.0; +} + + + +// -------------------------------------------------------- // +// DO NOT CHANGE below this line! Needed for serialization. // + +std::ostream& operator<<(std::ostream &os, const NeuriteProjector::SurfaceParams& surfParams) +{ + using std::ostringstream; + ostringstream strs; + strs << surfParams.neuriteID << " "; + strs << surfParams.axial << " "; + strs << surfParams.angular << " "; + strs << surfParams.radial; + os << strs.str(); + return os; +} + +std::istream& operator>>(std::istream& in, NeuriteProjector::SurfaceParams& surfParams) +{ + std::string temp; + using boost::lexical_cast; + + in >> temp; + surfParams.neuriteID = lexical_cast(temp); + temp.clear(); + + in >> temp; + surfParams.axial = (lexical_cast(temp)); + temp.clear(); + + in >> temp; + surfParams.angular = lexical_cast(temp); + temp.clear(); + + in >> temp; + surfParams.radial = lexical_cast(temp); + temp.clear(); + + return in; +} + + +} // namespace ug diff --git a/ugbase/lib_grid/refinement/projectors/neurite_projector.h b/ugbase/lib_grid/refinement/projectors/neurite_projector.h new file mode 100644 index 000000000..e81fdeefb --- /dev/null +++ b/ugbase/lib_grid/refinement/projectors/neurite_projector.h @@ -0,0 +1,455 @@ +/* + * Copyright (c) 2016: G-CSC, Goethe University Frankfurt + * Author: Markus Breit + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * Created on: 2016-12-19 + */ + +#ifndef UG__LIB_GRID__REFINEMENT__PROJECTORS__NEURITE_PROJECTOR_H +#define UG__LIB_GRID__REFINEMENT__PROJECTORS__NEURITE_PROJECTOR_H + +#include "common/types.h" +#include "lib_grid/refinement/projectors/refinement_projector.h" + +#include // for separate load/save methods + +namespace ug { + +class NeuriteProjector +: public RefinementProjector +{ + public: + NeuriteProjector(); + NeuriteProjector(SPIGeometry3d geometry); + + virtual ~NeuriteProjector(); + + virtual void set_geometry(SPIGeometry3d geometry); + + /// called when a new vertex was created from an old vertex + virtual number new_vertex(Vertex* vrt, Vertex* parent); + + /// called when a new vertex was created from an old edge + virtual number new_vertex(Vertex* vrt, Edge* parent); + + /// called when a new vertex was created from an old face + virtual number new_vertex(Vertex* vrt, Face* parent); + + /// called when a new vertex was created from an old volume + virtual number new_vertex(Vertex* vrt, Volume* parent); + + /// project a vertex to its model position + void project(Vertex* vrt); + + /// spline direction at some grid object + void direction_at_grid_object(vector3& dirOut, GridObject* o) const; + + + protected: + void attach_surf_params(); + + public: + struct Section + { + Section() : endParam(0) {} // constructor for serialization + Section(number _endParam) // constructor for search with CompareSections + : endParam(_endParam) {} + + number endParam; + + number splineParamsX[4]; + number splineParamsY[4]; + number splineParamsZ[4]; + number splineParamsR[4]; + + template + void serialize(Archive& ar, const unsigned int version) + { + ar & endParam; + for (size_t i = 0; i < 4; ++i) + { + ar & splineParamsX[i]; + ar & splineParamsY[i]; + ar & splineParamsZ[i]; + ar & splineParamsR[i]; + } + } + }; + + + struct BranchingPoint; + struct BranchingRegion + { + BranchingRegion() : t(0.0), bp(SPNULL) {} // constructor for serialization + BranchingRegion(number _t) // constructor for search with CompareBranchingPointEnds + : t(_t) {} + + /// the axial parameter where other neurite(s) branch off + number t; + + /// pointer to whole branching point + SmartPtr bp; + + template + void save(Archive & ar, const unsigned int version) const + { + ar << t; + + bool owns_bp = bp->vRegions[0] == this; + ar << owns_bp; + if (owns_bp) + ar << *bp; + } + + template + void load(Archive & ar, const unsigned int version) + { + // invoke serialization of the base class + ar >> t; + + bool owns_bp; + ar >> owns_bp; + if (owns_bp) + { + bp = make_sp(new BranchingPoint()); + ar >> *bp; + } + } + + BOOST_SERIALIZATION_SPLIT_MEMBER(); + }; + + + struct BranchingPoint + { + std::vector vNid; + std::vector vRegions; + + template + void serialize(Archive& ar, const unsigned int version) + { + // please note: We could simply use + // ar & vNid + // but this somehow takes up a huge number of template recursions + size_t sz = vNid.size(); // this does not hurt in the load-case + ar & sz; + vNid.resize(sz); // this does not hurt in the save-case + for (size_t i = 0; i < sz; ++i) + ar & vNid[i]; + } + }; + + struct SomaRegion { + vector3 center; + number radius; + number t; + vector3 bp; + + template + void serialize(Archive& ar, const unsigned int version) { + ar & center; + ar & radius; + ar & t; + } + + template + void load(Archive & ar, const unsigned int version) + { + ar >> center; + ar >> radius; + ar >> t; + } + + SomaRegion(const vector3& center, number radius, number t) + : center(center), + radius(radius), + t(t) + {} + + SomaRegion(number t) + : center(0, 0, 0), + radius(0), + t(t) + {} + + SomaRegion() + : center(0, 0, 0), + radius(-1), + t(-1) + {} + }; + + struct Neurite + { + vector3 refDir; + std::vector
vSec; + std::vector vBR; + std::vector vSR; + + template + void serialize(Archive& ar, const unsigned int version) + { + /// neurite information + ar & refDir; + + size_t sz = vSec.size(); + ar & sz; + vSec.resize(sz); + for (size_t i = 0; i < sz; ++i) + ar & vSec[i]; + + sz = vBR.size(); + ar & sz; + vBR.resize(sz); + for (size_t i = 0; i < sz; ++i) + ar & vBR[i]; + + /// soma information + sz = vSR.size(); + ar & sz; + vSR.resize(sz); + for (size_t i = 0; i < sz; ++i) { + ar & vSR[i]; + } + } + }; + + struct SurfaceParams + { + /** + * @brief Neurite ID a vertex belongs to + * + * Only the low 20 bits are used for ordinary vertices, i.e., + * vertices that do not belong to two neurites at a branching point. + * In branching points, the high 4 bits encode which of the child + * neurites share the vertex: bit 28 for child 0, bit 29 for child 1, + * bit 30 for child 2 and bit 31 for child 3. + * Bits 20-27 are used to encode the branching region on the parent + * neurite. + * There cannot be more than 256 branching regions per neurite. + * There cannot be more than 4 children per branching point. + */ + uint32 neuriteID; + float axial; + float angular; + float radial; + }; + + + public: + struct CompareSections + { + bool operator()(const Section& a, const Section& b) + {return a.endParam < b.endParam;} + }; + struct CompareBranchingRegionEnds + { + bool operator()(const BranchingRegion& a, const BranchingRegion& b) + {return a.t < b.t;} + }; + + // helper struct for branching point calculations + struct BPProjectionHelper + { + number start; + number end; + std::vector
::const_iterator sec_start; + const SomaRegion* sr; + }; + + void debug_neurites() const; + + struct CompareSomaRegionsEnd { + bool operator()(const SomaRegion& a, const SomaRegion& b) { + return a.radius < b.radius; + } + }; + + public: + std::vector& neurites(); + const Neurite& neurite(uint32_t nid) const; + Grid::VertexAttachmentAccessor >& surface_params_accessor(); + const Grid::VertexAttachmentAccessor >& surface_params_accessor() const; + const std::vector >& quadrature_points() const; + void average_pos_from_parent(vector3& posOut, const IVertexGroup* const parent) const; + vector3 position(Vertex* vrt) const; + + number axial_range_around_branching_region + ( + uint32_t nid, + size_t brInd, + number numberOfRadii = 5.0 + ) const; + + number axial_range_around_soma_region + ( + const SomaRegion& sr, + number rad, + size_t nid, + Vertex* vrt + ) const; + + bool is_in_axial_range_around_soma_region + ( + const SomaRegion& sr, + number rad, + size_t nid, + Vertex* vrt + ) const; + + void print_surface_params(const Vertex* const v) const; + + protected: + std::vector
::const_iterator get_section_iterator(uint32_t nid, float t) const; + + void prepare_quadrature(); + + void average_params + ( + uint32_t& neuriteID, + float& t, + float& angle, + float& radius, + const IVertexGroup* parent + ) const; + + number push_into_place(Vertex* vrt, const IVertexGroup* parent); + + private: + Attachment m_aSurfParams; + Grid::VertexAttachmentAccessor > m_aaSurfParams; + + /** + * @brief storage for cubic splines: + * Vector of sorted vectors of sections; each inner vector represents a single neurite. + * Any complete neurite is parameterized by t in [0,1]. Each section in the neurite vector + * consists of the parameter t at which the section ends and the sixteen coefficients + * describing the spline in each dimension (monomial basis {(t_(i+1) - t)^i}_i). + **/ + std::vector m_vNeurites; //!< spline information for neurites and somatas + + std::vector > m_qPoints; //!< for quadrature when projecting within branching points + + /*! + * \brief check if an element is inside a sphere + * \param[in] elem + * \param[in] center + * \param[in] radius + * \return \c true if element is inside or on sphere else false + */ + template + bool IsElementInsideSphere + ( + const TElem* elem, + const ug::vector3& center, + const number radius + ) const + { + Grid::VertexAttachmentAccessor aaPos(this->geometry()->grid(), aPosition); + vector3 c = CalculateCenter(elem, aaPos); + vector3 diff; + VecSubtract(diff, c, center); + VecPow(diff, diff, 2.0); + number s = diff.x() + diff.y() + diff.z(); + return (s <= (sq(radius) + SMALL)); + } + + friend class boost::serialization::access; + template + void save(Archive & ar, const unsigned int version) const + { + UG_EMPTY_BASE_CLASS_SERIALIZATION(NeuriteProjector, RefinementProjector); + + // only write if data is to be written + if(ArchiveInfo::TYPE == AT_DATA) + { + // neurites + size_t sz = m_vNeurites.size(); + ar << sz; + for (size_t i = 0; i < sz; ++i) { + ar << m_vNeurites[i]; + } + } + + // do not do anything otherwise + else if (ArchiveInfo::TYPE == AT_GUI) + {} + } + + template + void load(Archive & ar, const unsigned int version) + { + UG_EMPTY_BASE_CLASS_SERIALIZATION(NeuriteProjector, RefinementProjector); + + // neurites + size_t sz; + ar >> sz; + m_vNeurites.resize(sz); + for (size_t i = 0; i < sz; ++i) { + ar >> m_vNeurites[i]; + } + + // reconstruct uninitialized pointers in branching points/ranges + size_t nNeurites = m_vNeurites.size(); + for (size_t n = 0; n < nNeurites; ++n) + { + Neurite& neurite = m_vNeurites[n]; + size_t nBR = neurite.vBR.size(); + for (size_t b = 0; b < nBR; ++b) + { + BranchingRegion& br = neurite.vBR[b]; + SmartPtr bp = br.bp; + if (bp.valid() && !bp->vRegions.size()) + { + size_t nReg = bp->vNid.size(); + bp->vRegions.resize(nReg); + bp->vRegions[0] = &br; + for (size_t r = 1; r < nReg; ++r) + { + UG_ASSERT(m_vNeurites[bp->vNid[r]].vBR.size(), + "No branching region in neurite where there should be one.") + bp->vRegions[r] = &m_vNeurites[bp->vNid[r]].vBR[0]; + bp->vRegions[r]->bp = bp; + } + } + } + } + // debug_neurites(); + } + BOOST_SERIALIZATION_SPLIT_MEMBER(); +}; + +// DO NOT CHANGE LINES BELOW! Needed for serialization! // +std::ostream& operator<<(std::ostream &os, const NeuriteProjector::SurfaceParams& surfParams); +std::istream& operator>>(std::istream& in, NeuriteProjector::SurfaceParams& surfParams); +DECLARE_ATTACHMENT_INFO_TRAITS(Attachment, "NeuriteProjectorSurfaceParams"); +} // namespace ug + +#endif // UG__LIB_GRID__REFINEMENT__PROJECTORS__NEURITE_PROJECTOR_H diff --git a/ugbase/lib_grid/refinement/projectors/projection_handler.cpp b/ugbase/lib_grid/refinement/projectors/projection_handler.cpp index ce34921aa..9ce7e20c5 100644 --- a/ugbase/lib_grid/refinement/projectors/projection_handler.cpp +++ b/ugbase/lib_grid/refinement/projectors/projection_handler.cpp @@ -267,7 +267,6 @@ refinement_begins (const ISubGrid* psg) sel.select(e); }lg_end_for; } - selectionPerformed = true; } SubGrid tsg(sel.get_grid_objects(), IsSelected(sel)); diff --git a/ugbase/lib_grid/refinement/projectors/projectors.h b/ugbase/lib_grid/refinement/projectors/projectors.h index 6a4553f8b..a05ddcc4d 100644 --- a/ugbase/lib_grid/refinement/projectors/projectors.h +++ b/ugbase/lib_grid/refinement/projectors/projectors.h @@ -40,12 +40,15 @@ #include "refinement_projector.h" #include "cylinder_cut_projector.h" #include "cylinder_projector.h" +#include "elliptic_cylinder_projector.h" #include "plane_cut_projector.h" #include "projection_handler.h" #include "raster_layers_projector.h" #include "smooth_projector.h" #include "sphere_projector.h" #include "subdivision_projector.h" +#include "neurite_projector.h" +#include "soma_projector.h" namespace boost { namespace mpl { @@ -61,11 +64,14 @@ namespace tmp { // in this list, since they are only usable in specialized algorithms. typedef vector< pair >, - pair >, - pair >, - pair >, - pair >, - pair > + pair >, + pair >, + pair >, + pair >, + pair >, + pair >, + pair >, + pair > > ProjectorTypes; } diff --git a/ugbase/lib_grid/refinement/projectors/soma_projector.h b/ugbase/lib_grid/refinement/projectors/soma_projector.h new file mode 100644 index 000000000..014754f86 --- /dev/null +++ b/ugbase/lib_grid/refinement/projectors/soma_projector.h @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2018: G-CSC, Goethe University Frankfurt + * Author: Stephan Grein + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__UG_cylinder_soma_projector +#define __H__UG_cylinder_soma_projector + +#include "common/math/misc/math_util.h" +#include "refinement_projector.h" +#include "lib_grid/tools/copy_attachment_handler.h" +#include "lib_grid/global_attachments.h" + +namespace ug { +/// Projects new vertices onto a sphere during refinement. +/** For projection during refinement the radius property is ignored. Instead + * the distance to the center of a newly inserted vertex is calculated + * as the average distance of the vertices of the parent element to the center. + * The radius property thus defaults to -1. + * + * You may still specify a radius. This radius can be used for auto-fitting of + * the center and for reprojecting a set of vertices onto the sphere. + * + * Only vertices which are at the soma (axial parameter: -1) are projected + * on the surface. This works well for good natured connecting neurites. + */ +class SomaProjector : public RefinementProjector { +private: + Attachment m_aSurfParams; + Grid::VertexAttachmentAccessor > m_aaSurfParams; + CopyAttachmentHandler > m_cah; +protected: + virtual void set_geometry(SPIGeometry3d geometry) + { + // call base class method + RefinementProjector::set_geometry(geometry); + attach_surf_params(); + } +public: + SomaProjector () : + m_center (0, 0, 0), + m_axis (0, 0, 1), + m_soma (0, 0, 0), + m_somaRad(0) + { + typedef Attachment NPSurfParam; + if (!GlobalAttachments::is_declared("npSurfParams")) + GlobalAttachments::declare_attachment("npSurfParams", true); + + } + + SomaProjector (const vector3& center, + const vector3& axis, + const vector3& soma, + const number& rad) : + + m_center (center), + m_axis (axis), + m_soma (soma), + m_somaRad(rad) + { + typedef Attachment NPSurfParam; + if (!GlobalAttachments::is_declared("npSurfParams")) + GlobalAttachments::declare_attachment("npSurfParams", true); + } + +public: +/** \sa ug::RefinementProjector::RefinementProjector*/ + SomaProjector (SPIGeometry3d geometry, + const vector3& center, + const vector3& axis, + const vector3& soma, + const number& rad) : + RefinementProjector (geometry), + m_center (center), + m_axis (axis), + m_soma (soma), + m_somaRad(rad) + { + attach_surf_params(); + } + + +public: + virtual ~SomaProjector () {} + +/// called when a new vertex was created from an old edge. + virtual number new_vertex(Vertex* vrt, Edge* parent) + { + return perform_projection(vrt, parent); + } + +/// called when a new vertex was created from an old face. + virtual number new_vertex(Vertex* vrt, Face* parent) + { + return perform_projection(vrt, parent); + } + +/// called when a new vertex was created from an old volume. + virtual number new_vertex(Vertex* vrt, Volume* parent) + { + return perform_projection(vrt, parent); + } + +private: +/// check if global attachment was declared + void check_attachment() { + typedef Attachment NPSurfParam; + if (!GlobalAttachments::is_declared("npSurfParams")) + GlobalAttachments::declare_attachment("npSurfParams", true); + } + + +/// helper method to attach surface parameters and do a consistency check + void attach_surf_params() { + check_attachment(); + + Grid& grid = this->geometry()->grid(); + + // make sure attachment was declared + UG_COND_THROW(!GlobalAttachments::is_declared("npSurfParams"), "GlobalAttachment 'npSurfParams' not declared."); + m_aSurfParams = GlobalAttachments::attachment >("npSurfParams"); + + // make sure surfaceParams attachment is attached + UG_COND_THROW(!grid.has_vertex_attachment(m_aSurfParams), + "No surface parameter attachment for neurite projector attached to grid."); + m_aaSurfParams.access(grid, m_aSurfParams); + + // handle attachment values also on higher grid levels (if required) + MultiGrid* mg = dynamic_cast(&grid); + if (mg) { + SmartPtr spMG(mg); + + // never destroy the grid from here - we did not create it + ++(*spMG.refcount_ptr()); + + // attach copy attachment handler to propagate attachment to higher levels + m_cah.set_attachment(m_aSurfParams); + m_cah.set_grid(spMG); + } + } + + + template + number perform_projection(Vertex* vrt, TElem* parent) + { + // calculate the new position by linear interpolation and project that point + // onto the cylinder. + typename TElem::ConstVertexArray vrts = parent->vertices(); + size_t numVrts = parent->num_vertices(); + + if(numVrts == 0){ + set_pos(vrt, vector3(0, 0, 0)); + return 1; + } + + number avDist = 0; + vector3 parentCenter (0, 0, 0); + + for(size_t i = 0; i < numVrts; ++i){ + vector3 p = pos(vrts[i]); + avDist += DistancePointToRay(p, m_center, m_axis); + parentCenter += p; + } + + avDist /= (number)numVrts; + VecScale(parentCenter, parentCenter, 1. / (number)numVrts); + + vector3 proj, v; + ProjectPointToRay(proj, parentCenter, m_center, m_axis); + VecSubtract(v, parentCenter, proj); + number len = VecLength(v); + if(len > SMALL * avDist){ // if avDist is very small, len may be small, too + VecScale(v, v, avDist/len); + proj += v; + set_pos(vrt, proj); + } + else + set_pos(vrt, parentCenter); + + if (vertex_at_soma_surf(vrt, parent)) + project_to_soma_surface(vrt, parent); + + return 1; + } + + template + bool vertex_at_soma_surf(Vertex* vrt, TElem* parent) { + size_t numSomaVerts = 0; + size_t nVrt = parent->num_vertices(); + for (size_t i = 0; i < nVrt; ++i) { + if(m_aaSurfParams[parent->vertex(i)].axial == -1.0) { + numSomaVerts++; + } + } + return numSomaVerts >= 2; + } + + template + void project_to_soma_surface(Vertex* vrt, TElem* parent) { + /// old vertex position + vector3 v0 = this->pos(vrt); + /// 1. P = (x',y',z') = (x - x0, y - y0, z - z0) + vector3 P; + VecSubtract(P, v0, m_soma); + /// 2. |P| = sqrt(x'^2 + y'^2 + z'^2) + number Plength = VecLength(P); + /// 3. Q = (radius/|P|)*P + vector3 Q = P; + VecScale(Q, P, m_somaRad / Plength); + /// 4. R = Q + (x0,y0,z0) + vector3 R; + VecAdd(R, Q, m_soma); + /// 5. Set new position + set_pos(vrt, R); + /// 6. set the surface parameters for the new vertex + m_aaSurfParams[vrt].axial = -1; + } + + + friend class boost::serialization::access; + + template + void serialize( Archive& ar, const unsigned int version) + { + ar & make_nvp("center", m_center); + ar & make_nvp("axis", m_axis); + ar & make_nvp("soma", m_soma);; + ar & make_nvp("somaRad", m_somaRad);; + UG_EMPTY_BASE_CLASS_SERIALIZATION(SomaProjector, RefinementProjector); + } + + vector3 m_center; + vector3 m_axis; + vector3 m_soma; + number m_somaRad; +}; + +}// end of namespace + +#endif //__H__UG_cylinder_soma_projector diff --git a/ugbase/lib_grid/refinement/ref_mark_adjusters/mg_hnode_adjuster.cpp b/ugbase/lib_grid/refinement/ref_mark_adjusters/mg_hnode_adjuster.cpp index 34b21e35e..2da23aa3a 100644 --- a/ugbase/lib_grid/refinement/ref_mark_adjusters/mg_hnode_adjuster.cpp +++ b/ugbase/lib_grid/refinement/ref_mark_adjusters/mg_hnode_adjuster.cpp @@ -97,13 +97,16 @@ ref_marks_changed(IRefiner& ref, // we have to mark all associated edges, faces and volumes mg.associated_elements(assEdges, vrt); for(size_t i = 0; i < assEdges.size(); ++i) - ref.mark(assEdges[i]); + if (ref.get_mark(assEdges[i]) == RM_NONE) // might already be marked RM_CLOSURE, do not overwrite + ref.mark(assEdges[i]); mg.associated_elements(assFaces, vrt); for(size_t i = 0; i < assFaces.size(); ++i) - ref.mark(assFaces[i]); + if (ref.get_mark(assFaces[i]) == RM_NONE) + ref.mark(assFaces[i]); mg.associated_elements(assVols, vrt); for(size_t i = 0; i < assVols.size(); ++i) - ref.mark(assVols[i]); + if (ref.get_mark(assVols[i]) == RM_NONE) + ref.mark(assVols[i]); } else if(ref.get_mark(vrt) != RM_DUMMY){ // we don't have to select parents of dummy vertices, since we assume diff --git a/ugbase/lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.cpp b/ugbase/lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.cpp new file mode 100644 index 000000000..a38d550b7 --- /dev/null +++ b/ugbase/lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2015: G-CSC, Goethe University Frankfurt + * Author: Markus Breit + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#include "shadow_copy_adjuster.h" + + +namespace ug { + + +ShadowCopyAdjuster::~ShadowCopyAdjuster() +{} + + +void ShadowCopyAdjuster:: ref_marks_changed +( + IRefiner& ref, + const std::vector& vrts, + const std::vector& edges, + const std::vector& faces, + const std::vector& vols +) +{ + Grid::face_traits::secure_container fl; + const size_t nv = vols.size(); + for (size_t i = 0; i < nv; ++i) + { + Volume* vol = vols[i]; + + if (!ref.marked_full(vol)) + continue; + + bool allSidesRefineable = true; + ref.grid()->associated_elements(fl, vol); + const size_t flSz = fl.size(); + for (size_t j = 0; j < flSz; ++j) + { + Face* f = fl[j]; + RefinementMark curMark = ref.get_mark(f); + if (!ref.mark(f, RM_FULL)) + { + ref.mark(f, curMark); + allSidesRefineable = false; + break; + } + ref.mark(f, curMark); + } + + if (!allSidesRefineable) + ref.mark(vol, RM_CLOSURE); + } + + Grid::edge_traits::secure_container el; + const size_t nf = faces.size(); + for (size_t i = 0; i < nf; ++i) + { + Face* f = faces[i]; + + if (!ref.marked_full(f)) + continue; + + bool allSidesRefineable = true; + ref.grid()->associated_elements(el, f); + const size_t elSz = el.size(); + for (size_t j = 0; j < elSz; ++j) + { + Edge* e = el[j]; + RefinementMark curMark = ref.get_mark(e); + if (!ref.mark(e, RM_FULL)) + { + ref.mark(e, curMark); + allSidesRefineable = false; + break; + } + ref.mark(e, curMark); + } + + if (!allSidesRefineable) + ref.mark(f, RM_CLOSURE); + } +} + + +} // namespace ug + + diff --git a/ugbase/lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.h b/ugbase/lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.h new file mode 100644 index 000000000..70ac03491 --- /dev/null +++ b/ugbase/lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2015: G-CSC, Goethe University Frankfurt + * Author: Markus Breit + * + * This file is part of UG4. + * + * UG4 is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 3 (as published by the + * Free Software Foundation) with the following additional attribution + * requirements (according to LGPL/GPL v3 §7): + * + * (1) The following notice must be displayed in the Appropriate Legal Notices + * of covered and combined works: "Based on UG4 (www.ug4.org/license)". + * + * (2) The following notice must be displayed at a prominent place in the + * terminal output of covered works: "Based on UG4 (www.ug4.org/license)". + * + * (3) The following bibliography is recommended for citation and must be + * preserved in all covered files: + * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively + * parallel geometric multigrid solver on hierarchically distributed grids. + * Computing and visualization in science 16, 4 (2013), 151-164" + * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * flexible software system for simulating pde based models on high performance + * computers. Computing and visualization in science 16, 4 (2013), 165-179" + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef __H__UG_shadow_copy_adjuster +#define __H__UG_shadow_copy_adjuster + +#include "../ref_mark_adjuster_interface.h" + +namespace ug { + + +/** + * @brief Adjusts RM_FULL-selected quadrilaterals that cannot be fully refined. + * + * In a multigrid with SHADOW-COPY elements (created, e.g., by anisotropic adaptive + * refinement), it can happen that a surface quadrilateral with a SHADOW_COPY side + * is marked for full refinement. + * But that cannot take place because the SHADOW-COPY side is already copy-refined. + * This can be solved if the element is marked RM_CLOSURE instead and its + * SHADOW_COPY edge as well. + */ +class ShadowCopyAdjuster : public IRefMarkAdjuster +{ + public: + virtual ~ShadowCopyAdjuster(); + + virtual void ref_marks_changed + ( + IRefiner& ref, + const std::vector& vrts, + const std::vector& edges, + const std::vector& faces, + const std::vector& vols + ); +}; + +} // namespace ug + +#endif //__H__UG_shadow_copy_adjuster diff --git a/ugbase/lib_grid/refinement/unmaintained/hanging_node_refiner_2d_irn.cpp b/ugbase/lib_grid/refinement/unmaintained/hanging_node_refiner_2d_irn.cpp index 492b8c628..409c6c723 100644 --- a/ugbase/lib_grid/refinement/unmaintained/hanging_node_refiner_2d_irn.cpp +++ b/ugbase/lib_grid/refinement/unmaintained/hanging_node_refiner_2d_irn.cpp @@ -1451,7 +1451,7 @@ void HangingNodeRefiner2D_IRN::refine_volume_with_normal_vertex(Volume* v) vNewVrt = *grid.create(f); // assign a new position if(m_aaPos.valid()) - m_aaPos[vNewVrt] = CalculateFaceCenter(f, m_aaPos); + m_aaPos[vNewVrt] = CalculateCenter(f, m_aaPos); } */ // refine the volume and register new volumes at the grid. diff --git a/ugbase/lib_grid/tools/copy_attachment_handler.h b/ugbase/lib_grid/tools/copy_attachment_handler.h index 03631255c..cf779fd5a 100644 --- a/ugbase/lib_grid/tools/copy_attachment_handler.h +++ b/ugbase/lib_grid/tools/copy_attachment_handler.h @@ -33,6 +33,10 @@ #ifndef LIB_GRID__COPY_ATTACHMENT_HANDLER_H_ #define LIB_GRID__COPY_ATTACHMENT_HANDLER_H_ +#include "common/util/smart_pointer.h" // for SmartPtr +#include "lib_grid/grid/grid_observer.h" // for GridObserver +#include "lib_grid/multi_grid.h" // for MultiGrid + #ifdef UG_PARALLEL #include "lib_grid/parallelization/util/compol_copy_attachment.h" // ComPol_CopyAttachment #include "lib_grid/parallelization/distributed_grid.h" // DistributedGridManager @@ -99,7 +103,8 @@ class CopyAttachmentHandler : public GridObserver { public: /// constructor - CopyAttachmentHandler() {} + CopyAttachmentHandler() + : m_bEnableVertComm(true) {} /// destructor virtual ~CopyAttachmentHandler() @@ -152,6 +157,12 @@ class CopyAttachmentHandler : public GridObserver propagate_to_levels(); } + void enable_vertical_communication(bool b) + { + m_bEnableVertComm = b; + } + + // GridObserver implementations virtual void vertex_created ( @@ -272,10 +283,10 @@ class CopyAttachmentHandler : public GridObserver void propagate_to_levels() { - // yes, "<=" is what we want here! - // this ensures a final vertical communication on the top level - for (size_t i = 1; i <= m_spMG->num_levels(); ++i) - propagate_to_level(i); + // ensure a final vertical communication on the top level + const size_t nProp = m_bEnableVertComm ? m_spMG->num_levels() + 1 : m_spMG->num_levels(); + for (size_t i = 1; i < nProp; ++i) + propagate_to_level(i, m_bEnableVertComm); } void propagate_to_level(size_t lvl, bool vertComm = true) @@ -318,6 +329,8 @@ class CopyAttachmentHandler : public GridObserver /// multigrid SmartPtr m_spMG; + bool m_bEnableVertComm; + /// attachment to be handled TAttachment m_a; diff --git a/ugbase/lib_grid/tools/periodic_boundary_manager_impl.hpp b/ugbase/lib_grid/tools/periodic_boundary_manager_impl.hpp index fc522a843..1c83dfc07 100644 --- a/ugbase/lib_grid/tools/periodic_boundary_manager_impl.hpp +++ b/ugbase/lib_grid/tools/periodic_boundary_manager_impl.hpp @@ -587,8 +587,8 @@ void IdentifySubsets(TDomain& dom, const char* sName1, const char* sName2) { int si2 = sh.get_subset_index(sName2); #ifdef UG_PARALLEL - if(pcl::NumProcs() > 1) - UG_THROW("sorry, in real parallel environment periodic bnds are not impled yet.") + //if(pcl::NumProcs() > 1) + // UG_THROW("sorry, in real parallel environment periodic bnds are not impled yet."); #endif if (si1 == -1) @@ -604,8 +604,8 @@ template void IdentifySubsets(TDomain& dom, int sInd1, int sInd2) { #ifdef UG_PARALLEL - if(pcl::NumProcs() > 1) - UG_THROW("sorry, in real parallel environment periodic bnds are not impled yet.") + //if(pcl::NumProcs() > 1) + // UG_THROW("sorry, in real parallel environment periodic bnds are not impled yet."); #endif if (sInd1 == -1 || sInd2 == -1) { diff --git a/ugbase/lib_grid/tools/subset_group.h b/ugbase/lib_grid/tools/subset_group.h index 3276ae466..97679383e 100644 --- a/ugbase/lib_grid/tools/subset_group.h +++ b/ugbase/lib_grid/tools/subset_group.h @@ -90,7 +90,7 @@ class SubsetGroup /// adds all subsets of another subset to the group void add(const SubsetGroup& ssGroup); - /// select all subsets of underlying subset + /// select all subsets of underlying subset handler void add_all(); /// removes a subset from this group diff --git a/ugbase/lib_grid/tools/surface_view_impl.hpp b/ugbase/lib_grid/tools/surface_view_impl.hpp index 37b4e504e..31bcaa804 100644 --- a/ugbase/lib_grid/tools/surface_view_impl.hpp +++ b/ugbase/lib_grid/tools/surface_view_impl.hpp @@ -542,7 +542,7 @@ collect_associated(std::vector& vAssElem, CollectAssociated(vCoarseElem, *m_pMG, elem, true); for(size_t i = 0; i < vCoarseElem.size(); ++i) { - if(!is_contained(vCoarseElem[i], gl, SURFACE)) continue; + if(!is_contained(vCoarseElem[i], gl, ALL)) continue; vAssElem.push_back(vCoarseElem[i]); } } @@ -567,6 +567,38 @@ collect_associated(std::vector& vAssElem, vAssElem.push_back(vCoarseElem[i]); } } + +// alternative implementation taking into account possible SHADOW_RIM_COPY elem. +#if 0 + // collect associated on this level + if (is_contained(elem, gl, ALL)) + { + std::vector vCoarseElem; + CollectAssociated(vCoarseElem, *m_pMG, elem, true); + for (size_t i = 0; i < vCoarseElem.size(); ++i) + if (is_contained(vCoarseElem[i], gl, ALL)) + vAssElem.push_back(vCoarseElem[i]); + } + + // if at border of a grid level, there may be connections of a "shadow-rim-copy" element + // to surface elements on the finer level. These must be taken into account. + if (is_contained(elem, gl, SHADOW_RIM_COPY)) + { + if (m_pMG->num_children(elem) > 0) + { + TElem* child = m_pMG->get_child(elem, 0); + if (is_contained(child, gl, SURFACE_RIM)) + { + // get connected elements + std::vector vFineElem; + CollectAssociated(vFineElem, *m_pMG, child, true); + for (size_t i = 0; i < vFineElem.size(); ++i) + if (is_contained(vFineElem[i], gl, ALL)) + vAssElem.push_back(vFineElem[i]); + } + } + } +#endif } diff --git a/ugbase/pcl/parallel_archive.h b/ugbase/pcl/parallel_archive.h index 7e226c0f5..657425f1c 100644 --- a/ugbase/pcl/parallel_archive.h +++ b/ugbase/pcl/parallel_archive.h @@ -154,7 +154,7 @@ class ParallelArchive ParallelArchive(std::string filename, pcl::ProcessCommunicator pc = pcl::ProcessCommunicator(pcl::PCD_WORLD)) : m_filename(filename), m_pc(pc) { - m_bWritten=false; + m_bWritten = false; m_bUnsafe = false; } @@ -168,7 +168,13 @@ class ParallelArchive { if(!m_bWritten) { - UG_COND_THROW(m_bUnsafe, "use ParallelArchive::write when using add_raw.") + if (m_bUnsafe) + { + UG_LOGN("ParallelArchive: Cannot write from destructor when using add_raw.\n" + "Use the write() method when using add_raw."); + return; + } + write(); } } diff --git a/ugbase/pcl/pcl_process_communicator.cpp b/ugbase/pcl/pcl_process_communicator.cpp index fdadbe180..1182d41e8 100644 --- a/ugbase/pcl/pcl_process_communicator.cpp +++ b/ugbase/pcl/pcl_process_communicator.cpp @@ -715,7 +715,7 @@ void ProcessCommunicator::broadcast(size_t &s, int root) const { if(is_local()) return; unsigned long l = s; - broadcast(l); + broadcast(l, root); s = l; } diff --git a/ugbase/ug_shell/CMakeLists.txt b/ugbase/ug_shell/CMakeLists.txt index 0117cdb24..401994d79 100644 --- a/ugbase/ug_shell/CMakeLists.txt +++ b/ugbase/ug_shell/CMakeLists.txt @@ -161,6 +161,13 @@ include_directories(${ug4libIncludes}) get_property(ug4LinkPaths GLOBAL PROPERTY ugLinkPaths) link_directories(${ug4LinkPaths}) +get_property(ug4Definitions GLOBAL PROPERTY ugDefinitions) +add_definitions(${ug4Definitions}) + +get_property(ug4LinkerFlags GLOBAL PROPERTY ugLinkerFlags) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ug4LinkerFlags}") + + add_executable(${targetExecutableName} ${srcUGShell}) if("${SHELLTYPE}" STREQUAL "readline") diff --git a/ugbase/ug_shell/completion.cpp b/ugbase/ug_shell/completion.cpp index 5244cf18b..8d605794c 100644 --- a/ugbase/ug_shell/completion.cpp +++ b/ugbase/ug_shell/completion.cpp @@ -43,6 +43,7 @@ #include "bridge/bridge.h" #include "bindings/lua/info_commands.h" #include "bindings/lua/lua_stack_check.h" +#include "common/log.h" #include "registry/registry.h" #include "registry/class_helper.h" @@ -66,9 +67,9 @@ int iOtherCompletitionsLength; const char **pOtherCompletitions=NULL; -void print(std::string s) +void print(const std::string& s) { - print(s.c_str()); + printf("%s", s.c_str()); } /// \addtogroup ugbase_ugshell From 8eba3bf5e7d8d743cbf764ccb7c996570590d613 Mon Sep 17 00:00:00 2001 From: Susanne Date: Mon, 23 Sep 2019 16:32:10 +0200 Subject: [PATCH 4/4] final cleaning --- scripts/util/conv_rates_static.lua | 762 ++++++++++ scripts/util/domain_disc_util.lua | 1 + .../bridge/disc_bridges/integrate_bridge.cpp | 1 + ugbase/lib_disc/function_spaces/integrate.h | 618 +++++++- .../function_spaces/integrate_tools.h | 1322 +++++++++++++++++ .../spatial_disc/disc_util/fv1Cut_geom.cpp | 4 +- .../spatial_disc/disc_util/fv1Cut_geom.h | 231 ++- .../spatial_disc/disc_util/fv1FT_geom.cpp | 3 +- .../spatial_disc/disc_util/fv1FT_geom.h | 5 +- .../elem_disc/elem_disc_assemble_util.h | 9 +- .../spatial_disc/immersed_util/Info File 1 | 27 +- .../spatial_disc/immersed_util/Info File 2 | 70 + .../cut_element_handler/Info File 1 | 35 +- .../cut_element_handler/Info File 2 | 36 +- .../cut_element_handler/cut_element_handler.h | 1304 +++++++++------- .../cut_element_handler_FT.h | 0 .../cut_element_handler_base_impl.h | 444 +++++- .../cut_element_handler_flat_top_impl.h | 177 +-- .../cut_element_handler_immersed.h | 0 .../cut_element_handler_two_sided_impl.h | 23 +- .../immersed_util/gmg_transfer/Info File | 11 + .../gmg_transfer/particle_transfer.h | 8 +- .../gmg_transfer/particle_transfer_impl.h | 134 +- .../immersed_util/immersed_interface_base.h | 29 +- .../immersed_interface_base_impl.h | 28 +- .../interface_handler/Info File 1 | 4 +- .../interface_handler/Info File 2 | 103 ++ .../interface_handler_base.h | 193 ++- .../interface_handler_base_impl.h | 80 +- .../interface_handler_base_tools.h | 1083 +++----------- .../interface_handler_flat_top_cut/Info File | 8 + .../interface_handler_particle.h | 245 +-- .../interface_handler_particle_impl.h | 148 +- .../interface_handler_particle_tools.h | 1105 +------------- .../interface_handler_two_sided_cut/Info File | 20 +- .../interface_handler_diffusion.h | 516 ++++--- .../interface_handler_diffusion_impl.h | 706 +++------ .../interface_handler_diffusion_tools.h | 221 +-- .../interface_handler_diffusion_user_data.h | 53 - .../interface_provider_base.h | 47 +- .../interface_provider_diffusion.h | 61 +- .../interface_provider_particle.h | 1134 +++----------- ...interface_provider_particle_ellipse_impl.h | 402 ++++- .../interface_provider_particle_sphere_impl.h | 292 +++- 44 files changed, 6418 insertions(+), 5285 deletions(-) create mode 100644 scripts/util/conv_rates_static.lua create mode 100644 ugbase/lib_disc/function_spaces/integrate_tools.h delete mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT.h delete mode 100644 ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed.h diff --git a/scripts/util/conv_rates_static.lua b/scripts/util/conv_rates_static.lua new file mode 100644 index 000000000..a8dc2f469 --- /dev/null +++ b/scripts/util/conv_rates_static.lua @@ -0,0 +1,762 @@ +-- Copyright (c) 2013-2014: G-CSC, Goethe University Frankfurt +-- Author: Andreas Vogel +-- +-- This file is part of UG4. +-- +-- UG4 is free software: you can redistribute it and/or modify it under the +-- terms of the GNU Lesser General Public License version 3 (as published by the +-- Free Software Foundation) with the following additional attribution +-- requirements (according to LGPL/GPL v3 §7): +-- +-- (1) The following notice must be displayed in the Appropriate Legal Notices +-- of covered and combined works: "Based on UG4 (www.ug4.org/license)". +-- +-- (2) The following notice must be displayed at a prominent place in the +-- terminal output of covered works: "Based on UG4 (www.ug4.org/license)". +-- +-- (3) The following bibliography is recommended for citation and must be +-- preserved in all covered files: +-- "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively +-- parallel geometric multigrid solver on hierarchically distributed grids. +-- Computing and visualization in science 16, 4 (2013), 151-164" +-- "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel +-- flexible software system for simulating pde based models on high performance +-- computers. Computing and visualization in science 16, 4 (2013), 165-179" +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Lesser General Public License for more details. + +util = util or {} +util.rates = util.rates or {} +util.rates.static = util.rates.static or {} + +ug_load_script("util/persistence.lua") + +-------------------------------------------------------------------------------- +-- Std Functions (used as defaults) +-------------------------------------------------------------------------------- + +function util.rates.static.StdPrepareInitialGuess(u, lev, minLev, maxLev, + domainDisc, solver) + + if lev > minLev then + Prolongate(u[lev], u[lev-1]); + write(">> Solution interpolated as start value from coarser level.\n") + else + u[lev]:set(0.0) + write(">> Solution set to zero on coarsest level.\n") + end +end + + +function util.rates.static.StdComputeLinearSolution(u, domainDisc, solver) + + -- create operator from discretization + local A = AssembledLinearOperator(domainDisc) + local b = u:clone() + write(">> Algebra created.\n") + + -- 1. init operator + domainDisc:assemble_linear(A, b) + write(">> Matrix and Rhs assembled.\n") + + -- 2. set dirichlet values in start iterate + domainDisc:adjust_solution(u) + write(">> Inital guess for solution prepared.\n") + + -- 3. init solver for linear Operator + solver:init(A, u) + write(">> Linear Solver initialized.\n") + + -- 4. apply solver + if solver:apply_return_defect(u, b) ~= true then + write(">> Linear solver failed. Aborting."); exit(); + end +end + +function util.rates.static.StdComputeNonLinearSolution(u, domainDisc, solver) + + solver:init(AssembledOperator(domainDisc, u:grid_level())) + if solver:apply(u) == false then + print (">> Newton solver apply failed."); exit(); + end + write(">> Newton Solver done.\n") +end + +function util.rates.static.StdMaxLevelPadding(p) + return math.floor(p/2) +end + +function util.rates.static.StdMinLevelPadding(p) + return 0 +end + + +function util.rates.static.NoMaxLevelPadding(p) + return 0 +end + +function util.rates.static.NoMinLevelPadding(p) + return 0 +end + +-------------------------------------------------------------------------------- +-- Label names +-------------------------------------------------------------------------------- + +util.rates.static.StdLabel = util.rates.static.StdLabel or {} + +function util.rates.static.StdLabel.MeasLatexP(disc, p) + return disc.." $\\mathbb{P}_{"..p.."}$" +end + +function util.rates.static.StdLabel.MeasLatexQ(disc, p) + return disc.." $\\mathbb{Q}_{"..p.."}$" +end + +function util.rates.static.StdLabel.XLatex(x) + local gpXLabel ={ DoFs = "Anzahl Unbekannte", h = "h (Gitterweite)"} + return gpXLabel[x] +end + +function util.rates.static.StdLabel.YLatex(f, t, n) + local gpType = { ["l-exact"] = "{}", + ["l-lmax"] = "h_{\\text{min}}", + ["l-prev"] = "{h/2}", + } + local gpNorm = { l2 = "L_2", h1 = "H^1"} + + if t == "interpol" then + return "$\\norm{\\mathcal{I}_h("..f..") - "..f.."}_{"..gpNorm[n].."}$" + else + return "$\\norm{"..f.."_h - "..f.."_{"..gpType[t].."} }_{ "..gpNorm[n].."}$" + end +end + +function util.rates.static.StdLabel.MeasPdfP(disc, p) + return disc.." $P_"..p.."$" +end + +function util.rates.static.StdLabel.MeasPdfQ(disc, p) + return disc.." $Q_"..p.."$" +end + +function util.rates.static.StdLabel.XPdf(x) + local gpXLabel ={ DoFs = "Anzahl Unbekannte", h = "h (Gitterweite)"} + return gpXLabel[x] +end + +function util.rates.static.StdLabel.YPdf(f, t, n) + local gpType = { ["l-exact"] = "{}", + ["l-lmax"] = "h_{\\text{min}}", + ["l-prev"] = "{h/2}", + } + local gpNorm = { l2 = "L_2", h1 = "H^1"} + + if t == "interpol" then + return "$|| I_h("..f..") - "..f.." ||_{"..gpNorm[n].."}$" + else + return "$|| "..f.."_h - "..f.."_{"..gpType[t].."} ||_{"..gpNorm[n].."}$" + end +end + +-------------------------------------------------------------------------------- +-- util.rates.static.compute (main-function) +-------------------------------------------------------------------------------- + +--[[! +Computes convergence rates for a static problem + +In the convergence rate setup the following parameters can be passed: +- (required) CreateDomain() + function used to create Domain +- (required) CreateApproxSpace(dom, discType, p) + function used to create ApproximationSpace +- (required) CreateDomainDisc(approxSpace, discType, p) + function used to create Domain Discretization +- (required) CreateSolver(approxSpace, discType, p) + function used to create Solver +- (required) DiscTypes + Array containing types, orders and level to be looped +- (optional) ComputeSolution(u, domainDisc, solver) + function used to compute solution +- (optional) PrepareInitialGuess + function used to prepare Initial Guess +- (optional) ExactSol + Array containing exact solution as a function +- (optional) ExactGrad + Array containing exact gradients as a function + +@param ConvRate Setup setup used +]]-- +function util.rates.static.compute(ConvRateSetup) + + -- check passed param + local CRS + if ConvRateSetup == nil then print("No setup passed."); exit() + else CRS = ConvRateSetup end + + -- create directories + local plotPath = CRS.plotPath or "plots/" + local solPath = CRS.solPath or "sol/" + local dataPath = CRS.dataPath or "data/" + + local gpOptions = CRS.gpOptions or + { + grid = true, + logscale = true, + mtics = true + } + + -- check for methods + local PrepareInitialGuess = CRS.PrepareInitialGuess or util.rates.static.StdPrepareInitialGuess + local ComputeSolution = CRS.ComputeSolution or util.rates.static.StdComputeLinearSolution + local CreateApproxSpace = CRS.CreateApproxSpace + local CreateDomainDisc = CRS.CreateDomainDisc + local CreateSolver = CRS.CreateSolver + local CreateDomain = CRS.CreateDomain + local MaxLevelPadding = CRS.MaxLevelPadding or util.rates.static.StdMaxLevelPadding + local MinLevelPadding = CRS.MinLevelPadding or util.rates.static.StdMinLevelPadding + + if CreateApproxSpace == nil or CreateDomainDisc == nil or + CreateSolver == nil or CreateDomain == nil then + print("You must pass: CreateApproxSpace, CreateDomainDisc, CreateSolver, CreateDomain") + exit() + end + + local DiscTypes = CRS.DiscTypes + + local maxlevel = CRS.maxlevel; if maxlevel == nil then maxlevel = true end + local prevlevel = CRS.prevlevel; if prevlevel == nil then prevlevel = true end + local exact = CRS.exact; if exact == nil then exact = true end + local interpol = CRS.interpol; if interpol == nil then interpol = true end + local plotSol = CRS.plotSol; if plotSol == nil then plotSol = false end + + local ExactSol = CRS.ExactSol + local ExactGrad = CRS.ExactGrad + local PlotCmps = CRS.PlotCmps + + local MeasLabel = CRS.MeasLabel or util.rates.static.StdLabel.MeasLatexP + local XLabel = CRS.XLabel or util.rates.static.StdLabel.XLatex + local YLabel = CRS.YLabel or util.rates.static.StdLabel.YLatex + + -------------------------------------------------------------------- + -- Loop Discs + -------------------------------------------------------------------- + + local function ensureDir(name) + if not(DirectoryExists(name)) then CreateDirectory(name) end + end + + if plotSol then ensureDir(solPath) end + + -- compute element size + local dom = CreateDomain() + local numRefs = dom:grid():num_levels() - 1; + + -- to store measurement + local gpData = {}; + local errors = {}; + + for _, DiscType in ipairs(DiscTypes) do + + local disc = DiscType.type + if disc == nil then print("type required."); exit(); end + + local pmin = DiscType.pmin or 1 + local pmax = DiscType.pmax or 1 + local lmin = DiscType.lmin or 0 + local lmax = DiscType.lmax or numRefs + + if lmin > lmax then print("lmin: "..lmin.." must be less or equal lmax: "..lmax); exit(); end + if lmax > numRefs then print("lmax: "..lmax.." must be less or equal numRefs: "..numRefs); exit(); end + + errors[disc] = errors[disc] or {} + + for p = pmin, pmax do + + errors[disc][p] = errors[disc][p] or {} + + local maxLev = lmax - MaxLevelPadding(p) + local minLev = lmin + MinLevelPadding(p) + + -------------------------------------------------------------------- + -- Print Setup + -------------------------------------------------------------------- + + print("\n") + print(">> -------------------------------------------------------------------") + print(">> Computing solutions and error norms of the following problem") + print(">> -------------------------------------------------------------------") + print(">> dim = " .. dim) + print(">> grid = " .. gridName) + print(">> minLev = " .. minLev) + print(">> maxLev = " .. maxLev) + print(">> type = " .. disc) + print(">> order = " .. p) + print("\n") + + -------------------------------------------------------------------- + -- Create ApproxSpace, Disc and Solver + -------------------------------------------------------------------- + + print(">> Create ApproximationSpace: "..disc..", "..p) + local approxSpace = CreateApproxSpace(dom, disc, p) + + print(">> Create Domain Disc: "..disc..", "..p) + local domainDisc = CreateDomainDisc(approxSpace, disc, p) + + print(">> Create Solver") + local solver = CreateSolver(approxSpace, disc, p) + + -- get names in approx space + local SpaceCmp = approxSpace:names() + + -- per default compute each Space-cmp + if PlotCmps == nil then + PlotCmps = {} + for f = 1,#SpaceCmp do + PlotCmps[SpaceCmp[f]] = {SpaceCmp[f]} + end + end + + -- check functions to measure + for _,Cmps in pairs(PlotCmps) do + for _, cmp in pairs(Cmps) do + if not table.contains(SpaceCmp, cmp) then + print("Cmp: '"..cmp.."' not contained in ApproxSpace."); + exit() + end + end + end + + -------------------------------------------------------------------- + -- Create Solutions on each level + -------------------------------------------------------------------- + + write(">> Allocating storage for solution vectors.\n") + local u = {} + for lev = minLev, maxLev do + u[lev] = GridFunction(approxSpace, lev) + end + + -------------------------------------------------------------------- + -- Compute Solution on each level + -------------------------------------------------------------------- + --local solver = nil + if exact or maxlevel or prevlevel then + for lev = minLev, maxLev do + write("\n>> Computing Level "..lev..", "..disc..", "..p..".\n") + + write(">> Preparing inital guess on level "..lev..".\n") + --solver = CreateSolver(approxSpace, disc, p) + PrepareInitialGuess(u, lev, minLev, maxLev, domainDisc, solver, approxSpace, disc, p) + + write(">> Start: Computing solution on level "..lev..".\n") + --solver = CreateSolver(approxSpace, disc, p) + ComputeSolution(u[lev], domainDisc, solver) + write(">> End: Solver done.\n") + + if plotSol then + WriteGridFunctionToVTK(u[lev], solPath.."sol_"..disc..p.."_l"..lev) + write(">> Solution written to: "..solPath.."sol_"..disc..p.."_l"..lev.."\n"); + end + end + end + + approxSpace, domainDisc, solver = nil, nil, nil + collectgarbage() + + -------------------------------------------------------------------- + -- Compute Error Norms on each level + -------------------------------------------------------------------- + + -- prepare error measurement + local err = errors[disc][p] + err.h, err.DoFs, err.level = {}, {}, {} + for lev = minLev, maxLev do + err.h[lev] = MaxElementDiameter(dom, lev) + err.level[lev] = lev + err.DoFs[lev] = u[lev]:num_dofs() + end + + -- loop levels and compute error + for lev = maxLev, minLev, -1 do + write("\n>> Error Norm values on Level "..lev..".\n") + + local quadOrder = p*p+3 + write(">> #DoF on Level "..lev.." is "..err.DoFs[lev] .."\n"); + + -- compute for each component + for f, Cmps in pairs(PlotCmps) do + + -- create component + err[f] = err[f] or {} + + -- help fct to create an measurement + local function createMeas(f, t, n) + err[f][t] = err[f][t] or {} + err[f][t][n] = err[f][t][n] or {} + err[f][t][n].value = err[f][t][n].value or {} + return err[f][t][n].value + end + + -- check for exact solution and grad + local solAvail, gradAvail = true, true + for _,cmp in pairs(Cmps) do + if ExactSol == nil or ExactSol[cmp] == nil then solAvail = false end + if ExactGrad == nil or ExactGrad[cmp] == nil then gradAvail = false end + end + + -- w.r.t exact solution + if exact and solAvail then + local value = createMeas(f, "l-exact", "l2") + value[lev] = 0.0 + for _,cmp in pairs(Cmps) do + value[lev] = value[lev] + math.pow(L2Error(ExactSol[cmp], u[lev], cmp, 0.0, quadOrder), 2) + end + value[lev] = math.sqrt(value[lev]) + write(">> L2 l-exact for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); + + if gradAvail then + local value = createMeas(f, "l-exact", "h1") + value[lev] = 0.0 + for _,cmp in pairs(Cmps) do + value[lev] = value[lev] + math.pow(H1Error(ExactSol[cmp], ExactGrad[cmp], u[lev], cmp, 0.0, quadOrder), 2) + end + value[lev] = math.sqrt(value[lev]) + write(">> H1 l-exact for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); + end + end + + if interpol and solAvail then + local uExact = u[lev]:clone() + for _,cmp in pairs(Cmps) do + Interpolate(ExactSol[cmp], uExact, cmp) + end + + local value = createMeas(f, "interpol", "l2") + value[lev] = 0.0 + for _,cmp in pairs(Cmps) do + value[lev] = value[lev] + math.pow(L2Error(ExactSol[cmp], uExact, cmp, 0.0, quadOrder), 2) + end + value[lev] = math.sqrt(value[lev]) + write(">> L2 interpol for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); + + if gradAvail then + local value = createMeas(f, "interpol", "h1") + value[lev] = 0.0 + for _,cmp in pairs(Cmps) do + value[lev] = value[lev] + math.pow(H1Error(ExactSol[cmp], ExactGrad[cmp], uExact, cmp, 0.0, quadOrder), 2) + end + value[lev] = math.sqrt(value[lev]) + write(">> H1 interpol for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); + end + + uExact = nil + end + + -- w.r.t max level solution + if maxlevel and lev < maxLev then + local value = createMeas(f, "l-lmax", "l2") + value[lev] = 0.0 + for _,cmp in pairs(Cmps) do + value[lev] = value[lev] + math.pow(L2Error(u[maxLev], cmp, u[lev], cmp, quadOrder), 2) + end + value[lev] = math.sqrt(value[lev]) + write(">> L2 l-lmax for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); + + local value = createMeas(f, "l-lmax", "h1") + value[lev] = 0.0 + for _,cmp in pairs(Cmps) do + value[lev] = value[lev] + math.pow(H1Error(u[maxLev], cmp, u[lev], cmp, quadOrder), 2) + end + value[lev] = math.sqrt(value[lev]) + write(">> H1 l-lmax for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); + end + + -- w.r.t previous level solution + if prevlevel and lev < maxLev then + local value = createMeas(f, "l-prev", "l2") + value[lev] = 0.0 + for _,cmp in pairs(Cmps) do + value[lev] = value[lev] + math.pow(L2Error(u[lev+1], cmp, u[lev], cmp, quadOrder), 2) + end + value[lev] = math.sqrt(value[lev]) + write(">> L2 l-(l-1) for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); + + local value = createMeas(f, "l-prev", "h1") + value[lev] = 0.0 + for _,cmp in pairs(Cmps) do + value[lev] = value[lev] + math.pow(H1Error(u[lev+1], cmp, u[lev], cmp, quadOrder), 2) + end + value[lev] = math.sqrt(value[lev]) + write(">> H1 l-(l-1) for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); + end + end -- end fct + + end -- end level + + for lev = minLev, maxLev do u[lev] = nil end + u = nil + collectgarbage() + + -------------------------------------------------------------------- + -- Compute Factors and Rates + -------------------------------------------------------------------- + + for f, _ in pairs(PlotCmps) do + for t, _ in pairs(err[f]) do + for n, _ in pairs(err[f][t]) do + + local meas = err[f][t][n] + + meas.fac = meas.fac or {} + meas.rate = meas.rate or {} + + local value = meas.value + local fac = meas.fac + local rate = meas.rate + + for lev, _ in pairs(value) do + if value[lev] ~= nil and value[lev-1] ~= nil then + fac[lev] = value[lev-1]/value[lev] + rate[lev] = math.log(fac[lev]) / math.log(2) + end + end + + end + end + end + + -------------------------------------------------------------------- + -- Write Data to Screen + -------------------------------------------------------------------- + + for f, Cmps in pairs(PlotCmps) do + + write("\n>> Statistic for type: "..disc..", order: "..p..", comp: "..f.." [ ") + for _, cmp in pairs(Cmps) do write(cmp.." ") end + print("]\n") + + local values = {err.level, err.h, err.DoFs} + local heading = {"L", "h", "#DoFs"} + local format = {"%d", "%.2e", "%d"} + + for t, _ in pairs(err[f]) do + for n, _ in pairs(err[f][t]) do + local meas = err[f][t][n] + table.append(values, {meas.value, meas.rate}) + table.append(heading,{n.." "..t, "rate"}) + table.append(format, {"%.2e", "%.3f"}) + end + end + + table.print(values, {heading = heading, format = format, + hline = true, vline = true, forNil = "--"}) + end + + end -- end loop over p + end -- end loop over type + + + -------------------------------------------------------------------- + -- Write gnuplot data + -------------------------------------------------------------------- + + -- the following is serial and one proc doing it is sufficient + if ProcRank() ~= 0 then return end + ensureDir(dataPath) + ensureDir(plotPath) + + -- help fct to create a plot + local plots = {} + local function accessPlot(...) + local keys = arg + local plot = plots + for _, key in ipairs(keys) do + plot[key] = plot[key] or {} + plot = plot[key] + end + return plot + end + + local function getPlot(...) + local plot = accessPlot(...) + local pl = table.ideepcopy( plot ) + pl.label = plot.label + return pl + end + + for disc, _ in pairs(errors) do + for p, _ in pairs(errors[disc]) do + for f, _ in pairs(PlotCmps) do + for t, _ in pairs(errors[disc][p][f]) do + for n, _ in pairs(errors[disc][p][f][t]) do + + -- write l2 and h1 to data file + local file = dataPath..table.concat({"error",disc,p,f,t,n},"_")..".dat" + local cols = {errors[disc][p].DoFs, errors[disc][p].h, errors[disc][p][f][t][n].value} + gnuplot.write_data(file, cols) + + -- store dataset + for xCol, x in ipairs({"DoFs", "h"}) do + local dataset = {label=MeasLabel(disc, p), file=file, style="linespoints", xCol, 3} + local label = { x = XLabel(x), y = YLabel(f,t,n)} + + local function addSet(plot, dataset, label) + table.insert( plot, dataset) + plot.label = label + end + + addSet( accessPlot(disc, p, f, t, n, x), dataset, label) + addSet( accessPlot(disc, f, t, n, x), dataset, label) + addSet( accessPlot("all", f, t, n, x), dataset, label) + end + + end + end + end + end + end + + -------------------------------------------------------------------- + -- Execute Plot of gnuplot + -------------------------------------------------------------------- + + -- one plot + local validP + ensureDir(plotPath.."dataset/") + ensureDir(plotPath.."disc/") + ensureDir(plotPath.."multi/") + for disc, _ in pairs(errors) do + for p, _ in pairs(errors[disc]) do + for f, _ in pairs(PlotCmps) do + for t, _ in pairs(errors[disc][p][f]) do + for n, _ in pairs(errors[disc][p][f][t]) do + for _, x in ipairs({"DoFs", "h"}) do + + -- single dataset + local file = plotPath.."dataset/"..table.concat({disc,p,f,t,n,x},"_") + gpData[file] = getPlot(disc, p, f, t, n, x) + + -- grouping by (disc+p) + local file = plotPath.."disc/"..table.concat({f,disc,t,n,x}, "_") + gpData[file] = getPlot(disc, f, t, n, x) + + -- grouping (all discs+p) + local file = plotPath.."disc/"..table.concat({f,"all",t,n,x}, "_") + gpData[file] = getPlot("all", f, t, n, x) + + + validP = p + end + end + end + end + end + end + + for disc, _ in pairs(errors) do + local p = validP + for f, _ in pairs(PlotCmps) do + for t, _ in pairs(errors[disc][p][f]) do + for n, _ in pairs(errors[disc][p][f][t]) do + for _, x in ipairs({"DoFs", "h"}) do + + -- multi-plot: all discs for one norm + local file = plotPath.."multi/"..table.concat({f,t,n,x}, "_") + gpData[file] = gpData[file] or {} + gpData[file].multiplot = {rows = 1} + table.insert( gpData[file], getPlot(disc, f, t, n, x) ) + + -- multi-plot: all norms for one disc + local file = plotPath.."multi/"..table.concat({f,disc,t,x}, "_") + gpData[file] = gpData[file] or {} + gpData[file].multiplot = {cols = 1} + table.insert( gpData[file], getPlot(disc, f, t, n, x) ) + + -- multi-plot: all types for one disc and one norm + local file = plotPath.."multi/"..table.concat({f,disc,n,x}, "_") + gpData[file] = gpData[file] or {} + gpData[file].multiplot = {cols = 1} + table.insert( gpData[file], getPlot(disc, f, t, n, x) ) + + -- multi-plot: all comps for one disc and one norm + local file = plotPath.."multi/"..table.concat({"all",disc,t,n,x}, "_") + gpData[file] = gpData[file] or {} + gpData[file].multiplot = {cols = 1} + table.insert( gpData[file], getPlot(disc, f, t, n, x) ) + + end + end + end + end + end + + -- multi-plot: all discs for all norm + for _, n in pairs({"h1", "l2"}) do + for disc, _ in pairs(errors) do + local p = validP + for f, _ in pairs(PlotCmps) do + for t, _ in pairs(errors[disc][p][f]) do + if errors[disc][p][f][t][n] then + for _, x in ipairs({"DoFs", "h"}) do + + local file = plotPath.."multi/"..table.concat({f,t,x}, "_") + gpData[file] = gpData[file] or {} + gpData[file].multiplot = {cols = 2} + table.insert( gpData[file], getPlot(disc, f, t, n, x) ) + + end + end + end + end + end + end + + -- save for reuse + persistence.store(dataPath.."gp-data-files.lua", gpData); + + -- create scheduled plots + if CRS.noplot == nil or CRS.noplot == false then + for plotFile, data in pairs(gpData) do + local opt = table.deepcopy(gpOptions) + if data.multiplot then opt.multiplot = data.multiplot end + gnuplot.plot(plotFile..".tex", data, opt) + gnuplot.plot(plotFile..".pdf", data, opt) + end + end +end + + +function util.rates.static.replot(gpOptions, file) + if ProcRank() ~= 0 then return end + + local dataPath = "data/" + local plotPath = "plots/" + + local function ensureDir(name) + if not(DirectoryExists(name)) then CreateDirectory(name) end + end + + ensureDir(dataPath) + ensureDir(plotPath) + ensureDir(plotPath.."dataset/") + ensureDir(plotPath.."disc/") + ensureDir(plotPath.."multi/") + + local file = file or dataPath.."gp-data-files.lua" + local gpData = persistence.load(file); + + -- create scheduled plots + for plotFile, data in pairs(gpData) do + local opt = table.deepcopy(gpOptions) + if data.multiplot then opt.multiplot = data.multiplot end + gnuplot.plot(plotFile..".tex", data, opt) + gnuplot.plot(plotFile..".pdf", data, opt) + end + +end \ No newline at end of file diff --git a/scripts/util/domain_disc_util.lua b/scripts/util/domain_disc_util.lua index 5aa6c4a49..b1f0a01e5 100644 --- a/scripts/util/domain_disc_util.lua +++ b/scripts/util/domain_disc_util.lua @@ -115,6 +115,7 @@ function NavierStokesInflow(spMaster) local discType = spMaster:disc_type(); if discType == "fv1" then return NavierStokesInflowFV1(spMaster) + elseif discType == "fv1_cutElem" then return NavierStokesInflowFV1_cutElem(spMaster) elseif discType == "fv" then return NavierStokesInflowFV(spMaster) elseif discType == "fvcr" then return NavierStokesInflowFVCR(spMaster) elseif discType == "fe" then return NavierStokesInflowFE(spMaster) diff --git a/ugbase/bridge/disc_bridges/integrate_bridge.cpp b/ugbase/bridge/disc_bridges/integrate_bridge.cpp index af8ad94ec..b284f6fd2 100644 --- a/ugbase/bridge/disc_bridges/integrate_bridge.cpp +++ b/ugbase/bridge/disc_bridges/integrate_bridge.cpp @@ -116,6 +116,7 @@ static void DomainAlgebra(Registry& reg, string grp) reg.add_function("L2Error",static_cast, const char*, SmartPtr, const char*, int)>(&L2Error), grp); reg.add_function("L2Error",static_cast >, SmartPtr, const char*, number, int, const char*)>(&L2Error), grp); reg.add_function("L2Error",static_cast >, SmartPtr, const char*, number, int)>(&L2Error), grp); + reg.add_function("L2ErrorInside",static_cast, const char*, SmartPtr, const char*, int)>(&L2ErrorInside), grp); #ifdef UG_FOR_LUA reg.add_function("L2Error",static_cast, const char*, number, int, const char*)>(&L2Error), grp); reg.add_function("L2Error",static_cast, const char*, number, int)>(&L2Error), grp); diff --git a/ugbase/lib_disc/function_spaces/integrate.h b/ugbase/lib_disc/function_spaces/integrate.h index fc33c107d..cc6fb9090 100644 --- a/ugbase/lib_disc/function_spaces/integrate.h +++ b/ugbase/lib_disc/function_spaces/integrate.h @@ -39,6 +39,7 @@ #include "common/common.h" +#include "integrate_tools.h" #include "lib_grid/tools/subset_group.h" #include "lib_disc/common/function_group.h" @@ -256,6 +257,163 @@ class StdIntegrand : public IIntegrand * associated attachment entry. * \returns value of the integral */ + + template + number IntegrateInside(SmartPtr spFineGridFct, + SmartPtr spCoarseGridFct, + int si, + typename domain_traits::position_accessor_type& aaPos, + IIntegrand& integrand, + int quadOrder, std::string quadType, + Grid::AttachmentAccessor< + typename domain_traits::grid_base_object, ANumber> + *paaElemContribs = NULL + ) + { + PROFILE_FUNC(); + + // reset the result + number integral = 0; + number integralOutside = 0; + + // set data for getting parten element + const int coarseTopLevel = spCoarseGridFct->dof_distribution()->grid_level().level(); + const int fineTopLevel = spFineGridFct->dof_distribution()->grid_level().level(); + SmartPtr spMG = spFineGridFct->domain()->grid(); + + // this is the base element type (e.g. Face). This is the type when the + // iterators above are dereferenciated. + typedef typename domain_traits::grid_base_object grid_base_object; + + // note: this iterator is for the base elements, e.g. Face and not + // for the special type, e.g. Triangle, Quadrilateral + TConstIterator iter = spFineGridFct->template begin(si); + TConstIterator iterEnd = spFineGridFct->template end(si); + + // get quad type + if(quadType.empty()) quadType = "best"; + QuadType type = GetQuadratureType(quadType); + + // accessing without dereferencing a pointer first is simpler... + Grid::AttachmentAccessor aaElemContribs; + if(paaElemContribs) + aaElemContribs = *paaElemContribs; + + // We'll reuse containers to avoid reallocations + std::vector > vCorner; + std::vector > vCornerCoarse; + std::vector > vGlobIP; + std::vector > vJT; + std::vector vValue; + + // iterate over all elements + for(; iter != iterEnd; ++iter) + { + // get element + grid_base_object* pElem = *iter; + + // get coarse element + GridObject* pParentElem = pElem; + if(coarseTopLevel < fineTopLevel){ + int parentLevel = spMG->get_level(pParentElem); + while(parentLevel > coarseTopLevel){ + pParentElem = spMG->get_parent(pParentElem); + parentLevel = spMG->get_level(pParentElem); + } + } + grid_base_object* pCoarseElem = (grid_base_object*)pParentElem; + + // get reference object id (i.e. Triangle, Quadrilateral, Tetrahedron, ...) + ReferenceObjectID roid = (ReferenceObjectID) pElem->reference_object_id(); + + // get quadrature Rule for reference object id and order + try{ + const QuadratureRule& rQuadRule + = QuadratureRuleProvider::get(roid, quadOrder, type); + + // get reference element mapping by reference object id + DimReferenceMapping& mapping + = ReferenceMappingProvider::get(roid); + + // number of integration points + const size_t numIP = rQuadRule.size(); + + // get all corner coordinates + CollectCornerCoordinates(vCorner, *pElem, aaPos, true); + CollectCornerCoordinates(vCornerCoarse, *pCoarseElem, aaPos, true); + + // skip all outside and cut elements! + const MathVector& center(0.2); + const number radius = 0.05; + bool outsideElem = false; + for ( size_t i = 0; i < vCornerCoarse.size(); ++i ) + { + number dist = 0.0; + for ( size_t d = 0; d < dim; ++d ) + dist += (vCornerCoarse[i][d]-center[d]) * (vCornerCoarse[i][d]-center[d]); + dist = sqrt(dist); + if ( (dist-radius) < 1e-10) + { + outsideElem = true; + } + } + if ( outsideElem ) + continue; + // update the reference mapping for the corners + mapping.update(&vCorner[0]); + + // compute global integration points + vGlobIP.resize(numIP); + mapping.local_to_global(&(vGlobIP[0]), rQuadRule.points(), numIP); + + // compute transformation matrices + vJT.resize(numIP); + mapping.jacobian_transposed(&(vJT[0]), rQuadRule.points(), numIP); + + // compute integrand values at integration points + vValue.resize(numIP); + try + { + integrand.values(&(vValue[0]), &(vGlobIP[0]), + pElem, &vCorner[0], rQuadRule.points(), + &(vJT[0]), + numIP); + } + UG_CATCH_THROW("Unable to compute values of integrand at integration point."); + + // reset contribution of this element + number intValElem = 0; + + // loop integration points + for(size_t ip = 0; ip < numIP; ++ip) + { + // get quadrature weight + const number weightIP = rQuadRule.weight(ip); + + // get determinate of mapping + const number det = SqrtGramDeterminant(vJT[ip]); + + // add contribution of integration point + intValElem += vValue[ip] * weightIP * det; + } + + // add to global sum + if ( outsideElem ) + integralOutside += intValElem; + else + integral += intValElem; + if(aaElemContribs.valid()) + aaElemContribs[pElem] = intValElem; + + }UG_CATCH_THROW("SumValuesOnElems failed."); + } // end elem + + + // return the summed integral contributions of all elements + return integral; + } + + template number Integrate(TConstIterator iterBegin, TConstIterator iterEnd, @@ -387,7 +545,37 @@ number IntegrateSubset(IIntegrand &spIntegrand, spIntegrand, quadOrder, quadType); } - + + + template + number IntegrateSubsetInside(SmartPtr > spIntegrand, + SmartPtr spFineGridFct, + SmartPtr spCoarseGridFct, + int si, int quadOrder, std::string quadType) + { + // integrate elements of subset + typedef typename TGridFunction::template dim_traits::const_iterator const_iterator; + + spIntegrand->set_subset(si); + /* + return IntegrateOnInnerBoundary + (spFineGridFct, + spCoarseGridFct, + si, + spFineGridFct->domain()->position_accessor(), + *spIntegrand, + quadOrder, quadType); + */ + return IntegrateInside + (spFineGridFct, + spCoarseGridFct, + si, + spFineGridFct->domain()->position_accessor(), + *spIntegrand, + quadOrder, quadType); + + } + template number IntegrateSubsets(IIntegrand &spIntegrand, @@ -457,6 +645,76 @@ number IntegrateSubsets(IIntegrand &spIntegrand, return value; } + + template + number IntegrateSubsetsInside(SmartPtr > spIntegrand, + SmartPtr spFineGridFct, + SmartPtr spCoarseGridFct, + const char* subsets, int quadOrder, + std::string quadType = std::string()) + { + // world dimensions + static const int dim = TGridFunction::dim; + + // read subsets + SubsetGroup ssGrp(spFineGridFct->domain()->subset_handler()); + if(subsets != NULL) + { + ssGrp.add(TokenizeString(subsets)); + if(!SameDimensionsInAllSubsets(ssGrp)) + UG_THROW("IntegrateSubsets: Subsets '"< dim) + UG_THROW("IntegrateSubsets: Dimension of subset is "<(spIntegrand, spFineGridFct, spCoarseGridFct, si, quadOrder, quadType); break; + case 2: value += IntegrateSubsetInside(spIntegrand, spFineGridFct, spCoarseGridFct, si, quadOrder, quadType); break; + case 3: value += IntegrateSubsetInside(spIntegrand, spFineGridFct, spCoarseGridFct, si, quadOrder, quadType); break; + default: UG_THROW("IntegrateSubsets: Dimension "< 1) + { + pcl::ProcessCommunicator com; + number local = value; + com.allreduce(&local, &value, 1, PCL_DT_DOUBLE, PCL_RO_SUM); + } +#endif + + // return the result + return value; + } + //////////////////////////////////////////////////////////////////////////////// // UserData Integrand @@ -1122,7 +1380,363 @@ number L2Error(const char* ExactSol, } #endif - + + template + class L2DiffInnerBoundaryIntegrand + : public StdIntegrand > + { + public: + /// world dimension of grid function + static const int worldDim = TGridFunction::dim; + + private: + SmartPtr m_spFineGridFct; + const size_t m_fineFct; + const LFEID m_fineLFEID; + const int m_fineTopLevel; + + SmartPtr m_spCoarseGridFct; + const size_t m_coarseFct; + const LFEID m_coarseLFEID; + const int m_coarseTopLevel; + + /// multigrid + SmartPtr m_spMG; + + public: + /// constructor (1 is fine grid function) + L2DiffInnerBoundaryIntegrand(SmartPtr spFineGridFct, size_t fineCmp, + SmartPtr spCoarseGridFct, size_t coarseCmp) + : m_spFineGridFct(spFineGridFct), m_fineFct(fineCmp), + m_fineLFEID(m_spFineGridFct->local_finite_element_id(m_fineFct)), + m_fineTopLevel(m_spFineGridFct->dof_distribution()->grid_level().level()), + m_spCoarseGridFct(spCoarseGridFct), m_coarseFct(coarseCmp), + m_coarseLFEID(m_spCoarseGridFct->local_finite_element_id(m_coarseFct)), + m_coarseTopLevel(m_spCoarseGridFct->dof_distribution()->grid_level().level()), + m_spMG(m_spFineGridFct->domain()->grid()), + numCoarseElemCut(0), numFineElemCut(0) + { + if(m_fineTopLevel < m_coarseTopLevel) + UG_THROW("L2DiffInnerBoundaryIntegrand: fine and top level inverted."); + + if(m_spFineGridFct->domain().get() != + m_spCoarseGridFct->domain().get()) + UG_THROW("L2DiffInnerBoundaryIntegrand: grid functions defined on different domains."); + }; + + /// sets subset + virtual void set_subset(int si) + { + if(!m_spFineGridFct->is_def_in_subset(m_fineFct, si)) + UG_THROW("L2DiffInnerBoundaryIntegrand: Grid function component" + <is_def_in_subset(m_coarseFct, si)) + UG_THROW("L2DiffInnerBoundaryIntegrand: Grid function component" + <::set_subset(si); + } + + + /// \copydoc IIntegrand::values + template + void evaluate(number vValue[], + const MathVector vFineGlobIP[], + GridObject* pFineElem, + const MathVector vCornerCoords[], + const MathVector vFineLocIP[], + const MathMatrix vJT[], + const size_t numIP) + { + const char* filename = "evaluate"; + std::string name(filename); + char ext[50]; sprintf(ext, ".txt"); + name.append(ext); + FILE* outputFile = fopen(name.c_str(), "a"); + + typedef typename TGridFunction::template dim_traits::grid_base_object Element; + + // get coarse element + GridObject* pCoarseElem = pFineElem; + if(m_coarseTopLevel < m_fineTopLevel){ + int parentLevel = m_spMG->get_level(pCoarseElem); + while(parentLevel > m_coarseTopLevel){ + pCoarseElem = m_spMG->get_parent(pCoarseElem); + parentLevel = m_spMG->get_level(pCoarseElem); + } + } + + typename domain_traits::position_accessor_type& aaPos = m_spCoarseGridFct->domain()->position_accessor(); + std::vector fine_vOriginalCornerID; + std::vector fine_vInterfaceID; + bool fineElemCut = false; + // get reference object id (i.e. Triangle, Quadrilateral, Tetrahedron, ...) + ReferenceObjectID fineROID = pFineElem->reference_object_id(); + std::vector > vCornerFine; + if ( !CollectCorners_FlatTop_2d(pFineElem, m_spMG, aaPos, vCornerFine, fine_vOriginalCornerID, fine_vInterfaceID, fineROID) ) + { + CollectCornerCoordinates(vCornerFine, *static_cast(pFineElem), *m_spFineGridFct->domain()); + // fill 'm_vOriginalCornerID' for setting origSH later on: + for ( size_t i = 0; i < vCornerFine.size(); ++i ) + fine_vOriginalCornerID.push_back(i); + } + else + { + numFineElemCut++; + + fineElemCut = true; + + } + + // get corner coordinates + std::vector coarse_vOriginalCornerID; + std::vector coarse_vInterfaceID; + ReferenceObjectID coarseROID = pCoarseElem->reference_object_id(); + std::vector > vCornerCoarse; + if ( !CollectCorners_FlatTop_2d(pCoarseElem, m_spMG, aaPos, vCornerCoarse, coarse_vOriginalCornerID, coarse_vInterfaceID, coarseROID) ) + { + if ( fineElemCut ) + UG_THROW(" not possible: fineElemCut = true && coarseElemCut = false!\n"); + CollectCornerCoordinates(vCornerCoarse, *static_cast(pCoarseElem), *m_spCoarseGridFct->domain()); + // fill 'm_vOriginalCornerID' for setting origSH later on: + for ( size_t i = 0; i < vCornerCoarse.size(); ++i ) + coarse_vOriginalCornerID.push_back(i); + } + else + { + numCoarseElemCut++; + } + + + // get Reference Mapping + DimReferenceMapping& map + = ReferenceMappingProvider::get(coarseROID, vCornerCoarse); + + std::vector > vCoarseLocIP; + vCoarseLocIP.resize(numIP); + for(size_t ip = 0; ip < vCoarseLocIP.size(); ++ip) VecSet(vCoarseLocIP[ip], 0.0); + map.global_to_local(&vCoarseLocIP[0], vFineGlobIP, numIP); + + try{ + // get trial space + const LocalShapeFunctionSet& rFineLSFS = + LocalFiniteElementProvider::get(fineROID, m_fineLFEID); + const LocalShapeFunctionSet& rCoarseLSFS = + LocalFiniteElementProvider::get(coarseROID, m_coarseLFEID); + + // get multiindices of element + std::vector vFineMI, vCoarseMI; + // m_fineFct = u,v,p! + m_spFineGridFct->dof_indices(pFineElem, m_fineFct, vFineMI); + m_spCoarseGridFct->dof_indices(pCoarseElem, m_coarseFct, vCoarseMI); + + // loop all integration points + for(size_t ip = 0; ip < numIP; ++ip) + { + // compute approximated solution at integration point + number fineSolIP = 0.0; + number sumShapeFine = 0.0; + + for(size_t sh = 0; sh < vCornerFine.size(); ++sh) + { + bool bContinue1 = false; + // solution value for outside velocity := 0.0! + if ( m_fineFct < worldDim ) + if ( is_insideParticle(vCornerFine[sh], 0) ) + bContinue1 = true; //continue; + + bool bContinue2 = false; + if ( m_fineFct < worldDim ) + { + for ( size_t i = 0; i < fine_vInterfaceID.size(); ++i ) + if ( sh == fine_vInterfaceID[i] ) + bContinue2 = true; //continue; + } + if ( (bContinue1 && !bContinue2) ) + { + for ( size_t i = 0; i < fine_vInterfaceID.size(); ++i ) + UG_LOG("vInterface = " << fine_vInterfaceID[i] << "\n"); + UG_LOG("sh = " << sh << "\n"); + + UG_THROW("case1: error for criterion of continuing solution on FINE interface!\n"); + } + if ( (!bContinue1 && bContinue2) ) + { + number err = get_insideParticle(vCornerFine[sh], 0); + UG_LOG("err = " << err << "\n"); + if ( is_insideParticle(vCornerFine[sh], 0) ) + {UG_LOG("true\n");} + else {UG_LOG("false\n");} + for ( size_t i = 0; i < fine_vInterfaceID.size(); ++i ) + UG_LOG("vInterface = " << fine_vInterfaceID[i] << "\n"); + UG_LOG("sh = " << sh << "\n"); + + UG_THROW("case2: error for criterion of continuing solution on FINE interface!\n"); + } + + // get value at shape point (e.g. corner for P1 fct) + const size_t origSH = fine_vOriginalCornerID[sh]; + number val; + if ( bContinue1 && bContinue2 ) + { + val = get_value(m_spFineGridFct, m_fineTopLevel, m_fineFct, vCornerFine[sh]); + /* + MathVector RotVec; + RotVec[0] = -vCornerFine[sh][1]; + RotVec[1] = vCornerFine[sh][0]; + if ( m_fineFct == 0 ) + val = 0.3; //-RotVec[m_fineFct]*0.5; + if ( m_fineFct == 1 ) + val = 0.0; + */ + } + else val = DoFRef(*m_spFineGridFct, vFineMI[origSH]); + + // if ( vCornerFine.size() == 4 ) UG_LOG("val = " << val << "\n"); + + // add shape fct at ip * value at shape + fineSolIP += val * rFineLSFS.shape(sh, vFineLocIP[ip]); + sumShapeFine += rFineLSFS.shape(sh, vFineLocIP[ip]); + + if ( 0 ) //vCornerFine.size() == 4 ) + { + UG_LOG("sh = " << sh << "\n"); + UG_LOG("origSH = " << origSH << "\n"); + UG_LOG("vFineMI[" << origSH << " = " << vFineMI[origSH] << "\n"); + UG_LOG("m_fineFct = " << m_fineFct << "\n"); + UG_LOG("shapeFine = " << rFineLSFS.shape(sh, vFineLocIP[ip]) << "\n"); + + } + } + + number coarseSolIP = 0.0; + number sumShapeCoarse = 0.0; + for(size_t sh = 0; sh < vCornerCoarse.size(); ++sh) + { + bool bContinue1 = false; + // solution value for outside velocity := 0.0! + if ( m_coarseFct < worldDim ) + if ( is_insideParticle(vCornerCoarse[sh], 0) ) + bContinue1 = true; //continue; + + bool bContinue2 = false; + if ( m_coarseFct < worldDim ) + { + for ( size_t i = 0; i < coarse_vInterfaceID.size(); ++i ) + if ( sh == coarse_vInterfaceID[i] ) + bContinue2 = true; //continue; + } + + if ( (bContinue1 && !bContinue2) || (!bContinue1 && bContinue2) ) + UG_THROW("error for criterion of continuing solution on COARSE interface!\n"); + + + // get value at shape point (e.g. corner for P1 fct) + const size_t origSH = coarse_vOriginalCornerID[sh]; + number val; + if ( bContinue1 && bContinue2 ) + { + val = get_value(m_spCoarseGridFct, m_coarseTopLevel, m_coarseFct, vCornerCoarse[sh]); + /* + MathVector RotVec; + RotVec[0] = -vCornerCoarse[sh][1]; + RotVec[1] = vCornerCoarse[sh][0]; + if ( m_coarseFct == 0 ) + val = 0.3; // -RotVec[m_coarseFct]*0.5; + if ( m_coarseFct == 1 ) + val = 0.0; + */ + } + else val = DoFRef(*m_spCoarseGridFct, vCoarseMI[origSH]); + + + // add shape fct at ip * value at shape + coarseSolIP += val * rCoarseLSFS.shape(sh, vCoarseLocIP[ip]); + sumShapeCoarse += rCoarseLSFS.shape(sh, vCoarseLocIP[ip]); + + if ( 0 ) //vCornerCoarse.size() == 4 ) + { + UG_LOG("sh = " << sh << "\n"); + UG_LOG("origSH = " << origSH << "\n"); + UG_LOG("vCoarseMI[" << origSH << " = " << vCoarseMI[origSH] << "\n"); + UG_LOG("m_coarseFct = " << m_coarseFct << "\n"); + UG_LOG("shapeCoarse = " << rCoarseLSFS.shape(sh, vCoarseLocIP[ip]) << "\n"); + + } + } + + + if ( 0 ) //vCoarseMI[0][1] == 2 ) + if ( vCornerCoarse.size() == 4 ) + { + /* UG_LOG("trans[0] = " << DoFRef(*m_spFineGridFct, DoFIndex(3029,0)) << "\n"); + UG_LOG("trans[1] = " << DoFRef(*m_spFineGridFct, DoFIndex(3029,1)) << "\n"); + UG_LOG("rot[0] = " << DoFRef(*m_spFineGridFct, DoFIndex(12,0)) << "\n"); + UG_LOG("rot[1] = " << DoFRef(*m_spFineGridFct, DoFIndex(12,1)) << "\n"); + */ + UG_LOG("sumShapeFine = " << sumShapeFine << "\n"); + UG_LOG("sumShapeCoarse = " << sumShapeCoarse << "\n"); + UG_THROW("vCoarseMI[" << 0 << " = " << vCoarseMI[0] << "\n"); + } + + // get squared of difference + vValue[ip] = (coarseSolIP - fineSolIP); + vValue[ip] *= vValue[ip]; + + } + + } + UG_CATCH_THROW("L2ErrorIntegrand::evaluate: trial space missing."); + fclose(outputFile); + }; + + size_t numCoarseElemCut; + size_t numFineElemCut; + }; + + + + + template + number L2ErrorInside(SmartPtr spGridFct1, const char* cmp1, + SmartPtr spGridFct2, const char* cmp2, + int quadOrder, const char* subsets) + { + // get function id of name + const size_t fct1 = spGridFct1->fct_id_by_name(cmp1); + const size_t fct2 = spGridFct2->fct_id_by_name(cmp2); + + // check that function exists + if(fct1 >= spGridFct1->num_fct()) + UG_THROW("L2Error: Function space does not contain" + " a function with name " << cmp1 << "."); + if(fct2 >= spGridFct2->num_fct()) + UG_THROW("L2Error: Function space does not contain" + " a function with name " << cmp2 << "."); + + // get top level of gridfunctions + const int level1 = spGridFct1->dof_distribution()->grid_level().level(); + const int level2 = spGridFct2->dof_distribution()->grid_level().level(); + + // check + if(level1 > level2){ + SmartPtr > spIntegrand + = make_sp(new L2DiffInnerBoundaryIntegrand(spGridFct1, fct1, spGridFct2, fct2)); + return sqrt(IntegrateSubsetsInside(spIntegrand, spGridFct1, spGridFct2, subsets, quadOrder)); + }else{ + UG_LOG("level1 = " << level1 << ", level2 = " << level2 << "\n"); + SmartPtr > spIntegrand + = make_sp(new L2DiffInnerBoundaryIntegrand(spGridFct2, fct2, spGridFct1, fct1)); + return sqrt(IntegrateSubsetsInside(spIntegrand, spGridFct2, spGridFct1, subsets, quadOrder)); + } + } + + template + number L2ErrorInside(SmartPtr spGridFct1, const char* cmp1, + SmartPtr spGridFct2, const char* cmp2, + int quadOrder) + { + return L2ErrorInside(spGridFct1, cmp1, spGridFct2, cmp2, quadOrder, NULL); + } //////////////////////////////////////////////////////////////////////////////// diff --git a/ugbase/lib_disc/function_spaces/integrate_tools.h b/ugbase/lib_disc/function_spaces/integrate_tools.h new file mode 100644 index 000000000..e992ed796 --- /dev/null +++ b/ugbase/lib_disc/function_spaces/integrate_tools.h @@ -0,0 +1,1322 @@ +/* + * integrate_tools.h + * + * Created on: 03.07.2015 + * Author: suze + */ + +#ifndef INTEGRATE_TOOLS_H_ +#define INTEGRATE_TOOLS_H_ + +namespace ug{ + +template +number get_value(SmartPtr spGridFct, const int level, const size_t fct, const MathVector Corner) +{ + std::vector vTransInd(6); + vTransInd[0] = 0; + vTransInd[1] = 143; + vTransInd[2] = 549; + vTransInd[3] = 3029; + vTransInd[4] = 8529; + vTransInd[5] = 62201; + + std::vector vRotInd(6); + vRotInd[0] = 0; + vRotInd[1] = 12; + vRotInd[2] = 12; + vRotInd[3] = 12; + vRotInd[4] = 2153; + vRotInd[5] = 2153; + + MathVector RotVec; + RotVec[0] = -Corner[1]; + RotVec[1] = Corner[0]; + + const size_t transInd = vTransInd[level]; + const size_t rotInd = vRotInd[level]; + + const number transVel = DoFRef(*spGridFct, DoFIndex(transInd, fct)); + const number rotVel = DoFRef(*spGridFct, DoFIndex(rotInd, fct)); + + //UG_LOG("transVel = " << transVel << ", rotVel = " << rotVel << "\n"); + + const number val = transVel + rotVel*RotVec[fct]; + + return val; +} + +template +bool set_nearInterface(MathVector vrtPos, int prtIndex) +{ + const number radius = 0.05; + const MathVector center(0.2); + const number threshold = 1e-9; + // ToDo threshold! + + // default value of threshold = 0.0 => do nothing in this case +// if (threshold == 0.0) +// return false; + + const number dist = VecDistance(vrtPos, center); + + if (fabs(dist - radius) < threshold) + return true; + + return false; +} + + +template +number get_insideParticle(MathVector vrtPos, int prtIndex) +{ + const number radius = 0.05; + const MathVector center(0.2); + + bool outsideFluid = false; + if ( (VecDistance(vrtPos, center)-radius) < 1e-10) + { + outsideFluid = true; + } + else + { + outsideFluid = set_nearInterface(vrtPos, prtIndex); + } + + return (VecDistance(vrtPos, center)-radius); +} + +template +bool is_insideParticle(MathVector vrtPos, int prtIndex) +{ + const number radius = 0.05; + const MathVector center(0.2); + + bool outsideFluid = false; + if ( (VecDistance(vrtPos, center)-radius) < 1e-10) + outsideFluid = true; + else + outsideFluid = set_nearInterface(vrtPos, prtIndex); + + return outsideFluid; +} + +template +number get_LSvalue_byPosition(MathVector vrtPos, int PrtIndex) +{ + const number radius = 0.05; + const MathVector center(0.2); + + MathVector localCoords; + VecSubtract(localCoords, vrtPos, center); + + number dist = VecDot(localCoords, localCoords); + dist = sqrt(dist); + + return radius - dist; +} + +template +bool get_LineCircle_Intersection(MathVector& Intersect, Vertex* vrtOutsideCirc, + Vertex* vrtInsideCirc, int PrtIndex, + typename domain_traits::position_accessor_type& aaPos) +{ + const number radius = 0.05; + const MathVector center(0.2); + + //if ( dim == 3 ) UG_THROW("in 'get_LineCircle_Intersection()': not implemented for 3d case!\n"); + + /////////////////////////////////////////////////////////////////////////////////////// + // + // 'vrtPosOut':= the starting point of the ray, + // 'vrtPosIn' := the end point of the ray, + // 'center' := the center of sphere you're testing against + // 'radius' := the radius of that sphere + // 'lineDir' := direction vector of ray from start to end + // 'rayDir' := direction vector of ray from center to start + // + // Ansatz: + // (1) Intersect = vrtPosOut + alpha*lineDir + // (2) Intersect - center = radius + // + // => (1) Intersect[0] = vrtPosOut[0] + alpha*lineDir[0] + // Intersect[1] = vrtPosOut[1] + alpha*lineDir[1] + // => (2) (Intersect[0] - center[0])^2 + (Intersect[1] - center[1])^2 = radius^2 + // + // Plug (1) into (2) => ... => quadratic equation for alpha: + // + // alpha^2 * + alpha * 2* + ( -radius^2 ) = 0 + // + // -> a = , b = , c = - radius^2 + // + // + // => from (1): Intersect = vrtPosOut + alpha*(vrtPosIn - vrtPosOut) + /////////////////////////////////////////////////////////////////////////////////////// + + number alpha; + + const MathVector& vrtPosOut = aaPos[vrtOutsideCirc]; + const MathVector& vrtPosIn = aaPos[vrtInsideCirc]; + + MathVector lineDir; + MathVector rayDir; + +// lineDir = vrtPosIn - vrtPosOut; + VecSubtract(lineDir, vrtPosIn, vrtPosOut); +// rayDir = vrtPosOut - center; + VecSubtract(rayDir, vrtPosOut, center); + + const number a = VecDot(lineDir, lineDir); + const number b = 2.0 * VecDot(lineDir, rayDir); + const number c = VecDot(vrtPosOut, vrtPosOut) + VecDot(center, center) + - 2 * VecDot(vrtPosOut, center) - radius * radius; + + const number discriminant = b * b - 4 * a * c; + +// check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: + if (discriminant < -1e-8) + UG_THROW("Value of discriminant = " << discriminant << "\n"); + + +// discriminant = 0! + const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); + const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); + + if (alpha1 <= alpha2) + alpha = alpha1; + else + alpha = alpha2; + + if (alpha < 0 || (alpha - 1.0) > 1e-8) + UG_THROW( + "Error in 'get_LineCircle_Intersection()': alpha not valid; should lie between 0 and 1: " << alpha << "\n"); + + for (size_t d = 0; d < dim; ++d) + Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; + + return true; +} +/* +bool isIncluded2(const size_t newID, std::vector vInterfaceID) +{ + for ( size_t i = 0; i < vInterfaceID.size(); ++i) + if ( vInterfaceID[i] == newID ) + return true; + + return false; +} +*/ +/* +void reset_sh_if_on_interface(size_t& sh, + std::vector vInterfaceID, + std::vector& vOriginalCornerID) +{ + for ( size_t i = 0; i < vInterfaceID.size(); ++i) + if ( vInterfaceID[i] == sh ) + sh = vOriginalCornerID[i]; + +} +*/ +template +bool isIncluded(std::vector > vCheckList, MathVector checkPoint) +{ + for(size_t i = 0; i < vCheckList.size(); ++i) + { + bool isEqual = true; + + if ( VecDistance(vCheckList[i],checkPoint) > 1e-10) + isEqual = false; + + if ( isEqual ) + return true; + + } + + return false; +} + +template +ReferenceObjectID set_roid_2d(const int numCo) +{ + ReferenceObjectID roid; + + switch(numCo) + { + case 0: roid = ROID_UNKNOWN; break; + case 3: roid = ROID_TRIANGLE; break; + case 4: roid = ROID_QUADRILATERAL; break; + + default: throw(UGError("during switch in 'set_roid_2d()': " + "m_numCo invalid => default case chosen")); + } + return roid; + +} + +template +ReferenceObjectID set_roid_3d(const int numCo) +{ + ReferenceObjectID roid; + + switch(numCo) + { + case 0: roid = ROID_UNKNOWN; break; + case 4: roid = ROID_TETRAHEDRON; break; + case 5: roid = ROID_PYRAMID; break; + case 6: roid = ROID_PRISM; break; + + default: throw(UGError("during switch in 'set_roid_3d()': " + "m_numCo invalid => default case chosen")); + } + return roid; + +} + +// parameter 'normal' is the direction from the triangle into the inner of the prism +template +bool isCCW(std::vector > vCornerCoords, MathVector normal) +{ + + MathVector e1, e2; + VecSubtract(e1, vCornerCoords[1], vCornerCoords[0]); + VecSubtract(e2, vCornerCoords[2], vCornerCoords[0]); + + MathVector n; + VecCross(n, e1, e2); + VecNormalize(n,n); + VecNormalize(normal,normal); + + if ( fabs(VecDot(n, normal)) < 1e-6 ) + UG_THROW("in 'isCCW()': vectors are perpendicular.\n"); + + if ( VecDot(n, normal) > 0 ) return true; // CCW + else return false; + +} + +template +ReferenceObjectID reset_sh_if_on_interface(size_t& sh, + std::vector vInterfaceID, + std::vector& vOriginalCornerID) +{ + + for ( size_t i = 0; i < vInterfaceID.size(); ++i) + if ( vInterfaceID[i] == sh ) + sh = vOriginalCornerID[i]; + + ReferenceObjectID roid; + int numCo = 4; + switch(numCo) + { + case 0: roid = ROID_UNKNOWN; break; + case 4: roid = ROID_TETRAHEDRON; break; + case 5: roid = ROID_PYRAMID; break; + case 6: roid = ROID_PRISM; break; + + default: throw(UGError("during switch in 'set_roid_3d()': " + "m_numCo invalid => default case chosen")); + } + + return roid; + +} + +template +void ResortQuadrilateral(std::vector, size_t > > vInsideCorners, + std::vector, size_t > > vOutsideCorners, + MathVector normalDir, + std::vector >& m_vCornerCoords, + std::vector& m_vOriginalCornerID, + std::vector& m_vInterfaceID) +{ +// some checks: + if ( vOutsideCorners.size() != 2 ) UG_THROW("vOutsideCorners.size() has to be 2 in 2d case, but is " << vOutsideCorners.size() << ".\n"); + if ( vInsideCorners.size() != 2 ) UG_THROW("vInsideCorners.size() has to be 2 in 2d case, but is " << vInsideCorners.size() << ".\n"); + if ( vOutsideCorners[0].second != vOutsideCorners[1].second ) UG_THROW("Outside indices must be identical!\n"); + +//////////////////////////////////////////////////////////////////////////////////////////// +// 1) Copy 'vOutsideCorners'/'vOutsideCorners' to 'm_vCornerCoords' in special order: +// -> ordering: 1. insideCorner, 2./3. outsideCorner, 4. insideCorner +//////////////////////////////////////////////////////////////////////////////////////////// + + m_vCornerCoords.clear(); m_vCornerCoords.resize(4); + m_vOriginalCornerID.clear(); m_vOriginalCornerID.resize(4); +// fill with insideCorners+indices: + m_vCornerCoords[0] = vInsideCorners[0].first; + m_vOriginalCornerID[0] = vInsideCorners[0].second; + + m_vCornerCoords[3] = vInsideCorners[1].first; + m_vOriginalCornerID[3] = vInsideCorners[1].second; + +// fill with outsideCorners+indices: + m_vCornerCoords[1] = vOutsideCorners[0].first; + m_vOriginalCornerID[1] = vOutsideCorners[0].second; + + m_vCornerCoords[2] = vOutsideCorners[1].first; + m_vOriginalCornerID[2] = vOutsideCorners[1].second; + +// remember outside Index in order to fill 'vm_vInterfaceID' after re-ordering. + size_t outInd = vOutsideCorners[0].second; + +//////////////////////////////////////////////////////////////////////////////////////////// +// 2) Check for potential cross-ordering or not-CCW +//////////////////////////////////////////////////////////////////////////////////////////// + MathVector<3> vNormOut1, vNormOut2; + std::vector > vCornerCoordsBlow; vCornerCoordsBlow.resize(4); + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + { + for ( size_t d = 0; d < dim; ++d ) + vCornerCoordsBlow[i][d] = m_vCornerCoords[i][d]; + vCornerCoordsBlow[i][2] = 0.0; + } + + CalculateTriangleNormalNoNormalize(vNormOut1, vCornerCoordsBlow[0], vCornerCoordsBlow[1], vCornerCoordsBlow[2]); + CalculateTriangleNormalNoNormalize(vNormOut2, vCornerCoordsBlow[2], vCornerCoordsBlow[3], vCornerCoordsBlow[0]); + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Check 1 - cross-ordering +// VecDot(vNormOut1,vNormOut2) < 0 => corners of quadrilateral are not ordered along the +// endges, i.e. across the diagonal => switch order of the two outideCorners, i.e. index [1],[2] +///////////////////////////////////////////////////////////////////////////////////////////////////////// + if ( VecDot(vNormOut1, vNormOut2) < 0 ) + { + MathVector bufferCoord = m_vCornerCoords[1]; + size_t bufferInd = m_vOriginalCornerID[1]; + + m_vCornerCoords[1] = m_vCornerCoords[2]; + m_vOriginalCornerID[1] = m_vOriginalCornerID[2]; + + m_vCornerCoords[2] = bufferCoord; + m_vOriginalCornerID[2] = bufferInd; + } + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Check 2 - CCW? +// VecDot(vNormOut1,zDir) < 0 => corners of quadrilateral are not CCW: +///////////////////////////////////////////////////////////////////////////////////////////////////////// + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + { + for ( size_t d = 0; d < dim; ++d ) + vCornerCoordsBlow[i][d] = m_vCornerCoords[i][d]; + if ( dim == 2 ) vCornerCoordsBlow[i][2] = 0.0; + + + } + CalculateTriangleNormalNoNormalize(vNormOut1, vCornerCoordsBlow[0], vCornerCoordsBlow[1], vCornerCoordsBlow[2]); + CalculateTriangleNormalNoNormalize(vNormOut2, vCornerCoordsBlow[2], vCornerCoordsBlow[3], vCornerCoordsBlow[0]); + + if ( VecDot(vNormOut1, vNormOut2) < 0 ) UG_THROW("check 1 failed after second check!\n"); + + +// pure copy of 'normalDir' data because of data type inconsistence (MathVector<3> vs. MathVector) + MathVector<3> _normalDir; + for ( size_t i = 0; i < 2; ++i ) + _normalDir[i] = normalDir[i]; + if ( dim == 2 ) _normalDir[2] = 1.0; + if ( dim == 3 ) _normalDir[2] = normalDir[2]; + + if ( VecDot(vNormOut1, _normalDir) < 0 ) + { + + MathVector bufferCoord = m_vCornerCoords[1]; + size_t bufferInd = m_vOriginalCornerID[1]; + + m_vCornerCoords[1] = m_vCornerCoords[3]; + m_vOriginalCornerID[1] = m_vOriginalCornerID[3]; + + m_vCornerCoords[3] = bufferCoord; + m_vOriginalCornerID[3] = bufferInd; + } + +// fill 'vInterfaceID': + m_vInterfaceID.clear(); + for ( size_t i = 0; i < m_vOriginalCornerID.size(); ++i ) + if ( m_vOriginalCornerID[i] == outInd ) + m_vInterfaceID.push_back(i); + +} + +template +bool CollectCorners_FlatTop_2d(GridObject* elem, + SmartPtr m_spMG, + typename domain_traits::position_accessor_type& aaPos, + std::vector >& m_vCornerCoords, + std::vector& m_vOriginalCornerID, + std::vector& m_vInterfaceID, + ReferenceObjectID& coarseROID +) +{ + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::vector, size_t > > vNearIntCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + + // get prtIndex: + bool isFTVertex = false; + size_t numCoOut = 0; + + for(size_t i = 0; i < vVertex.size(); ++i) + { + // remember boolian for check, weather there existe at least one vertex, which is FT! + isFTVertex = is_insideParticle(aaPos[vVertex[i]], 0); + if ( isFTVertex ) + numCoOut++; + } + + + if ( !isFTVertex || numCoOut == vVertex.size() ) + return false; + + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // loop vertices + ////////////////////////////////////////////// + // REMARK: + // order is the same as in 'vCornerCoords', therefore we can be sure, that the + // order of the new 'vCornerIBCoords' will be consistent with the grid standard + ///////////////////////// ///////////////////// + + bool bNearInterface = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + + // get element + Vertex* vrtRoot = vVertex[i]; + ////////////////////////////////////////////// + // case 1: + // vertex insideFluid + // => Position und index puschen + if ( ! is_insideParticle(aaPos[vrtRoot], 0) ) + { + + if ( set_nearInterface(aaPos[vrtRoot], 0) ) + { + UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); + } + else + { + m_vCornerCoords.push_back(aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + vInsideCorners.push_back(std::make_pair(aaPos[vrtRoot], i)); + } + + } + ////////////////////////////////////////////// + // case 2: + // vertex = FT + ON interface + // => KEINE Berechnung von 'intersectionPoint' notwendig! -> pushen und alten index pushen + + // REMARK: is_nearInterfaceVerx = false per default, if m_vThresholdOnLevel = 0.0 + else if ( set_nearInterface(aaPos[vrtRoot], 0) ) + { + + bNearInterface = true; + m_vCornerCoords.push_back(aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(aaPos[vrtRoot], i)); + vNearIntCorners.push_back(std::make_pair(aaPos[vrtRoot], i)); + + } + ////////////////////////////////////////////// + // case 3: + // vertex 'outsideFluid' + // => NEUE Position berechen+pushen und alten index pushen + else + { + + ////////////////////////////////////////////////////////////////////////////////////////// + // loop alle edges, die interface schneiden und damit einen neuen intersectionPnt + // beitragen zum damit assoziierten alten index + for(size_t e = 0; e < vEdges.size(); ++e) + { + + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("error in collecting vertices associated to an edge!....EXIT!...\n"); + + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + + MathVector intersectionPnt; + + /////////////////////////////////////////////////////////////////// + // lies vrtRoot on a cutted edge? + /////////////////////////////////////////////////////////////////// + // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! + if ( set_nearInterface(aaPos[vrt2], 0) || set_nearInterface(aaPos[vrt1], 0) ) + { bNearInterface = true; continue; } + // case2: vert2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt1 && !is_insideParticle(aaPos[vrt2], 0) ){ + get_LineCircle_Intersection(intersectionPnt, vrt2, vrt1, 0, aaPos); + } + // case3: vrt1 = outsideParticle && vrt2 = insideParticle: + else if ( vrtRoot == vrt2 && !is_insideParticle(aaPos[vrt1], 0) ) + { get_LineCircle_Intersection(intersectionPnt, vrt1, vrt2, 0, aaPos);} + else + {continue;} + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt, 0)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt, 0)) << "\n"); + + + /////////////////////////////////////////////////////////////////// + // only push_back, if not included yet! + // -> can be ONLY the case, if the intersectionPoint is a node + if ( ! isIncluded(m_vCornerCoords, intersectionPnt) ) + { + + m_vCornerCoords.push_back(intersectionPnt); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(intersectionPnt, i)); + } + + + } // end edge-loop + + } // end else-case + + } // end vrt-loop + +//////////////////////////////////////////////////////////////////////////////////////////// +// Postprecessing for quadrilaterals ( <=> vOutsideCorners == 2 ) +// (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface +// => no Quadrilateral, but Triangle!! +//////////////////////////////////////////////////////////////////////////////////////////// + MathVector normalDir(0.0); + if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) + { + ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir, m_vCornerCoords, m_vOriginalCornerID, m_vInterfaceID); + } + else if ( bNearInterface ) + { + // Quadrilateral -> Triangle + if ( vInsideCorners.size() == 1 ) // case 1 + { + // do nothing, since re-sorting not necessary...??? + } + // skip whole element, since only FT points are included + else if ( vInsideCorners.size() == 0 ) + UG_THROW("in 'CollectCorners_FlatTop_2d()': vInsideCorners.size() " + "= " << vInsideCorners.size() << "not possible!\n"); + } + + const int numCo = m_vCornerCoords.size(); + + if ( dim == 2 ) + coarseROID = set_roid_2d(numCo); + + if ( numCo == 0 ) + UG_THROW("hmmm: coarseROID = " << coarseROID << "\n"); + + return true; + +} + + +template +bool CollectCorners_FlatTop_Prism3(GridObject* elem, + SmartPtr m_spMG, + typename domain_traits::position_accessor_type& aaPos, + std::vector >& m_vCornerCoords, + std::vector& m_vOriginalCornerID, + std::vector& m_vInterfaceID, + ReferenceObjectID& coarseROID) +{ +/////////////////////////////////////////////////////////////////// +// 1) push_back into 'vInsideCorners' +// 2) collect according outsideCorner (lying on the commom edge) +// 3) push_back into 'vOutsideCorners' +/////////////////////////////////////////////////////////////////// + + bool output = false; + + if ( output ) UG_LOG("_________________________ begin 'CollectIBCorners3d_Prism3()' ______________________________\n\n"); + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + + std::vector > vOutsideCorners; + std::vector > vInsideCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // loop vertices + size_t outsideInd; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + if ( ! is_insideParticle(aaPos[vrtRoot], 0) ) + { + /////////////////////////////////////////////////////////////////// + // 1) push_back into 'vInsideCorners' + vInsideCorners.push_back(aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + /////////////////////////////////////////////////////////////////// + // 2) collect according outsideCorner (lying on the commom edge) + bool outsideCornerFound = false; + MathVector intersectionPnt; + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("in 'NEWcall_Extrapolation': error in collecting vertices associated to an edge!....EXIT!...\n"); + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + + // lies vrtRoot on a cutted edge? + // case1: vrt1 = outsideParticle && vrt2 = insideParticle: + if ( vrtRoot == vrt1 && is_insideParticle(aaPos[vrt2], 0) ) + {outsideCornerFound = get_intersection_point(intersectionPnt, vrt1, vrt2);} + // case2: vrt2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt2 && is_insideParticle(aaPos[vrt1], 0) ) + {outsideCornerFound = get_intersection_point(intersectionPnt, vrt2, vrt1);} + // NO nearInterface handling necessary, since this is Pyramid or Tetrahedron case! + else if ( set_nearInterface(aaPos[vrt2], 0) || set_nearInterface(aaPos[vrt1], 0) ) + {UG_THROW("in 'CollectCorners_Prism3()': no nearInterface case possible!\n");} + else + continue; + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt, 0)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners3d_Prism3()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt, 0)) << "\n"); + + } // end edge-loop + + if ( !outsideCornerFound ) + UG_THROW("During edge-loop no outsideCorner found!\n"); + + /////////////////////////////////////////////////////////////////// + // 3) push_back into 'vOutsideCorners' + if ( ! isIncluded(vOutsideCorners, intersectionPnt) ) + vOutsideCorners.push_back(intersectionPnt); + + } // end inside-case + else + // recall ousideIndex for 'm_vOriginalCornerID' + outsideInd = i; + + } // end vertex-loop + + for(size_t i = 0; i < 3; ++i) + { + m_vOriginalCornerID.push_back(outsideInd); + m_vInterfaceID.push_back(3+i); + } + +// WRITE 'vCornerCoords': FIRST insideCorners, SECOND outsideCorners + m_vCornerCoords.clear(); + for(size_t i = 0; i < 3; ++i) + m_vCornerCoords.push_back(vInsideCorners[i]); + for(size_t i = 0; i < 3; ++i) + m_vCornerCoords.push_back(vOutsideCorners[i]); + +// some checks: + if ( m_vInterfaceID.size() != 3 ) UG_THROW("wrong size for m_vInterfaceID! Should be 3 and is " << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 6 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 6 and is " << m_vOriginalCornerID.size() << "\n"); + if ( vInsideCorners.size() != 3 ) UG_THROW("wrong size for vInsideCorners! Should be 3 and is " << vInsideCorners.size() << "\n"); + if ( vOutsideCorners.size() != 3 ) UG_THROW("wrong size for vOutsideCorners! Should be 3 and is " << vOutsideCorners.size() << "\n"); + if ( m_vCornerCoords.size()!= 6 ) UG_THROW("wrong size for m_vCornerCoords! Should be 6 and is " << m_vCornerCoords.size() << "\n"); + +// check 'vOutsideCorners'-array for CCW: +// get normal to triangle, built by 'vOutsideCorners'-array: + MathVector normal = vInsideCorners[0]; + VecSubtract(normal, vOutsideCorners[0], normal); + + if ( !isCCW(vOutsideCorners, normal) ) + { + m_vCornerCoords[4] = vOutsideCorners[2]; + m_vCornerCoords[5] = vOutsideCorners[1]; + } + +// check 'vInsideCorners'-array for CCW: + if ( !isCCW(vInsideCorners, normal) ) + { + m_vCornerCoords[1] = vInsideCorners[2]; + m_vCornerCoords[2] = vInsideCorners[1]; + } + + + return true; + +} + +template +bool CollectCorners_FlatTop_Prism4(GridObject* elem, + SmartPtr m_spMG, + typename domain_traits::position_accessor_type& aaPos, + std::vector >& m_vCornerCoords, + std::vector& m_vOriginalCornerID, + std::vector& m_vInterfaceID, + ReferenceObjectID& coarseROID) +{ +/////////////////////////////////////////////////////////////////// +// 1) push_back 'insideCorner' into 'm_vCornerCoords' +// 2) collect according outsideCorner (lying on the commom edge) +// 3) push_back 'intersectionPoints' into 'm_vCornerCoords' +// 4) check for CCW-property +/////////////////////////////////////////////////////////////////// + + bool output = false; + if ( output ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_Prism4()' ______________________________\n\n"); + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // collect outside indices: + std::vector outsideInd; + for(size_t i = 0; i < vVertex.size(); ++i) + if ( is_insideParticle(aaPos[vVertex[i]], 0) ) + outsideInd.push_back(i); + + if ( outsideInd.size() != 2 ) UG_THROW("Wrong number of outsideInd!\n"); + for(size_t i = 0; i < outsideInd.size(); ++i) + if ( output ) UG_LOG("outsideInd = " << outsideInd[i] << "\n"); + + // loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + if ( ! is_insideParticle(aaPos[vrtRoot], 0) ) + { + /////////////////////////////////////////////////////////////////// + // 1) push_back 'insideCorner' into 'm_vCornerCoords' + m_vCornerCoords.push_back(aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + /////////////////////////////////////////////////////////////////// + // 2) collect according outsideCorner (lying on the commom edge) + MathVector intersectionPnt; + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("error in collecting vertices associated to an edge!\n"); + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + + // lies vrtRoot on a cutted edge? + // case1: vrt1 = outsideParticle && vrt2 = insideParticle: + if ( vrtRoot == vrt1 && is_insideParticle(aaPos[vrt2], 0) ) + { + /////////////////////////////////////////////////////////////////// + // 3) push_back 'intersectionPnt' into 'm_vCornerCoords' + get_intersection_point(intersectionPnt, vrt1, vrt2); + m_vCornerCoords.push_back(intersectionPnt); + + if ( vrt2 == vVertex[outsideInd[0]] ) + m_vOriginalCornerID.push_back(outsideInd[0]); + else if ( vrt2 == vVertex[outsideInd[1]] ) + m_vOriginalCornerID.push_back(outsideInd[1]); + else UG_THROW("No outsideInd found.\n"); + } + // case2: vrt1 = insideParticle && vrt2 = outsideParticle: + else if ( vrtRoot == vrt2 && is_insideParticle(aaPos[vrt1], 0) ) + { + /////////////////////////////////////////////////////////////////// + // 3) push_back 'intersectionPnt' into 'm_vCornerCoords' + get_intersection_point(intersectionPnt, vrt2, vrt1); + m_vCornerCoords.push_back(intersectionPnt); + + if ( vrt1 == vVertex[outsideInd[0]] ) + m_vOriginalCornerID.push_back(outsideInd[0]); + else if ( vrt1 == vVertex[outsideInd[1]] ) + m_vOriginalCornerID.push_back(outsideInd[1]); + else UG_THROW("No outsideInd found.\n"); + } + else + continue; + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt, 0)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners3d_Prism2()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " + << fabs(get_LSvalue_byPosition(intersectionPnt, 0)) << "\n"); + } // end edge-loop + } // end inside-case + } // end vertex-loop + + m_vInterfaceID.push_back(1); + m_vInterfaceID.push_back(2); + m_vInterfaceID.push_back(4); + m_vInterfaceID.push_back(5); + + +// some checks: + if ( m_vInterfaceID.size() != 4 ) UG_THROW("wrong size for m_vInterfaceID! Should be 4 and is " << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 6 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 6 and is " << m_vOriginalCornerID.size() << "\n"); + if ( m_vCornerCoords.size()!= 6 ) UG_THROW("wrong size for m_vCornerCoords! Should be 6 and is " << m_vCornerCoords.size() << "\n"); + +/////////////////////////////////////////////////////////////////// +// 4) check for CCW-property + std::vector > vTriangleCorners1; + std::vector > vTriangleCorners2; + for(size_t i = 0; i < 3; ++i){ + vTriangleCorners1.push_back(m_vCornerCoords[i]); + vTriangleCorners2.push_back(m_vCornerCoords[3+i]); + } +// get normal to triangle, built by 'vOutsideCorners'-array: + MathVector normal = m_vCornerCoords[0]; + VecSubtract(normal, m_vCornerCoords[3], normal); + + if ( !isCCW(vTriangleCorners1, normal) ) + { + // switch ' m_vCornerCoords' + m_vCornerCoords[1] = vTriangleCorners1[2]; + m_vCornerCoords[2] = vTriangleCorners1[1]; + // switch ' m_vOriginalCornerID' + size_t buffer = m_vOriginalCornerID[1]; + m_vOriginalCornerID[1] = m_vOriginalCornerID[2]; + m_vOriginalCornerID[2] = buffer; + } + +// check 'vInsideCorners'-array for CCW: + if ( !isCCW(vTriangleCorners2, normal) ) + { + // switch ' m_vCornerCoords' + m_vCornerCoords[4] = vTriangleCorners2[2]; + m_vCornerCoords[5] = vTriangleCorners2[1]; + // switch ' m_vOriginalCornerID' + size_t buffer = m_vOriginalCornerID[4]; + m_vOriginalCornerID[4] = m_vOriginalCornerID[5]; + m_vOriginalCornerID[5] = buffer; + } + + + return true; + +} + +template +bool CollectCorners_FlatTop_Pyramid(GridObject* elem, + SmartPtr m_spMG, + typename domain_traits::position_accessor_type& aaPos, + std::vector >& m_vCornerCoords, + std::vector& m_vOriginalCornerID, + std::vector& m_vInterfaceID, + ReferenceObjectID& coarseROID) +{ +/////////////////////////////////////////////////////////////////// +// 1) push_back into 'vInsideCorners' +// 2) push_back into 'vOutsideCorners' the 2 outsideCorners on a cut edge +// 3) write nearInterfaceCorner on m_vCornerCoords[4], since in this setting it +// is ALWAYS the top of the Pyramid! --> see grid_object_3d.h for ordering! +/////////////////////////////////////////////////////////////////// + + bool output = false; + + if ( output ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_Pyramid()' ______________________________\n\n"); + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) - for application of 'ResortQuadrilateral'! + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::pair, size_t > nearInterfaceData; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + // collect all edges of the element + std::vector vEdges; + CollectEdgesSorted(vEdges, *m_spMG, elem); + + // loop vertices + size_t outsideInd; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + // get nearInterfaceData and directly write cornerCoords to data: + if ( set_nearInterface(aaPos[vrtRoot], 0) ) + nearInterfaceData = std::make_pair(aaPos[vrtRoot], i); + else if ( ! is_insideParticle(aaPos[vrtRoot], 0) ) + { + /////////////////////////////////////////////////////////////////// + // 1) push_back into 'vInsideCorners' + vInsideCorners.push_back(std::make_pair(aaPos[vrtRoot], i)); + m_vOriginalCornerID.push_back(i); + + /////////////////////////////////////////////////////////////////// + // 2) collect according outsideCorner (lying on the commom edge) + bool outsideCornerFound = false; + MathVector intersectionPnt; + for(size_t e = 0; e < vEdges.size(); ++e) + { + Edge* edge = vEdges[e]; + std::vector vVertexEdge; + CollectVertices(vVertexEdge, *m_spMG, edge); + if ( vVertexEdge.size() != 2 ) + UG_THROW("in 'NEWcall_Extrapolation': error in collecting vertices associated to an edge!....EXIT!...\n"); + Vertex* vrt1 = vVertexEdge[0]; + Vertex* vrt2 = vVertexEdge[1]; + + // lies vrtRoot on a cutted edge? + // do nothing for edges with 1 insideCorner and 1 nearInterface corner: + if ( set_nearInterface(aaPos[vrt1], 0) || set_nearInterface(aaPos[vrt2], 0) ) + continue; + // case2: vrt1 = outsideParticle && vrt2 = insideParticle: + else if ( vrtRoot == vrt1 && is_insideParticle(aaPos[vrt2], 0) ) + {outsideCornerFound = get_intersection_point(intersectionPnt, vrt1, vrt2);} + // case3: vrt2 = outsideParticle && vrt1 = insideParticle: + else if ( vrtRoot == vrt2 && is_insideParticle(aaPos[vrt1], 0) ) + {outsideCornerFound = get_intersection_point(intersectionPnt, vrt2, vrt1);} + else + continue; + + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt, 0)) > 1e-6 ) + UG_THROW("in 'CollectIBCorners3d_Prism3()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt, 0)) << "\n"); + + } // end edge-loop + + if ( !outsideCornerFound ) + UG_THROW("During edge-loop no outsideCorner found!\n"); + + /////////////////////////////////////////////////////////////////// + // 3) push_back into 'vOutsideCorners' + vOutsideCorners.push_back(std::make_pair(intersectionPnt, 0)); + + } // end inside-case + else + // recall ousideIndex for 'm_vOriginalCornerID' + outsideInd = i; + + } // end vertex-loop + +// some checks: + if ( vInsideCorners.size() != 2 ) UG_THROW("wrong size for vInsideCorners! Should be 2 and is " << vInsideCorners.size() << "\n"); + if ( vOutsideCorners.size() != 2 ) UG_THROW("wrong size for vOutsideCorners! Should be 2 and is " << vOutsideCorners.size() << "\n"); + + for(size_t i = 0; i < vOutsideCorners.size(); ++i) + vOutsideCorners[i].second = outsideInd; + +// during ResortQuadrilateral: m_vCornerCoords.resize(4) and m_vOriginalCornerID.resize(4)! + MathVector normalDir; + VecSubtract(normalDir, nearInterfaceData.first, vOutsideCorners[0].first); + ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); + + m_vCornerCoords.push_back(nearInterfaceData.first); + m_vOriginalCornerID.push_back(nearInterfaceData.second); + m_vInterfaceID.push_back(4); + +// some checks: + if ( m_vInterfaceID.size() != 3 ) UG_THROW("wrong size for m_vInterfaceID! Should be 3 and is " << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 5 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 5 and is " << m_vOriginalCornerID.size() << "\n"); + if ( m_vCornerCoords.size()!= 5 ) UG_THROW("wrong size for m_vCornerCoords! Should be 5 and is " << m_vCornerCoords.size() << "\n"); + + return true; + +} + +template +bool CollectCorners_FlatTop_originalTet(GridObject* elem, + SmartPtr m_spMG, + typename domain_traits::position_accessor_type& aaPos, + std::vector >& m_vCornerCoords, + std::vector& m_vOriginalCornerID, + std::vector& m_vInterfaceID, + ReferenceObjectID& coarseROID) +{ + if ( 0 ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_originalTet()' ______________________________\n\n"); + + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + // loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + if ( ! is_insideParticle(aaPos[vrtRoot], 0) ) + { + if ( set_nearInterface(aaPos[vrtRoot], 0) ) + { UG_THROW("NearInterface BUT !is_onInterfaceVertex() => error!\n"); } + else + { + m_vCornerCoords.push_back(aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + } + + } + else if ( set_nearInterface(aaPos[vrtRoot], 0) ) + { + m_vCornerCoords.push_back(aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); + } + else + UG_THROW("in 'CollectCorners_FlatTop_originalTet()': outside fluid and NOT nearInterface case not possible!\n"); + } + + if ( 0 ) UG_LOG("_________________________ end 'CollectCorners_FlatTop_originalTet()' ______________________________\n\n"); + + return true; + +} + +template +int get_cutMode(std::vector vVertex, typename domain_traits::position_accessor_type& aaPos) +{ + size_t numOutside = 0; + size_t numNearInterface = 0; + for(size_t i = 0; i < vVertex.size(); ++i) + { + if ( is_insideParticle(aaPos[vVertex[i]], 0) ) + { + numOutside++; + if ( set_nearInterface(aaPos[vVertex[i]], 0) ) + numNearInterface++; + } + } + + bool logMode = false; + +// if all outside corners are nearInterface, no computation of intersectionPoints +// => purely collecting of corners necessary: + if ( numOutside == numNearInterface ) + { + if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 0\n"); + return 0; // original + } + else if ( numOutside == 1 ) + { + if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 1\n"); + return 1; // Prism3 + } + else if ( numOutside == 2 && numNearInterface == 0 ) + { + if ( logMode ) if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 2\n"); + return 2; // Prism4 + } + else if ( numOutside == 2 && numNearInterface == 1 ) + { + if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 3\n"); + return 3; // Pyramid + } + else if ( numOutside == 3 ) + { + if ( logMode ) UG_LOG("numOutside = " << numOutside << ", numNearInterface = " << numNearInterface << "\n"); + if ( logMode ) UG_LOG("cutMode = 4\n"); + return 4; // Tetrahedron + } + return -1; + +} + +template +bool CollectCorners_FlatTop_3d(GridObject* elem, + SmartPtr m_spMG, + typename domain_traits::position_accessor_type& aaPos, + std::vector >& m_vCornerCoords, + std::vector& m_vOriginalCornerID, + std::vector& m_vInterfaceID, + ReferenceObjectID& coarseROID) +{ + bool output = false; + if ( output ) UG_LOG("_________________________ begin 'get_LSvalue_byPosition()' ______________________________\n\n"); + + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + +// remember boolian for check, weather there existe at least one vertex, which is FT! + bool isFTVertex = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + isFTVertex = is_insideParticle(aaPos[vVertex[i]], 0); + if ( isFTVertex ) + break; + } + if ( !isFTVertex ) + return false; + + + size_t cutMode = get_cutMode(vVertex, aaPos); + + switch(cutMode) + { + case 0: return CollectCorners_FlatTop_originalTet(elem,m_spMG,aaPos,m_vCornerCoords,m_vOriginalCornerID,m_vInterfaceID,coarseROID); + case 1: return CollectCorners_FlatTop_Prism3(elem,m_spMG,aaPos,m_vCornerCoords,m_vOriginalCornerID,m_vInterfaceID,coarseROID); + case 2: return CollectCorners_FlatTop_Prism4(elem,m_spMG,aaPos,m_vCornerCoords,m_vOriginalCornerID,m_vInterfaceID,coarseROID); + case 3: return CollectCorners_FlatTop_Pyramid(elem,m_spMG,aaPos,m_vCornerCoords,m_vOriginalCornerID,m_vInterfaceID,coarseROID); + case 4: return CollectCorners_FlatTop_2d(elem,m_spMG,aaPos,m_vCornerCoords,m_vOriginalCornerID,m_vInterfaceID,coarseROID); + default: { UG_LOG("cutMode = " << cutMode << "\n"); + throw(UGError("Error in calling case dependent CollectIBCorners3d()!")); + } + } + + +} + + +template +bool CollectCorners_StdFV(GridObject* elem, + SmartPtr m_spMG, + typename domain_traits::position_accessor_type& aaPos, + std::vector >& m_vCornerCoords, + std::vector& m_vOriginalCornerID, + std::vector& m_vInterfaceID, + ReferenceObjectID& coarseROID) +{ + ////////////////////////////////////////////// + // 1) fill vector with fluid corners: + ////////////////////////////////////////////// + + m_vCornerCoords.clear(); + m_vInterfaceID.clear(); + m_vOriginalCornerID.clear(); + +// buffer vectors for (cornerCoords, cornerIndex) + std::vector, size_t > > vOutsideCorners; + std::vector, size_t > > vInsideCorners; + std::vector, size_t > > vNearIntCorners; + +// collect all vertices of the element + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + + // get prtIndex: + bool isOutsideVertex = false; + for(size_t i = 0; i < vVertex.size(); ++i) + { + // remember boolian for check, weather there existe at least one vertex, which is FT! + if ( is_insideParticle(vVertex[i], 0) ) + { + isOutsideVertex = true; + break; + } + } + + if ( !isOutsideVertex ) + return false; + +// loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + // get element + Vertex* vrtRoot = vVertex[i]; + + ////////////////////////////////////////////// + // case 1: + // vertex insideFluid => Position und index puschen + if ( !is_insideParticle(vVertex[i]) ) + { + if ( set_nearInterface(aaPos[vrtRoot], 0) ) + { + UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); + } + else + { + m_vCornerCoords.push_back(aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + + vInsideCorners.push_back(std::make_pair(aaPos[vrtRoot], i)); + } + + } + else + { + m_vCornerCoords.push_back(aaPos[vrtRoot]); + m_vOriginalCornerID.push_back(i); + m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! + + vOutsideCorners.push_back(std::make_pair(aaPos[vrtRoot], i)); + + } + + } + + // skip whole element, since only FT points are included + if ( dim == 2 && m_vCornerCoords.size() != 3 ) + UG_THROW("in 'CollectCorners_StdFV()': m_vCornerCoords.size() " + "= " << m_vCornerCoords.size() << "not possible!\n"); + if ( dim == 3 && m_vCornerCoords.size() != 4 ) + UG_THROW("in 'CollectCorners_StdFV()': m_vCornerCoords.size() " + "= " << m_vCornerCoords.size() << "not possible!\n"); + + + return true; +} + +} // end namespace ug + + +#endif /* INTEGRATE_TOOLS_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.cpp b/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.cpp index a1cb4c739..3e34fbd79 100644 --- a/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.cpp +++ b/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.cpp @@ -1587,9 +1587,9 @@ update(GridObject* pElem, const MathVector* vCornerCoords, const ISubs if(m_spInterfaceHandler->elementModus() == CUT_BY_INTERFACE) { update_inner_boundary_faces(); - m_spInterfaceHandler->update_inner_boundary(m_spInterfaceHandler->corners()); + m_spInterfaceHandler->update_inner_boundary(vCornerCoords); } - + // if no boundary subsets required, return if(num_boundary_subsets() == 0 || ish == NULL) return; diff --git a/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.h b/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.h index 8997951b8..b5724adf3 100644 --- a/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.h +++ b/ugbase/lib_disc/spatial_disc/disc_util/fv1Cut_geom.h @@ -978,14 +978,13 @@ class DimFV1CutGeometry : public FVGeometryBase /// construct object and initialize local values and sizes DimFV1CutGeometry() : m_pElem(NULL), m_roid(ROID_UNKNOWN) {}; - ////////////////////////////////////////////////////////////////////////////// - /// new Cut-methods - ////////////////////////////////////////////////////////////////////////////// - - /// access to m_vBF (needed during 'FV1CutGeom::update_inner_boundary_faces()') - // const std::vector* boundary_faces() const { return &m_vBF[0]; } - const std::vector boundary_faces() const { return m_vBF; } - std::vector& get_boundary_faces() { return m_vBF; } + //////////////////////////////////////////////////////////////////////////////////////// + /// new methods for the special cut-Geometry + //////////////////////////////////////////////////////////////////////////////////////// + + std::vector& get_boundary_faces() + { return m_spInterfaceHandler->get_boundary_faces(); } + void clear_boundary_faces() { m_spInterfaceHandler->clear_boundary_faces(); } inline void set_element_modus(bool boolian) { mElemModus = boolian;} inline const bool get_element_modus() { return mElemModus;} @@ -1000,63 +999,8 @@ class DimFV1CutGeometry : public FVGeometryBase bool lies_onInterface(const size_t newID) { return m_spInterfaceHandler->lies_onInterface(newID); } - inline const size_t get_original_node_for_diff(size_t i, const size_t roidID) - { - std::vector interfaceIDs = m_spInterfaceHandler->interface_id_all(); - - size_t origID = m_spInterfaceHandler->corner_orig(interfaceIDs[0]); - size_t origID2 = m_spInterfaceHandler->corner_orig(interfaceIDs[1]); - - if ( roidID == 4 ) - { - if ( origID == 0 && origID2 == 2 && i == 0 ) - {return m_spInterfaceHandler->corner_orig(interfaceIDs[1]);} - else if ( origID == 0 && origID2 == 2 && i == 1 ) - {return m_spInterfaceHandler->corner_orig(interfaceIDs[0]);} - else if ( i < 2 ) - {return m_spInterfaceHandler->corner_orig(interfaceIDs[i]);} - else - { - for ( size_t j = 0; j < 3; ++j ) - if ( j != m_spInterfaceHandler->corner_orig(interfaceIDs[0]) && j != m_spInterfaceHandler->corner_orig(interfaceIDs[1]) ) - return j; - } - } - else if ( roidID == 3 ) - { - origID = m_spInterfaceHandler->corner_orig(interfaceIDs[0]); - if ( i == 0 ) - return origID; - else - return (origID + i)%3; - } - - UG_THROW("in 'get_original_node_for_diff()': wrong Reference ObjectID: " << roidID << "\n"); - return 0; - } - - inline void set_jac_bool(bool boolian) - { m_spInterfaceHandler->set_jac_bool(boolian); } - inline bool get_jac_bool() - { return m_spInterfaceHandler->get_jac_bool(); } - - inline void add_to_integral(const number value) - { return m_spInterfaceHandler->add_to_integral(value); } - inline number get_integral() - { return m_spInterfaceHandler->get_integral(); } - inline void init_integral() - { m_spInterfaceHandler->init_integral(); } - - void resize_local_data(LocalVector u) - { m_spInterfaceHandler->resize_local_data(u); } - void set_orientation(const int orientation) - { m_spInterfaceHandler->set_orientation(orientation); } - int get_orientation() - { return m_spInterfaceHandler->get_orientation(); } - const bool get_boolian_for_diffusion() - { return m_spInterfaceHandler->get_boolian_for_diffusion(); } + inline MathVector get_corner(size_t i) {return m_spInterfaceHandler->corner(i);} - number get_shape(size_t sh, MathVector locIP, const ReferenceObjectID roid ) { const LocalShapeFunctionSet& TrialSpace = @@ -1065,85 +1009,114 @@ class DimFV1CutGeometry : public FVGeometryBase return TrialSpace.shape(sh, locIP); } - inline MathVector get_corner(size_t i) {return m_spInterfaceHandler->corner(i);} + ///////////////////////////////////////////////////////////////////////////////////////////// + /// methods necessary to get access to methods of the InterfaceHandler via the + /// FV1CutGeom-object 'TFVGeom& geo' within the 'ConvectionDiffusionFV1_cutElem'-class + + ///////////////////////////////////////////////////////////////////////////////////////////// + // (A) 'integral'-methods for the computation of the l2-error within + // 'ConvectionDiffusionFV1_cutElem::add_l2error_A_elem()' + inline void L2Error_add(const number value) + { return m_spInterfaceHandler->L2Error_add(value); } + inline number get_L2Error() + { return m_spInterfaceHandler->get_L2Error(); } + inline void L2Error_init() + { m_spInterfaceHandler->L2Error_init(); } + + ///////////////////////////////////////////////////////////////////////////////////////////// + /// (B) further methods + void resize_local_data(LocalVector u) + { m_spInterfaceHandler->resize_local_data(u); } + void set_orientation(const int orientation) + { m_spInterfaceHandler->set_orientation(orientation); } + int get_orientation() + { return m_spInterfaceHandler->get_orientation(); } + const bool get_boolian_for_diffusion() + { return m_spInterfaceHandler->get_boolian_for_diffusion(); } - void set_DoF_tag_tri(const bool bFactor2_for_DoFIndex) - { m_spInterfaceHandler->set_DoF_tag_tri(bFactor2_for_DoFIndex); } - void set_DoF_tag_quad(const bool bFactor2_for_DoFIndex) - { m_spInterfaceHandler->set_DoF_tag_quad(bFactor2_for_DoFIndex); } + // tags needed within the class 'DiffusionInterfaceMapper' + void set_DoF_tag(const bool bFactor2_for_DoFIndex, const ReferenceObjectID roid) + { m_spInterfaceHandler->set_DoF_tag(bFactor2_for_DoFIndex, roid); } + // shiftTag = true in case of double DoFs on interface! bool get_bScaleDoFs() { return m_spInterfaceHandler->get_bScaleDoFs(); } inline const bool get_bNearInterface() - { return m_spInterfaceHandler->get_bNearInterface(); } - - void set_jacobian_tri(const LocalMatrix locJ) - { m_spInterfaceHandler->set_jacobian_tri(locJ); } - void set_jacobian_quad(const LocalMatrix locJ) - { m_spInterfaceHandler->set_jacobian_quad(locJ); } + { return m_spInterfaceHandler->get_bNearInterface(); } + ///////////////////////////////////////////////////////////////////////////////////////////// + // (C) access methods for assemgling of the local defect and jacobian for + // the elem Disc 'ConvectionDiffusionFV1_cutElem': + // --> during call of 'add_jac_A_elem()' and 'add_def_A_elem()' - LocalMatrix& get_jacobian_tri() - { return m_spInterfaceHandler->get_local_jacobian_tri(); } - LocalMatrix& get_jacobian_quad() - { return m_spInterfaceHandler->get_local_jacobian_quad(); } - void set_defect_tri(const LocalVector locD) - { m_spInterfaceHandler->set_defect_tri(locD); } - void set_defect_quad(const LocalVector locD) - { m_spInterfaceHandler->set_defect_quad(locD); } + /// setter methods + void set_jacobian(const LocalMatrix locJ, const ReferenceObjectID roid) + { m_spInterfaceHandler->set_jacobian(locJ, roid); } - void reset_defect_on_interface(LocalVector& locD, const size_t size) - { m_spInterfaceHandler->reset_defect_on_interface(locD, size); } + void set_defect(const LocalVector locD, const ReferenceObjectID roid) + { m_spInterfaceHandler->set_defect(locD, roid); } - void reset_jacobian_on_interface(LocalMatrix& locJ, const size_t size) - { m_spInterfaceHandler->reset_jacobian_on_interface(locJ, size); } + /// getter methods + LocalMatrix& get_jacobian(const ReferenceObjectID roid) + { return m_spInterfaceHandler->get_local_jacobian(roid); } - LocalVector& get_defect_tri() - { return m_spInterfaceHandler->get_local_defect_tri(); } - LocalVector& get_defect_quad() - { return m_spInterfaceHandler->get_local_defect_quad(); } + LocalVector& get_defect(const ReferenceObjectID roid) + { return m_spInterfaceHandler->get_local_defect(roid); } - LocalVector& get_solution_tri() - { return m_spInterfaceHandler->get_local_solution_tri(); } - LocalVector& get_solution_quad() - { return m_spInterfaceHandler->get_local_solution_quad(); } + LocalVector& get_solution(const ReferenceObjectID roid) + { return m_spInterfaceHandler->get_local_solution(roid); } + + /// reset methods + void reset_defect_on_interface(LocalVector& locD, const size_t size) + { m_spInterfaceHandler->reset_defect_on_interface(locD, size); } + void reset_jacobian_on_interface(LocalMatrix& locJ, const size_t size) + { m_spInterfaceHandler->reset_jacobian_on_interface(locJ, size); } - void set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, const int orientation) - { return m_spInterfaceHandler->set_local_sol(solU, size, lvec, orientation); } - + + + ///////////////////////////////////////////////////////////////////////////////////////////// + // (D) access methods for local assembling of the boundary conditions on the + // immersed interface into the defect and jacobian for the elem Disc + // 'ConvectionDiffusionFV1_cutElem' + // --> during call of 'add_jac_A_elem()' and 'add_def_A_elem()' + + // getter methods number get_diffusion() - { return m_spInterfaceHandler->get_diffusion(); } + { return m_spInterfaceHandler->get_diffusion(); } number get_diffusion(const bool bElementIsOutside) - { return m_spInterfaceHandler->get_diffusion(bElementIsOutside); } + { return m_spInterfaceHandler->get_diffusion(bElementIsOutside); } + + // setter methods (called by ConvectionDiffusionFV1_cutElem::get_local_data() ) + void set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, + const int orientation) + { return m_spInterfaceHandler->set_local_sol(solU, size, lvec, orientation); } + + void set_jump_values(LocalVector& jumpOut, LocalIndices ind, const size_t size) + { m_spInterfaceHandler->set_jump_values(jumpOut, ind, size); } - LocalVector set_jump_values(LocalIndices ind, const size_t size) - { return m_spInterfaceHandler->set_jump_values(ind, size); } - LocalVector set_jump_grad_values(LocalIndices ind, const size_t size) - { return m_spInterfaceHandler->set_jump_grad_values(ind, size); } - // 'set_source' instance used for diffusion elem disc - LocalVector set_source(const std::vector sourceIm, LocalIndices ind, const size_t size, const bool bElementIsCut) - { return m_spInterfaceHandler->set_source(sourceIm, ind, size, bElementIsCut); } - // 'set_source' instance used for navier stokes elem disc - LocalVector set_source(LocalIndices ind, const size_t size, const bool bElementIsCut) - { return m_spInterfaceHandler->set_source(ind, size, bElementIsCut); } + void set_jump_grad_values(LocalVector& jumpGradOut, LocalIndices ind, const size_t size) + { m_spInterfaceHandler->set_jump_grad_values(jumpGradOut, ind, size); } - // methods for Nitsche - void print_Nitsche_Data() - { return m_spInterfaceHandler->print_Nitsche_Data(); } - number vAlpha(size_t i, size_t j){ return m_spInterfaceHandler->vAlpha(i, j); } - MathVector vIntersectionPnts(size_t i){ return m_spInterfaceHandler->vIntersectionPnts(i); } - MathMatrix ShapeValues(){ return m_spInterfaceHandler->vShapeValues(); } - MathVector NormalToFace(){ return m_spInterfaceHandler->NormalToFace(); } - number Gamma(){ return m_spInterfaceHandler->Gamma(); } - number Area(){ return m_spInterfaceHandler->Area(); } - number AreaOrig(){ return m_spInterfaceHandler->AreaOrig(); } - number AreaScale(){ return m_spInterfaceHandler->AreaScale(); } - number IntegralGamma(size_t i){ return m_spInterfaceHandler->IntegralGamma(i); } + // 'set_source' instance used for diffusion elem disc + void set_source(const std::vector sourceIm, LocalVector& sourceOut, LocalIndices ind, + const size_t size, const bool bElementIsCut) + { m_spInterfaceHandler->set_source(sourceIm, sourceOut, ind, size, bElementIsCut); } - void print_InterfaceIDdata() - { return m_spInterfaceHandler->print_InterfaceIDdata(); } + + ///////////////////////////////////////////////////////////////////////////////////////////// + // (E) methods for Nitsche + void print_Nitsche_Data() { return m_spInterfaceHandler->print_Nitsche_Data(); } + number vAlpha(size_t i, size_t j) { return m_spInterfaceHandler->vAlpha(i,j); } + MathVector vIntersectionPnts(size_t i) { return m_spInterfaceHandler->vIntersectionPnts(i); } + MathMatrix ShapeValues() { return m_spInterfaceHandler->vShapeValues(); } + MathVector NormalToFace() { return m_spInterfaceHandler->NormalToFace(); } + number Gamma() { return m_spInterfaceHandler->Gamma(); } + number Area() { return m_spInterfaceHandler->Area(); } + number AreaOrig() { return m_spInterfaceHandler->AreaOrig(); } + number AreaScale() { return m_spInterfaceHandler->AreaScale(); } + number IntegralGamma(size_t i) { return m_spInterfaceHandler->IntegralGamma(i); } /// called during 'ParticleBndCond::add_def_M_local()': @@ -1154,10 +1127,11 @@ class DimFV1CutGeometry : public FVGeometryBase bool mElemModus; - /// set the local interface handler - /// (called during constructor of class 'MovingInterface') + /// set the local interface handler + /// (called during constructor of class 'ImmersedInterface') void set_interface_handler(SmartPtr localHandler) - { m_spInterfaceHandler = localHandler; } + { m_spInterfaceHandler = localHandler; } + ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -1373,9 +1347,6 @@ class DimFV1CutGeometry : public FVGeometryBase SmartPtr m_spInterfaceHandler; bool m_bIsFlatTopElement; - - std::vector m_vBF; // updated during FV1CutGeom::update_inner_boundary_faces() - }; diff --git a/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.cpp b/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.cpp index dfe6a3256..dd4e986b3 100644 --- a/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.cpp +++ b/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.cpp @@ -1,4 +1,3 @@ - /* * Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt * Author: Andreas Vogel @@ -1589,7 +1588,7 @@ update(GridObject* pElem, const MathVector* vCornerCoords, const ISubs if(m_spInterfaceHandler->elementModus() == CUT_BY_INTERFACE) { update_inner_boundary_faces(); - m_spInterfaceHandler->update_inner_boundary(m_spInterfaceHandler->corners()); + m_spInterfaceHandler->update_inner_boundary(vCornerCoords); } else if(m_spInterfaceHandler->elementModus() == CUT_BY_2_INTERFACE) diff --git a/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.h b/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.h index 8b577da48..0cce6c2d6 100644 --- a/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.h +++ b/ugbase/lib_disc/spatial_disc/disc_util/fv1FT_geom.h @@ -991,7 +991,8 @@ class DimFV1FTGeometry : public FVGeometryBase inline void set_element_modus(bool boolian) { mElemModus = boolian;} inline const bool get_element_modus() { return mElemModus;} inline const ReferenceObjectID get_roid() const {return m_roid;} - + inline ElementModus return_element_modus() { return m_spInterfaceHandler->elementModus(); } + /// called during 'ParticleBndCond::add_def_M_local()': const number volume_fem_elem() const {UG_THROW("FV1FTGeom::volume_fem_elem() not implemented!\n");} const number volume_FT_elem() const {UG_THROW("FV1FTGeom::volume_FT_elem() not implemented!\n");} @@ -1001,7 +1002,7 @@ class DimFV1FTGeometry : public FVGeometryBase bool mElemModus; /// set the local interface handler - /// (called during constructor of class 'MovingInterface') + /// (called during constructor of class 'ImmersedInterface') void set_interface_handler(SmartPtr localHandler) { m_spInterfaceHandler = localHandler; } diff --git a/ugbase/lib_disc/spatial_disc/elem_disc/elem_disc_assemble_util.h b/ugbase/lib_disc/spatial_disc/elem_disc/elem_disc_assemble_util.h index b0960f40d..50c394652 100644 --- a/ugbase/lib_disc/spatial_disc/elem_disc/elem_disc_assemble_util.h +++ b/ugbase/lib_disc/spatial_disc/elem_disc/elem_disc_assemble_util.h @@ -801,7 +801,7 @@ class StdGlobAssembler // reset contribution of this element locD = 0.0; - + // loop all time points and assemble them for(size_t t = 0; t < vScaleStiff.size(); ++t) { @@ -825,7 +825,7 @@ class StdGlobAssembler spAssTuner->modify_LocalData(locTimeSeries, locD, tmpLocD, locU, dd, t); } UG_CATCH_THROW("Cannot modify local solution."); } - + // Assemble M try { @@ -834,7 +834,7 @@ class StdGlobAssembler locD.scale_append(vScaleMass[t], tmpLocD); } UG_CATCH_THROW("(instationary) AssembleDefect: Cannot compute Defect (M)."); - + // Assemble A try { @@ -844,13 +844,11 @@ class StdGlobAssembler Eval.add_def_A_elem(tmpLocD, locU, elem, vCornerCoords, PT_INSTATIONARY); locD.scale_append(scale_stiff, tmpLocD); } - if(t == 0) Eval.add_def_A_elem(locD, locU, elem, vCornerCoords, PT_STATIONARY); } UG_CATCH_THROW("(instationary) AssembleDefect: Cannot compute Defect (A)."); - // Assemble defect for explicit reaction_rate, reaction and source if( t == 1 ) // only valid at lowest timediscretization order { @@ -866,7 +864,6 @@ class StdGlobAssembler locD.scale_append(dt, tmpLocD); } - // Assemble rhs try { diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/Info File 1 b/ugbase/lib_disc/spatial_disc/immersed_util/Info File 1 index 7e9ce4a66..c02b54921 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/Info File 1 +++ b/ugbase/lib_disc/spatial_disc/immersed_util/Info File 1 @@ -2,22 +2,23 @@ /* Info File for 'ImmersedInterface' class: */ -The 'ImmersedInterface' class provides functionality to assemble FE or FV discretisations with immersed interfaces, i.e. boundaries, which are NOT resolved by the given mesh. One possible application is the case, in which the outer boundary of the domain has a special, non-polygonal shape. It is a common approach to embed this into a regular, polygonal shaped domain. The grid of that domain will contain finite elements, which are cut by the interface. Another application are moving boundaries, where it would be too expensive, to remesh the grid in order to conform the geometry inheriting the moving interface. In all cases, the challenge is to derive a numerical scheme on elements, which are cut by the interface and only a part of the finite elment of the background mesh is relevant for the physical problem. +The 'ImmersedInterface' class provides functionality to assemble FE or FV discretisations with immersed interfaces, i.e. boundaries, which are NOT resolved by the given mesh. One possible application is the case, in which the outer boundary of the domain has a special, non-polygonal shape. It is a common approach to embed this into a bigger, regular and polygonal shaped domain. The grid of that domain will contain finite elements, which are cut by the interface. Another application are moving boundaries, where it would be too expensive, to remesh the grid in order to conform the geometry inheriting the moving interface. In all cases, the challenge is to derive a numerical scheme on elements, which are cut by the interface and only a part of the finite elment of the background mesh is relevant for the physical problem. -There are many methods in the FE and FV community to handle the described case of immersed interfaces and resulting cut finite elements. The CutFEM method (mainly developed by P. Hansbo [1], E. Burman [2]) and also the XFEM method described by Reusken [3] derives a kind of 'ficiticious domain method'. It is 'ficticious', since the original shape functions w.r.t. the non-cut domain of the background mesh are used for the discretisation. Appropriate enrichment shape functions are defined on these non-confoming elements. In order to compute the physics in the smaller domain cut by the interface, the support of the shape functions get reduced to the relevant part. +There are many methods in the FE and FV community to handle the described case of immersed interfaces and resulting cut finite elements. The CutFEM method (mainly developed by P. Hansbo [1], E. Burman [2]) and also the XFEM method described by Reusken [3] derives a kind of 'ficticious domain method'. It is 'ficticious', since the original shape functions w.r.t. the non-cut domain of the background mesh are used for the discretisation. Appropriate enrichment shape functions are defined on these non-confoming cut elements. In order to compute the physics in the smaller domain cut by the interface, the support of the shape functions gets reduced to the relevant part. Another strategy is to introduce discontinuous shape functions on the cut elements which provide a jump at the interface and enables to capture jump boundary conditions on the immersed interface. These cathegory of methods was mainly developed for applicaton to crack simulations, see [4]. -The approach followed by the 'ImmersedInterface' class implementation relies on the idea of the CutFEM or XFEM methods and sets up an enriched function space on the cut elements. But the difference to these methods is to do it in a conforming way: Instead of reducing the support of the 'standard' shape functions, 'new' shape functions on the cut part of the element are defined which conform the interface. It is simply a conforming finite element space w.r.t. the interface adapted mesh. A "virtually"-interface-adapted mesh will be used for the discretisation. By means of that enrichment construction, no remeshing will be performed, but the new shape functions are added locally (on the fly during the finite element discretisation) via appropriate adaptations on the cut element. The background mesh remains unchanged. The method is described in [5] and was applied to elliptic problems with discontinuous coefficient [5] and fluid-particle interaction [6], [7]. +The approach followed by the 'ImmersedInterface' class implementation relies on the idea of the CutFEM or XFEM methods [1]m [2]m [3] and sets up an enriched function space on the cut elements. However, the difference to these methods is to do it in a conforming way: Instead of reducing the support of the 'standard' shape functions (as described above), 'new' shape functions on the cut part of the element are defined which conform the interface. It is simply a conforming finite element space w.r.t. the interface adapted mesh. As consequence, a "virtual" interface-adapted mesh will be used for the discretisation. By means of that enrichment construction, no remeshing will be performed, but the new shape functions are added locally (on the fly during the finite element discretisation) via appropriate adaptations on the cut element. The background mesh remains unchanged. The method is described in [5] and was applied to elliptic problems with discontinuous coefficient [5] and fluid-particle interaction [6], [7]. In order to enrich the function spaces on the cut elements, certain adaptations within the finite element implementations need to be done. That is described in the following. Within the UG4 framework the common strategy of an element based assembling is applied. A loop over all grid elements finally provides the discretisation of the whole domain. In particular, the discretisation is described locally for an arbitrary element and applied in an analogous fashion for each element of the mesh (='ElemDisc' class). All data that needs to be known by the finite element discretisation 'ElemDisc' gets stored in the template class TFVGeom, a so called finite element geometry type. The main and defining ingredient to define and set up the TFVGeom data structure are the corners of an element as input. Derived from that geometrical information such as volume, location of integration points, direction and length of normals, direction and length of gradiens etc. are computed and stored (see ugcore/ugbase/lib_disc/spatial_disc/disc_util for many instantiations of a geometry types). In order to provide the enriched local space w.r.t. the cut element as described above, the adaptation is quite simple by means of the described element geometry class TFVGeom. -The 3 main comoponents are: -(1) For each cut element the additional corners due to the intersection of the interface with the edges of the original element need to be computed. +The 3 main components are: + +(1) Computation of the intersection points of the immersed interface with the edges of the original element. Those form the NEW corners of the cut element. (2) Collecting those intersection point and joining them with those original nodes (into a counter-clockwise ording), which lie inside the domain FULLY DEFINE the adapted element to set up the discretisation on the cut element (see drawings below). -(3) Define a mapping for the newly created DoFs from local assembling indices onto global indices of the DoFs. +(3) Define a mapping for the newly created DoFs (intersection points) from local assembling indices onto global indices of the DoFs. @@ -56,7 +57,7 @@ ______ -To perform the described adaptations and provide the data for the assembling of the numerical scheme within UG4, the MovingInterface class needs to provide the following functionality: +To perform the described adaptations and provide the data for the assembling of the numerical scheme within UG4, the 'ImmersedInterface' class needs to provide the following functionality: (a) Methods to compute the intersection points of the interface with the element edges @@ -64,18 +65,20 @@ To perform the described adaptations and provide the data for the assembling of (c) Methods to define new local and global indices of the new DoFs for acces during assembling (d) Methods to access the cut element data (e) Methods to hand over these data to the local-to-global mapper -(f) Definition of a mapping of the new local indices/DoFs onto the new OR old global indices/DoFs (depeding on the method: flat top or 2 sided, see (*)). This is done by the local-to-global mapper. For comments on that, see the 'Info File' for the local-to-global mapper. +(f) Definition of a mapping of the new local indices/DoFs onto the new OR old global indices/DoFs (depeding on the method: flat top or 2 sided, see (*)). This is done by the local-to-global mapper. For comments on that, see also the 'Info File 2' within this folder and the 'Info File' for the local-to-global mapper. (*) Depending on the choice of the local-to-global mapping (task (3)), the ansatz space on a cut element will differ. In UG4 two different variants are implemented: -(1) In the 'MovingParticle' derivation of the 'ImmersedInterface' class, the intersection points of an element will be mapped onto the original vertex, which lies on the same cut element, but outside the domain (across the interface). In the picture below, the two 'plus'-nodes will be algebraically mapped, i.e. associated, with the 'minus'-node on the triangle. Mathematically, the result is a so called „flat top“ ansatz space, since the solution will be piecewise constant along the linear part of the interface cutting the element. +(1) In the 'ImmersedInterfaceDiffusion' derivation of the 'ImmersedInterface' class, all intersection points of a cut element will be maped to individual DoFs. These DoFs need to be created newly into the global algebra, if the algebra does not provide them based on the original (typically smaller dimensional) grid. The resulting ansatz space is a boundary fitted space, which conforms the immersed boundary. Usually, the number of DoFs in the matrix for the jacobian and the vector for the solution and defect needs to be increased. The class provides methods to handle that in an initialisation phase. The resulting ansatz space is a boundary fitted space, which conforms the immersed boundary. + + +(2) In the 'MovingParticle' derivation of the 'ImmersedInterface' class, the intersection points of an element will be mapped onto the original vertex, which lies on the same cut element, but outside the domain (across the interface). In the picture above, the two 'plus'-nodes will be algebraically mapped, i.e. associated, with the 'minus'-node on the triangle. Mathematically, the resulting space is a so called "flat top" space, since it results in piecewise constant solutions along the connecting hyperplane between these intersection points. In the picture below, the two 'plus'-nodes will be algebraically mapped, i.e. associated, with the 'minus'-node on the triangle. -(2) In the 'ImmersedInterfaceDiffusion' derivation of the 'ImmersedInterface' class, all intersection points of a cut element will be maped to individual DoFs. These DoFs need to be created newly into the global algebra, if the algebra does not provide them based on the original (typically smaller dimensional) grid. The resulting ansatz space is a boundary fitted space, which conforms the immersed boundary. Usually, the number of DoFs in the matrix for the jacobian and the vector for the solution and defect needs to be increased. The class provides methods to handle that in an initialistion phase. -The 5 main components of the MovingInterface class are the following sub classes: +The 5 main components of the 'ImmersedInterface' class are the following sub classes: (I) InterfaceProvider (II) CutElementHandler, providing (a),(d) @@ -86,7 +89,7 @@ The 5 main components of the MovingInterface class are the following sub classes (I) InterfaceProvider: -The InterfaceProvider simply stores main data defining the interface, such as location, associated solution values etc. +The InterfaceProvider simply stores main data defining the interface, such as its location, associated solution values etc. (II) CutElementHandler: diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/Info File 2 b/ugbase/lib_disc/spatial_disc/immersed_util/Info File 2 index e69de29bb..9ebb89f5e 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/Info File 2 +++ b/ugbase/lib_disc/spatial_disc/immersed_util/Info File 2 @@ -0,0 +1,70 @@ +/* Info File on the influence of the local-to-global mapping on the mathematical ansatz space */ + + +Depending on the choice of the local-to-global mapping, the ansatz space on a cut element will differ: +On a cut element, in the first assembling step, local couplings will be computed for ALL the intersection points of the interface with the edges of the cut element. That is, to apply the usual discretisation scheme for the new TFVGeom object. The mapping of these couplings to its associated global indices finally defines the property of the underlying finite element space. In UG4 two different variants are implemented: + + +Case 1: Each coupling is mapped to its own, designated global index, i.e. DoF. The resulting space will be the usual finite element space w.r.t. the interface adaped grid. It contains additional nodes along the interface and (virtually) consists of cut elements and original elements. The resulting ansatz space is a boundary fitted space, which conforms the immersed boundary. + +Case 2: The local coupling of an intersection point is mapped onto the global index of the original node, which lies accross the interface, but on the corner of the same element. The resulting finite element space will potentially be smaller than the one of the cut element, since two and more (in 3d) intersection points can share the same node accross the interface. The resulting space is a so called "flat top" space, since it results in piecewise constant solutions along the connecting hyperplane between these intersection points. In the picture below, the two 'plus'-nodes will be algebraically mapped, i.e. associated, with the 'minus'-node on the triangle. + + + +The 'ParticleMapper' class of the 'MovingParticle' derivation of the 'ImmersedInterface' class, is of type case 2: +It maps all couplings of intersection points to the same translational (and in analogy to the rotational) global index. Therefore, the 'ParticleMapper' is a flat-top mapper. + +In contrast, the 'DiffusionInterfaceMapper' is of type case 1: +In particular, it is a tow-sided mapper (see the depicted two 'configurations' below) and the resulting space is an interface adapted space. + + + + +Original element without interface: 3 corners and standard DoFs, depicted by '*': + + * + / \ + / \ + / \ + / \ + / \ + / \ + / \ +* _____________ * + + +Assume, that an interface cuts the original element, such that it gets devided into the upper triangle (which we define as lying accross the interface, i.e. outside the domain) and the lower quadrilateral (which we define as inside the domain). The two lower corners are still DoFs of the system. In order to describe the cut element, i.e. the quadrilateral, we add the two intersection points as new corners, depicted by '+' and remove the upper corner. +==> inserting those four coordinates into the element geometry class TFVGeom will directly realize the function space on the adapted element. + + + +First configuration of the TWO-SIDED case: + + + - + / \ + /out\ +.....+.....+..... = interface + / \ + / \ + / inside \ + / domain \ +* _____________ * + + + + +Second configuration of the TWO-SIDED case: + + * + / \ + / in\ +.....+.....+..... = interface + / \ + / \ + / outside \ + / domain \ +- _____________ - + + + diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 1 b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 1 index 0217dde0f..84137733b 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 1 +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 1 @@ -1,32 +1,33 @@ /* Info File for 'CutElementHandlerBase' class: */ -There are 3 cathegories of elements --> 'ElementModus': +There are 4 categories of elements --> 'ElementModus': - INSIDE_DOM: all vertices lie inside the domain, i.e. 'is_outsideDomain(vrt) = false' - OUTSIDE_DOM: all vertices lie outside the domain, i.e. 'is_outsideDomain(vrt) = true' - CUT_BY_INTERFACE: vertices lie inside AND outside the domain +- CUT_BY_2_INTERFACE: vertices lie inside the domain AND outside of two different parts of the domain OR only outside of two different parts of the domain - -There are 4 cathegories of vertices --> 'VertexModus': +There are 3 categories of vertices --> 'VertexModus': - INSIDE: 'is_outsideDomain(vrt) = false' - OUTSIDE: 'is_outsideDomain(vrt) = true' - ON_INTERFACE: 'is_nearInterface(vrt) = true' OR - 'is_outsideDomain(vrt) = true' && for element, containing vrt: CUT_BY_INTERFACE -- NEAR_INTERFACE: 'is_nearInterface(vrt) = true' + 'is_outsideDomain(vrt) = true' && vrt lies on an element which is 'CUT_BY_INTERFACE' The following relations derive from their categorisation: -NEAR_INTERFACE is contained in ON_INTERFACE is contained in OUTSIDE + ON_INTERFACE is contained in OUTSIDE + +REMARK 1: Only ON_INTERFACE-vertices, which are 'no'(!) OUTSIDE-vertices count as DoFs of the according domain. + That is the reason, why they are taged separately. -REMARK: Only the ON_INTERFACE-vertices, which are 'no'(!) OUTSIDE-vertices count as DoFs of the according domain. - That is the reason, why they are tages separately. +REMARK 2: The near-interface vertices are a subset of the ON_INTERFACE vertices. They are treated similarly. But since there is no need to compute an intersection point ( the discrete interface is moved onto these points, since the computation of the real cut would result in small cut elements), its distinction via the boolian 'is_nearInterface(vrt)' and the assocated BoolMarker 'm_spNearInterfaceVrtMarker' is provided. @@ -37,26 +38,26 @@ The 3 main methods in the class provide access to the information on the VertexM - bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) -The 'ElementModus' and 'VertexModus' are stored in data for local and global access. +The 'ElementModus' and 'VertexModus' are stored in data for LOCAL and GLOBAL access. ----> For the local access and only the element, which is currently assembled: +---> For the LOCAL access and only the element, which is currently assembled: 'ElementModus': in 'm_ElementModus' 'VertexModus': in 'm_vvVertexModus' ----> For the global access and valid until the interface may change location due to motion: +---> For the GLOBAL access and valid until the interface may change location due to motion: - 'ElementModus': 'In the associated 'BoolMarker': + 'ElementModus': In the associated 'BoolMarker': - INSIDE in 'm_spInsideMarker' - OUTSIDE in 'm_spOutsideMarker' - CUT_BY_INTERFACE in 'm_spCutMarker' - 'VertexModus': 'In the associated 'BoolMarker': + 'VertexModus': In the associated 'BoolMarker': - INSIDE in 'm_spInsideMarker' - OUTSIDE in 'm_spOutsideMarker' - ON_INTERFACE in 'm_spInterfaceVrtMarker' - - NEAR_INTERFACE in 'm_spNearInterfaceVrtMarker' + ( - near interface (no distinguished VertexModus) in 'm_spNearInterfaceVrtMarker') For methods, which need to loop over all cut elements, these elements are also stored in according lists: @@ -69,6 +70,7 @@ REMARK: The first index of the double-vector inherits the level-index in case of The second index is simply the counter for the element. + The main methods, which are used for the computation of the cut element data (via 'compute_element_modus()') are: - bool is_outsideDomain(Vertex* vrt, const number threshold = 1e-10); @@ -88,10 +90,13 @@ Further remarks: - It is possible to change the orientation of the interface, via 'set_orientation()'. => All computations of the cut element data will be switched accordingly + +- for orientation = 1 and a circular interface, the inside of the circle will lie outside the domain + - For a two-sided interface, i.e. where both parts of the interface are part of the computational domain, all computations can be done for each orientation once ( see for example the ImmersedInterfaceDiffusion implementation) -- + diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 2 b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 2 index e30ecda8f..84ac265cc 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 2 +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/Info File 2 @@ -1,9 +1,39 @@ -/* Info File for 'CutElementHandlerFT' and 'CutElementHandlerImmersed' class: */ +/* Info File for 'CutElementHandler_FlatTop' and 'CutElementHandler_TwoSided' class: */ The two derived classes contain additional data: - They inherit the special instance 'ParticleProvider' as interface provider. -- They inherit special methods to acces infos of the according interface provider. + +- They inherit special methods to acces infos of the according 'InterfaceProvider' class. + - Since the 'ParticleProvider' can hold many particles, the index of a particle is an additional parameter: => the element lists get a third index for the particle index: m_vvvElemList - => methods for access: get_prtIndex() and get_prtIndex(dof) \ No newline at end of file + => new methods for access: get_prtIndex() and get_prtIndex(dof) + + + + +Further remarks to 'CutElementHandler_FlatTop' class: + +- The class is member of the 'MovingParticle' class. In a moving particle simulation, the domain of a particle contains arbitrary many vertices, which algebraically act as DoFs. Since the particle only possesses the translational and rotational velocity as parameter, only 3 (for 2 space dimensions) or 6 (for 3 space dimensions) DoFs need to be associated to the particle domain. + +- Beside cut element information, also information on the global indices of those DoFs needs to be computed and provided. + +- During initilisation of the inteface, not only the BoolMarker and element lists are set up, but also the global indices for transVel und rotVel: --> additional method 'update_global_indices()' + +New class member: + 'm_vvvGlobalIndices_linearVel' and 'm_vvvGlobalIndices_linearVel' + + + + +Further remarks to 'CutElementHandler_TwoSided' class: + +- The class is member of the 'ImmersedInterfaceDiffusion' class. For the application of elliptic problems with discontinuous coefficients, the domain on BOTH sides of the interface in part of the physical domain. + +- The cut element assembling process needs to be performed TWICE: + --> first: for orientation = 1 and on the according cut part of the element + --> second: for orientation = -1 and on the according cut part of the element + +New class member: + 'm_MapNearVertices' and 'm_verticesNearPos' \ No newline at end of file diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h index 0a3b09cdd..e4838de7f 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler.h @@ -1,3 +1,4 @@ + /* * interface_handler_local.h * @@ -10,12 +11,14 @@ #include "lib_grid/multi_grid.h" #include "lib_disc/function_spaces/grid_function.h" +#include "../interface_provider/interface_provider_base.h" #include "../interface_provider/interface_provider_diffusion.h" #include "../interface_provider/interface_provider_particle.h" + #ifdef UG_PARALLEL - #include "pcl/pcl_communication_structs.h" - #include "pcl/pcl_process_communicator.h" +#include "pcl/pcl_communication_structs.h" +#include "pcl/pcl_process_communicator.h" #endif namespace ug{ @@ -50,14 +53,23 @@ class ICutElementHandler /// destructor ~ICutElementHandler() {} - ElementModus get_element_modus(GridObject* elem) - { UG_THROW("in 'ICutElementHandler::get_element_modus()' : needs to be implemented by derived class!\n");} - - ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation) +// computes the modus of the element as cut or non-cut (= inside or outside of the domain) + ElementModus compute_element_modus(GridObject* elem) { UG_THROW("in 'ICutElementHandler::compute_element_modus()': needs to be implemented by derived class!\n");} - bool is_FTVertex(Vertex* vrt, size_t vrtIndex) - { UG_THROW("in 'ICutElementHandler::is_FTVertex()': needs to be implemented by derived class!\n");} +// returns the computed element modus, which is either stored as element bool marker, or locally +// as property of the element + ElementModus get_element_modus(GridObject* elem) + { UG_THROW("in 'ICutElementHandler::get_element_modus()' : needs to be implemented by derived class!\n");} + + +// methods used to get the 'VertexModus' of a vertex +// REMARK: 2 arguments: +// Vertex* vrt: for global acces via BoolMarker +// size_t vrtIndex: for local access via m_vvVertexModus + + bool is_onInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { UG_THROW("in 'ICutElementHandler::is_onInterfaceVertex()': needs to be implemented by derived class!\n");} bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) { UG_THROW("in 'ICutElementHandler::is_OutsideVertex()': needs to be implemented by derived class!\n");} @@ -65,629 +77,787 @@ class ICutElementHandler bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) { UG_THROW("in 'ICutElementHandler::is_nearInterfaceVertex()': needs to be implemented by derived class!\n");} - virtual number get_LSvalue_byPosition(MathVector vrtPos) - { UG_THROW("in 'ICutElementHandler::get_LSvalue_byPosition()': needs to be implemented by derived class!\n");} - - virtual number get_LSvalue(Vertex* vrt, const int prtIndex) - { UG_THROW("in 'ICutElementHandler::get_LSvalue()': needs to be implemented by derived class!\n");} - + + }; - template -class CutElementHandlerFlatTop : public ICutElementHandler +class CutElementHandlerBase : public ICutElementHandler { - -public: + public: /// world Dimension - static const int dim = TWorldDim; - - /// Type of position coordinates - typedef MathVector position_type; + static const int dim = TWorldDim; + /// Type of position coordinates + typedef MathVector position_type; + /// Type of Position Attachment - typedef Attachment position_attachment_type; - - struct ParticleData { - MathVector center; - MathVector transVel; - MathVector rotVel; - bool valid; - }; - - // struct CombinedParticleData { - // std::vector data; - // }; - typedef std::vector CombinedParticleData; + typedef Attachment position_attachment_type; + + + /// Type of Accessor to the Position Data Attachment + typedef Grid::VertexAttachmentAccessor position_accessor_type; + + typedef typename domain_traits::grid_base_object grid_base_object; + + /// constructor: + + // REMARK: due to call of the call of the methog 'm_spInterfaceProvider->get_LSvalue_byPosition()', + // the interfaceProvider needs to be specified already by the constructor! + // --> the call of 'get_LSvalue_byPosition()' will be forwarded by 'InterfaceProviderBase' + // to the derived class! + CutElementHandlerBase(SmartPtr mg, SmartPtr > interfaceProvider); + CutElementHandlerBase(SmartPtr mg, SmartPtr > interfaceProvider); + CutElementHandlerBase(SmartPtr mg, SmartPtr > interfaceProvider); + + /// destructor + virtual ~CutElementHandlerBase() {} - /// Type of Accessor to the Position Data Attachment - typedef Grid::VertexAttachmentAccessor position_accessor_type; + ////////////////////////////////////////////////////////// + /// init for time dependent update and initialisation: + ////////////////////////////////////////////////////////// + + /// calls 'copy_solution(topLevel) - update_for_multigrid(baseLev-topLev) - update_solution(topLevel)' + template + void init(ConstSmartPtr dd, const int baseLevel, const int topLevel); + + /// sets all BoolMarker and fills the 'm_vvElemList...' + virtual void update_interface_data(ConstSmartPtr dd, const int levIndex); + /// resets all boolmarker of this class; called during update_interface_data(); necessary for time-dependent case + void clear_bool_marker(); - typedef typename domain_traits::grid_base_object grid_base_object; + /// initializes crucial data for all cut element computations + /// especially'ElementModus' and 'VertexModus' categories + virtual void update_multigrid_data(ConstSmartPtr dd, const int levIndex) + { update_interface_data(dd, levIndex); } - /// list of element needed for looping cut OR all elements of a particle - typedef std::vector > vvElemList; + ////////////////////////////////////////////////////////// + /// virtual base class methods: + ////////////////////////////////////////////////////////// - /// default constructor: - CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, - SmartPtr > interfaceProvider); - CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, - SmartPtr > interfaceProvider); + // basic methods to compute the modus of an element and a vertex: - /// destructor - ~CutElementHandlerFlatTop() {} + /// returns boolian for 'does 'vrt' lie near interface?' + virtual bool is_outsideDomain(Vertex* vrt); + /// returns boolian for 'does 'vrt' lie outside the domain?' + virtual bool is_nearInterface(Vertex* vrt); + + // methods needed during call of 'is_outsideDomain(), 'is_nearInterface()' + // computes the 'level-set' value of a point w.r.t. the interface, in order to + // derive its 'VertexModus', i.e. INSIDE, OUTSIDE, ON_INTERFACE + // --> evaluate the distance between a vrt and the interface + number get_LSvalue(Vertex* vrt) + { return get_LSvalue_byPosition(m_aaPos[vrt]); } + + virtual number get_LSvalue_byPosition(MathVector vrtPos) = 0; + + ////////////////////////////////////////////////////////// + /// (1A) 'compute' and (1B) 'get' the 'ElementModus': - /// calls 'copy_solution(topLevel) - update_for_multigrid(baseLev-topLev) - update_solution(topLevel)' - template - void init(ConstSmartPtr dd, const int baseLevel, const int topLevel); - - void update_global_indices(ConstSmartPtr dd, const int levIndex); - void update_marker(ConstSmartPtr dd, const int levIndex); - void print_elem_lists(ConstSmartPtr dd); - void update_interface(const int topLevel, number deltaT); - /// returns the levIndex of the corresponding gridLevel within 'm_Map' - void update_multigrid_data(ConstSmartPtr dd, const int levIndex); - - /// computing the element modus ONCE and marks according BoolMarker (called by 'InterfaceHandlerLocalParticle::update_marker()') - ElementModus compute_element_modus(int prtIndex, GridObject* elem, const int interfaceOrientation); - ElementModus compute_element_modus(int prtIndex, GridObject* elem) - { return compute_element_modus(prtIndex, elem, 1); } - ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation); - ElementModus compute_element_modus(GridObject* elem) - { return compute_element_modus(elem, 1); } - /// derives the 'ElementModus' from the boolian of the BoolMarker - ElementModus get_element_modus(GridObject* elem); + // (1A) computes the modus of the element as cut or non-cut + // (= inside or outside of the domain) and marks according BoolMarker + virtual ElementModus compute_element_modus(GridObject* elem); - /// checks if grid data is updated and returns 'levIndex'-pair for 'gridLevel' in 'm_Map' - int get_Index(const GridLevel& gridLevel, ConstSmartPtr dd); + // (1B) returns the computed element modus: + // (1) local access by member 'm_elementModus' + // (2) global acces via 'GridObject* elem' as parameter (can be stored using BoolMarker for elements!) + + // (1B)(1) LOCAL access method + ElementModus get_element_modus() { return m_elementModus; } + + // (1B)(2) GLOBAL acces method + ElementModus get_element_modus(GridObject* elem); // --> ToDo: siehe FT impl!! + + + /// checks if cut element data is updated and returns 'levIndex'-pair for 'gridLevel' in 'm_Map' + int get_Index(const GridLevel& gridLevel, ConstSmartPtr dd); /// only call, when you are sure, that the data is available; if NOT: THROW error! - int get_Index(const GridLevel& gridLevel); - int get_Index_old(const GridLevel& gridLevel); + int get_Index(const GridLevel& gridLevel); + + + ////////////////////////////////////////////////////////////////////////////////// + /// (2A) compute, (2B) get, (C) check the 'VertexModus': + ////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////////////// + // (2A) computes the modus of the vertex as INSIDE, OUTSIDE, ON_INTERFACE + + VertexModus compute_vertex_modus(Vertex* vrt); + + ////////////////////////////////////////////////////////////////////////////////// + // (2B) returns the computed vertex modus: + // --> LOCAL acces (only valid for the currently assembled element!) + check via 'size_t vrtIndex' + VertexModus get_vertex_modus(size_t vrtIndex, const int localInd) + { return m_vvVertexMode[localInd][vrtIndex];} + + bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex, const int interfaceOrientation) + { + size_t localInd = -0.5*interfaceOrientation + 0.5; + if ( get_vertex_modus(vrtIndex, localInd) == vrtModus ) + return true; + return false; + } - /// resets all boolmarker of this class; called during update_marker(); necessary for time-dependent case - void clear_bool_marker(); + ////////////////////////////////////////////////////////////////////////////////////////////////////////// + /// (C) base class methods 'is_onInterfaceVertex()', 'is_OutsideVertex()', 'is_nearInterfaceVertex()' + // (C1) global version via 'Vertex* vrt' (i.e. valid during whole assembling process) + // (C2) local version via 'size_t vrtIndex' (i.e. valid only for assembling process on the current element) + // (C3) combined version - /// update member 'm_spFlatTopVrtMarker' ... - bool element_is_pyramid(grid_base_object* elem); + // (C1) global version via 'Vertex* vrt' + bool is_onInterfaceVertex_globalAccess(Vertex* vrt, size_t vrtIndex) + { return m_spInterfaceVrtMarker->is_marked(vrt); } + + bool is_OutsideVertex_globalAccess(Vertex* vrt, size_t vrtIndex) + { return m_spOutsideMarker->is_marked(vrt); } + + bool is_nearInterfaceVertex_globalAccess(Vertex* vrt, size_t vrtIndex) + { return m_spNearInterfaceVrtMarker->is_marked(vrt); } + + // (C2) local version via 'size_t vrtIndex' + bool is_onInterfaceVertex_localAccess(Vertex* vrt, size_t vrtIndex) + { return !check_vertex_modus(INSIDE, vrtIndex, get_orientation()); } + + bool is_OutsideVertex_localAccess(Vertex* vrt, size_t vrtIndex) + { return check_vertex_modus(OUTSIDE, vrtIndex, get_orientation()); } + + bool is_nearInterfaceVertex_localAccess(Vertex* vrt, size_t vrtIndex) + { return check_vertex_modus(ON_INTERFACE, vrtIndex, get_orientation()); } - bool is_outsideFluid_prtIndex(const int prtIndex, Vertex* vrt); + // (C3) combined version + bool is_onInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { + if ( !m_bBoolMarkerInit ) return is_onInterfaceVertex_localAccess(vrt, vrtIndex); + else return is_onInterfaceVertex_globalAccess(vrt, vrtIndex); + } + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { + if ( !m_bBoolMarkerInit ) return is_OutsideVertex_localAccess(vrt, vrtIndex); + else return is_OutsideVertex_globalAccess(vrt, vrtIndex); + } + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { + if ( !m_bBoolMarkerInit ) return is_nearInterfaceVertex_localAccess(vrt, vrtIndex); + else return is_nearInterfaceVertex_globalAccess(vrt, vrtIndex); + } - bool is_outsideFluid(Vertex* vrt, const int interfaceOrientation); - bool is_outsideFluid(int& PrtIndex, Vertex* vrt); - bool is_outsideFluid(Vertex* vrt); - bool is_outsideFluid_inverse(Vertex* vrt); - + + ////////////////////////////////////////////////////////// + /// further base class methods: + ////////////////////////////////////////////////////////// + + // getter and setter for orientation of interface + void set_orientation(const int orientation) { m_spInterfaceProvider->set_orientation(orientation); } + const int get_orientation() const{ return m_spInterfaceProvider->get_orientation(); } - /// returns true, if 'vrt' lies inside the 'prtIndex'-th particle OR: - /// if the vrt lies outside the particle BUT near the interface, - /// i.e.'m_pNearInterfaceVrtMarker->_is_marked(vrt) = true" && 'm_spFlatTopVrtMarker->is_marked(vrt) == true' - bool set_nearInterface(Vertex* vrt, const number threshold); - bool set_nearInterface(Vertex* vrt); + // the 'threshold' defines the bandwidth around the immersed interface, in which a node + // counts as 'OUTSIDE' or 'ON_INTERFACE' during call of 'is_outside()', 'is_nearInterface() + void set_threshold(size_t level, const number threshold) + { m_vThresholdOnLevel[level] = threshold; } + + number get_threshold(Vertex* vrt) + { return m_vThresholdOnLevel[m_spMG->get_level(vrt)]; } + + // returns the number of cut Elements on the level 'levIndex': + size_t get_numCutElements(const int levIndex) + { return m_vvElemListCut[levIndex].size(); } - /// returns true, if vertex lies INSIDE fluid, BUT near to interface => no DoF - bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) - { return m_spNearInterfaceVrtMarker->is_marked(vrt); } - /// returns true, if vertex lies OUTSIDE fluid, BUT near to interface => FT-vertex - bool is_FTVertex(Vertex* vrt); - bool is_FTVertex(Vertex* vrt, size_t vrtIndex); - bool is_FTVertex( int& prtIndex, Vertex* vrt); + /////////////////////////////////////////////////////////////////////// + /// moving interface methods: + /////////////////////////////////////////////////////////////////////// - /// returns true, if vertex lies OUTSIDE fluid => no DoF - bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) - { return m_spOutsideMarker->is_marked(vrt); } - - - void set_threshold(size_t level, const number threshold) - { m_vThresholdOnLevel[level] = threshold; } - number get_threshold(Vertex* vrt) - { - const size_t lev = m_spMG->get_level(vrt); - return m_vThresholdOnLevel[lev]; - } - - size_t num_particles() const { return m_spInterfaceProvider->num_particles();} - number get_density(int prtIndex) { return m_spInterfaceProvider->get_density(prtIndex);} - MathVector get_center(int prtIndex){ return m_spInterfaceProvider->get_center(prtIndex);} - void set_center(MathVector center, int prtIndex){ m_spInterfaceProvider->set_center(center, prtIndex);} - - // careful! --> only dummy implementation, sice some methods in MovingParticle-class use it; in these cases it will be overwritten by - // the ParticleProviderSphere-class (hopefully) ;) - number get_radius(int prtIndex) { return m_spInterfaceProvider->get_radius(prtIndex);} - - /// needed eg. for 'ParticleMapper::set_identity_mat_constraint()' - bool is_extraDoF(DoFIndex dofIndex, int levIndex); - - MathMatrix get_rotationMat(MathVector radialVector); - - bool get_DoF_modus_linear(int prtIndex) { return m_spInterfaceProvider->get_DoF_modus_linear(prtIndex);} - bool get_DoF_modus_angular(int prtIndex){ return m_spInterfaceProvider->get_DoF_modus_angular(prtIndex);} - - // called during PartcleMapper::modify_GlobalSol(): - void set_extraSolTrans(number solution, size_t prtIndex, int timeSeriesInd, int cmp) - { m_spInterfaceProvider->set_linear_velocity(solution, prtIndex, timeSeriesInd, cmp); } - void set_extraSolTrans(MathVector solution, size_t prtIndex, int timeSeriesInd) - { m_spInterfaceProvider->set_linear_velocity(solution, prtIndex, timeSeriesInd); } - void set_extraSolRot(number solution, size_t prtIndex, int timeSeriesInd, int cmp) - { m_spInterfaceProvider->set_angular_velocity(solution, prtIndex, timeSeriesInd, cmp); } - void set_extraSolRot(MathVector solution, size_t prtIndex, int timeSeriesInd) - { m_spInterfaceProvider->set_angular_velocity(solution, prtIndex, timeSeriesInd); } - - /// Access methods - - std::vector get_transInd(int levIndex, int prtIndex) - { - std::vector vTransInd; - for ( size_t cmp = 0; cmp < dim; ++cmp ) - vTransInd.push_back(m_vvvGlobalIndices_linearVel[levIndex][prtIndex][cmp]); - return vTransInd; - } - std::vector get_rotInd(int levIndex, int prtIndex) - { - std::vector vRotInd; - for ( size_t cmp = 0; cmp < dim; ++cmp ) - vRotInd.push_back(m_vvvGlobalIndices_angularVel[levIndex][prtIndex][cmp]); - return vRotInd; - } - DoFIndex get_transInd_Comp(int levIndex, int prtIndex, size_t cmp) - { if ( cmp == dim ) UG_THROW("no acces to pressure index in transInd! EXIT...\n"); - return m_vvvGlobalIndices_linearVel[levIndex][prtIndex][cmp]; } - DoFIndex get_rotInd_Comp(int levIndex, int prtIndex, size_t cmp) - { if ( cmp == dim ) UG_THROW("no acces to pressure index in rotInd! EXIT...\n"); - return m_vvvGlobalIndices_angularVel[levIndex][prtIndex][cmp]; } - - - - void get_global_indices(std::vector& transInd, std::vector& rotInd, - const int levIndex, const int prtIndex) - { - transInd = get_transInd(levIndex, prtIndex); - rotInd = get_rotInd(levIndex, prtIndex); - } + // updates the location of the interface in case of a moving interface + // no base implementation provided; dependent on the specific application + void update_interface(const int topLevel, const number deltaT) + { UG_THROW("in 'CutElementHandlerBase::update_interface()': needs to be implemented by derived class!\n");} + + + /////////////////////////////////////////////////////////////////////// + /// class member + /////////////////////////////////////////////////////////////////////// - /// get solution values - MathVector get_transSol(size_t prtIndex, size_t timeSeriesInd) - { return m_spInterfaceProvider->get_linear_velocity(prtIndex, timeSeriesInd); } - MathVector get_rotSol(size_t prtIndex, size_t timeSeriesInd) - { return m_spInterfaceProvider->get_angular_velocity(prtIndex, timeSeriesInd); } - // called during PartcleMapper::modify_GlobalSol(): - void set_solution(number solution, size_t prtIndex, int timeSeriesInd, int cmp) - { m_spInterfaceProvider->set_solution(solution, prtIndex, timeSeriesInd); } + // data for geometric location access of vertices Vertex* vrt + SmartPtr m_spMG; + position_attachment_type m_aPos; ///get_solution(prtIndex, timeSeriesInd); } + /// associotion of 'GridLevel' with an 'Index' value for access to m_vvv-lists: + std::map m_Map; + + /// maximal distance, up to which a node will be couted as 'on interface' + std::vector m_vThresholdOnLevel; + + // data for LOCAL access + ElementModus m_elementModus; - int get_prtIndex() { UG_THROW("attention: member 'm_prtIndex' is only contained in 'InterfaceHandlerLocalParticle', NOT in 'CutElementHandler'!\n"); } - int get_prtIndex(size_t dof) - { - UG_THROW("attention: You want to get the particle index of an array. Make sure that the data was set!\n"); - return m_vPrtIndex[dof]; - } + // indexing: m_vVertexMode[...] = m_vvVertexMode[current Orientation][...] + std::vector m_vVertexMode; - // bool valid_prt_information(int prtIndex) { - // return particleData[prtIndex].valid; - // } + // indexing: [orientation][VertexModus] + // -> for both orientations of the interface, the cut element + // is one part of the element, inheriting according vertices + // -> their according VertexMode is stored in [][VertexModus] - void set_mpi_routine(int val) { - active_mpi_routine = val; - } + std::vector > m_vvVertexMode; -#ifdef UG_PARALLEL - void synchronize_particles(int levIndex) { + bool m_bBoolMarkerInit; - bool verbose = false; + // data for GLOBAL access + // REMARK: for explanation of the different types of vertices, elements see File! + SmartPtr m_spInterfaceVrtMarker; // marks: vertices for 'is_outside() = true' + // AND which lie on a cut element + SmartPtr m_spNearInterfaceVrtMarker; // marks: vertices for 'is_nearInterface() = true' + // i.e. potentially inside domain + SmartPtr m_spCutMarker; // marks: elements, edges, vertices + SmartPtr m_spOutsideMarker; // marks: elements, edges, vertices + // --> for vertices: 'true' for 'is_outside() = true' + // OR 'is_nearInterface() = true' + SmartPtr m_spInsideMarker; // marks: elements, edges, vertices + // --> for vertices: 'true' for 'is_outside() = false' + // ( => is_nearInterface() = false'!) -#ifdef UG_DEBUG - verbose = true; -#endif - pcl::ProcessCommunicator com; - - if (active_mpi_routine == 1) { - /////////////////////////////////////// - // Synchronisation using Allreduce // - /////////////////////////////////////// - for (size_t p = 0; p < num_particles(); ++p) - { - if (verbose) { - UG_LOG("Synchronize particle " << p << ".\n"); - UG_LOG("m_vvvElemListCut.size(): " << m_vvvElemListCut.size() << ".\n"); - UG_LOG("m_vvvElemListCut[levIndex].size(): " << m_vvvElemListCut[levIndex].size() << ".\n"); - UG_LOG("m_vvvElemListCut[levIndex][" << p << "].size(): " << m_vvvElemListCut[levIndex][p].size() << ".\n"); - } - std::vector ElemList = m_vvvElemListCut[levIndex][p]; - if (verbose) - UG_LOG("Process " << pcl::ProcRank() << ": 1_ synchronize_particles() ElemList.size(): " << ElemList.size() << "\n"); - if ( ElemList.size() == 0 ) { - // send zero vector as center to all other processes - std::vector zero_values(3*dim,0.0); - std::vector values(3*dim,0.0); - com.allreduce(&zero_values[0], &values[0], 3*dim, MPI_DOUBLE, PCL_RO_SUM); - MathVector center; - MathVector linearVelocity; - MathVector angularVelocity; - for (size_t i = 0; i < dim; ++i) { - center[i] = values[i]; - linearVelocity[i] = values[dim+i]; - angularVelocity[i] = values[2*dim+i]; - } - if (verbose) { - UG_LOG("Process " << pcl::ProcRank() << ": setting center to " << center << "\n"); - UG_LOG("Process " << pcl::ProcRank() << ": setting linear velocity to " << linearVelocity << "\n"); - UG_LOG("Process " << pcl::ProcRank() << ": setting angular velocity to " << angularVelocity << ")\n"); - } - m_spInterfaceProvider->set_center(center, p); - m_spInterfaceProvider->set_linear_velocity(linearVelocity, p, 0); - m_spInterfaceProvider->set_angular_velocity(angularVelocity, p, 0); - } else { - // send correct center value to all other processes. Since all other processes should send zeros the allreduce with PCL_RO_SUM results in the correct center values on all processes. - MathVector center = m_spInterfaceProvider->get_center(p); - MathVector linearVelocity = m_spInterfaceProvider->get_linear_velocity(p, 0); - MathVector angularVelocity = m_spInterfaceProvider->get_angular_velocity(p, 0); - std::vector values(3*dim,0.0); - for (size_t i = 0; i < dim; ++i) { - values[i] = center[i]; - values[dim+i] = linearVelocity[i]; - values[2*dim+i] = angularVelocity[i]; - } - MathVector<3*dim> new_values; - com.allreduce(&values[0], &new_values[0], 3*dim, MPI_DOUBLE, PCL_RO_SUM); - MathVector new_center; - MathVector new_linearVelocity; - MathVector new_angularVelocity; - - for (size_t i = 0; i < dim; ++i) { - new_center[i] = new_values[i]; - new_linearVelocity[i] = new_values[dim+i]; - new_angularVelocity[i] = new_values[2*dim+i]; - } - if (verbose) - UG_LOG("Process " << pcl::ProcRank() << ": setting center to " << new_center << "\n"); - m_spInterfaceProvider->set_center(new_center, p); - if (verbose) - UG_LOG("Process " << pcl::ProcRank() << ": setting linear velocity to " << new_linearVelocity << "\n"); - m_spInterfaceProvider->set_linear_velocity(new_linearVelocity, p, 0); - if (verbose) - UG_LOG("Process " << pcl::ProcRank() << ": setting angular velocity to " << new_angularVelocity << "\n"); - m_spInterfaceProvider->set_angular_velocity(new_angularVelocity, p, 0); - } - } - } else { - - //////////////////////////////////////// - // Synchronisation using Interfaces // - //////////////////////////////////////// - // Create up to date particle data struct - if (verbose) - UG_LOG("Create data struct.\n"); - CombinedParticleData particleValues; - ParticleData dataSet; - for (size_t p = 0; p < num_particles(); ++p) { - std::vector ElemList = m_vvvElemListCut[levIndex][p]; - if ( ElemList.size() == 0 ) { - MathVector center; - if (verbose) - UG_LOG(pcl::ProcRank() << " sends zeros.\n"); - for (std::size_t i = 0; i < dim; ++i){ - center[i] = 0.0; - dataSet.transVel[i] = 0.0; - dataSet.rotVel[i] = 0.0; - } - dataSet.center = center; - dataSet.valid = false; - } else { - dataSet.center = m_spInterfaceProvider->get_center(p); - dataSet.transVel = m_spInterfaceProvider->get_linear_velocity(p, 0); - dataSet.rotVel = m_spInterfaceProvider->get_angular_velocity(p, 0); - dataSet.valid = true; - if (verbose) { - UG_LOG(pcl::ProcRank() << " sends\n" ); - UG_LOG("(" << dataSet.center[0] << ", " << dataSet.center[1] << ")\n"); - UG_LOG("(" << dataSet.transVel[0] << ", " << dataSet.transVel[1] << ")\n"); - UG_LOG("(" << dataSet.rotVel[0] << ", " << dataSet.rotVel[1] << ")\n"); - UG_LOG(std::boolalpha << dataSet.valid); - } - } - particleValues.push_back(dataSet); - } - if (verbose) - UG_LOG("Struct created.\n"); - com.barrier(); - - ParticleData default_new_data; - MathVector zero_vec; - for (std::size_t i = 0; i < dim; ++i){ - zero_vec[i] = 0.0; - } - default_new_data.valid = false; - default_new_data.center = zero_vec; - default_new_data.transVel = zero_vec; - default_new_data.rotVel = zero_vec; - CombinedParticleData new_particleData(num_particles(),default_new_data); - - const GridLayoutMap& glm = m_spMG->distributed_grid_manager()->grid_layout_map(); - for (std::size_t proc = 0; proc < pcl::NumProcs(); ++proc) { - if (verbose) - UG_LOG("proc " << proc << " sends to "); - if (glm.has_layout(INT_H_MASTER)) - { - const typename GridLayoutMap::Types::Layout& vrt_hm_layout = glm.get_layout(INT_H_MASTER); - if (vrt_hm_layout.interface_exists(proc, levIndex)) - { - for (GridLayoutMap::Types::Layout::const_iterator it = vrt_hm_layout.begin(levIndex); it != vrt_hm_layout.begin(levIndex); ++it) { - com.send_data(&particleValues, sizeof(particleValues), vrt_hm_layout.proc_id(it), proc); - //UG_LOG(vrt_hm_layout.proc_id(it) << " "); - } - } - } - if (glm.has_layout(INT_H_SLAVE)) - { - const typename GridLayoutMap::Types::Layout& vrt_hm_layout = glm.get_layout(INT_H_SLAVE); - if (vrt_hm_layout.interface_exists(proc, levIndex)) - { - for (GridLayoutMap::Types::Layout::const_iterator it = vrt_hm_layout.begin(levIndex); it != vrt_hm_layout.begin(levIndex); ++it) { - com.receive_data(&new_particleData, sizeof(new_particleData), vrt_hm_layout.proc_id(it), proc); - } - } - } - } - if (verbose) - UG_LOG("\n") - for (size_t p = 0; p < num_particles(); ++p) { - if (new_particleData[p].valid) { - m_spInterfaceProvider->set_center(new_particleData[p].center, p); - m_spInterfaceProvider->set_linear_velocity(new_particleData[p].transVel, p, 0); - m_spInterfaceProvider->set_angular_velocity(new_particleData[p].rotVel, p, 0); - } - } - } - } -#endif + /// element lists computed during 'update_interface_data()' to enable looping over + // distinguished element types, i.e. all, cut elements or outside elements + // indexing: [levIndex][counter] + std::vector > m_vvElemList; + std::vector > m_vvElemListCut; + std::vector > m_vvElemListOutside; - /// methods called by local_to_global_mappe: - number Volume(int levIndex, size_t prtIndex) - { return m_spInterfaceProvider->Volume(levIndex, prtIndex);} - number Mass(const int levIndex, const int prtIndex, const number fluidDensity) - { return m_spInterfaceProvider->Mass(levIndex, prtIndex, fluidDensity);} - number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) - { return m_spInterfaceProvider->Mass(levIndex, prtIndex, volume, fluidDensity);} - number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) - { return m_spInterfaceProvider->MomOfInertia(levIndex, prtIndex, fluidDensity);} - number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) - { return m_spInterfaceProvider->MomOfInertia(levIndex, prtIndex, volume, fluidDensity);} - - void update_prtCoords(const int topLevel, const number deltaT); - - number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) { return m_spInterfaceProvider->get_LSvalue_byPosition(vrtPos, prtIndex);} - number get_LSvalue_byPosition(MathVector vrtPos) - {//ToDo - UG_THROW("in CutElementHandler:getLSvalue_byPosition: no prtIndex-Parameter!\n"); - int prtIndex = 0; - return get_LSvalue_byPosition(vrtPos, prtIndex); - } - number get_LSvalue(Vertex* vrt, const int prtIndex) { return get_LSvalue_byPosition(m_aaPos[vrt], prtIndex); } - - bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex) - { return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, PrtIndex); } - bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) - { return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut); } - - void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) - { m_spInterfaceProvider->print_velocity(transSol, rotSol, prtIndex, isTimedep, time, filename); } - - SmartPtr m_spMG; - position_attachment_type m_aPos; /// m_vPrtIndex; - /// global data updatet during 'update_for_time_stepping()' - /// [levIndex][prtIndex][cmp] - std::vector< std::vector< std::vector > > m_vvvGlobalIndices_linearVel; - std::vector< std::vector< std::vector > > m_vvvGlobalIndices_angularVel; + /// contains interface infos (like radius, center ...) + SmartPtr > m_spInterfaceProvider; + +}; + + + + +template +class CutElementHandler_FlatTop : public CutElementHandlerBase +{ - SmartPtr m_spFlatTopVrtMarker; // marks: vertices for 'is_outside()' - SmartPtr m_spNearInterfaceVrtMarker; // marks: vertices for 'is_nearInterface()', i.e. potentially inside domain - // necessary to distinguish between (FlatTop && outside) and (FlatTop && nearInterface) - // Remark: outside AND nearInterface are FlatTopVrt, BUT nearInterface can lie inside the domain - // => e.g during 'CollectCorners_FlatTop_2d()' call of 'get_intersection_point()' - // would fail if these cases are NOT distinguished! + public: + /// world Dimension + static const int dim = TWorldDim; - SmartPtr m_spCutMarker; // marks: elements, edges - SmartPtr m_spOutsideMarker; // marks: elements, edges, vertices (vrt, for which 'is_outsideFluid == true, i.e. outside OR nearInterface + /// Type of position coordinates + typedef MathVector position_type; - /// [levIndex][prtIndex][counter] - std::vector m_vvvElemList; - std::vector m_vvvElemListCut; - std::vector m_vvvElemListOutside; + /// Type of Position Attachment + typedef Attachment position_attachment_type; - /// associotion of 'GridLevel' with an 'Index' value for access to m_vvv-lists: - std::map m_Map; + struct ParticleData { + MathVector center; + MathVector transVel; + MathVector rotVel; + bool valid; + }; - /// contains radius, center and density of all given particles - SmartPtr > m_spInterfaceProvider; + // struct CombinedParticleData { + // std::vector data; + // }; + typedef std::vector CombinedParticleData; + + + /// Type of Accessor to the Position Data Attachment + typedef Grid::VertexAttachmentAccessor position_accessor_type; + + typedef typename domain_traits::grid_base_object grid_base_object; + + /// list of element needed for looping cut OR all elements of a particle + typedef std::vector > vvElemList; + + /// default constructor: + CutElementHandler_FlatTop(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider); + CutElementHandler_FlatTop(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider); + + /// destructor + virtual ~CutElementHandler_FlatTop() {} - std::vector m_vThresholdOnLevel; - - // CombinedParticleData particleData; - std::size_t active_mpi_routine; - -}; + //////////////////////////////////////////////////////////////////////////////// + /// methods called during initialisation of the interface: + //////////////////////////////////////////////////////////////////////////////// + /// initializes crucial data for all cut element computations + /// especially'ElementModus' and 'VertexModus' categories + void update_multigrid_data(ConstSmartPtr dd, const int levIndex); -template -class CutElementHandlerImmersed : public ICutElementHandler -{ - - public: - /// world Dimension - static const int dim = TWorldDim; - - /// Type of position coordinates - typedef MathVector position_type; + /// methods called during 'update_multigrid_data': + + /// sets all BoolMarker and fills the 'm_vvElemList...' + void update_interface_data(ConstSmartPtr dd, const int levIndex); + + /// computes the global indices of the nodes within a particle, where the DoFs of the + // particle velocities will be (algorithmically!) located, i.e. the solution is stored + // --> for the rigid body motion simulation, the DoFs of the particle will be located + // simply in any "unused" = "free" node inside the particle + void update_global_indices(ConstSmartPtr dd, const int levIndex); + + //////////////////////////////////////////////////////////////////////////////// + /// virtual base class methods, needed for all basic computations + //////////////////////////////////////////////////////////////////////////////// + + /// for explanations regarding the relation between near-interface, outside, + /// on-interface: see the File + + /// returns boolian for 'does 'vrt' lie near interface?' + bool is_nearInterface(Vertex* vrt) + { UG_THROW("not implemented, since the alternative method" << + "'is_nearInterface_with_given_index()' is used by this class!\n");} + + // returns boolian for 'is near interface?' for a given 'prtIndex' + bool is_nearInterface_with_given_index(const int prtIndex, Vertex* vrt); - /// Type of Position Attachment - typedef Attachment position_attachment_type; + /// returns boolian for 'does 'vrt' lie outside the domain?' + bool is_outsideDomain(Vertex* vrt) + { return is_outsideFluid(vrt); } + + bool is_outsideFluid(Vertex* vrt); + + // returns boolian for 'is outside?' for a given 'prtIndex' + bool is_insideParticle_with_given_index(const int prtIndex, Vertex* vrt); + + // Remark: not only returns the boolian for 'is outise?', but also writes the + // according 'PrtIndex' into data, in which the 'vrt' is located + bool is_outsideFluid(int& PrtIndex, Vertex* vrt); + + //////////////////////////////////////////////////////////////////////////////// + // methods needed during call of 'is_outsideDomain(), 'is_nearInterface()': + //////////////////////////////////////////////////////////////////////////////// + + // computes the 'level-set' value of a point w.r.t. the interface, in order to + // derive its 'VertexModus', i.e. INSIDE, OUTSIDE, ON_INTERFACE + // --> evaluate the distance between a vrt and the interface + number get_LSvalue_byPosition(MathVector vrtPos) + { return m_spInterfaceProvider->get_LSvalue_byPosition(vrtPos); } + + // new 'get_LSvalue()'-method needed for 'is_outsideDomain()' and 'is_nearInterface()': + // --> with prtIndex as additional parameter compared to base class + number get_LSvalue(Vertex* vrt, const int prtIndex) + { return get_LSvalue_byPosition(this->m_aaPos[vrt], prtIndex); } + + number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) + { return m_spInterfaceProvider->get_LSvalue_byPosition(vrtPos, prtIndex);} + + //////////////////////////////////////////////////////////////////////////////// + /// (A) 'compute' and (B) 'get' the 'ElementModus': + //////////////////////////////////////////////////////////////////////////////// + + /// (A) computes the modus of the element as cut or non-cut + /// (= inside or outside of the domain) and marks according BoolMarker + ElementModus compute_element_modus(int prtIndex, GridObject* elem); + ElementModus compute_element_modus(GridObject* elem) + { UG_THROW("Attention: the alternative implementation with additional parameter 'prtIndex' has to be calles!\n"); } + + /// derives the 'ElementModus' from the boolian of the BoolMarker + // => global access to information (not only locally, during assembling + // for that specific 'elem' (see base class for explanation LOCAL, GLOBAL) + ElementModus get_element_modus(GridObject* elem); + + ////////////////////////////////////////////////////////////////////////////////// + /// checks for the 'VertexModus' of a vrt based on the + // --> GLOBAL acces, see comments in base class) + /// --> BoolMarker for global access set during 'update_interface_data()' + + /// returns true, if vertex lies OUTSIDE fluid AND near to interface + bool is_onInterfaceVertex(Vertex* vrt, size_t vrtIndex = 0) + { return this->m_spInterfaceVrtMarker->is_marked(vrt); } - /// Type of Accessor to the Position Data Attachment - typedef Grid::VertexAttachmentAccessor position_accessor_type; + /// returns true, if vertex lies OUTSIDE fluid => no DoF + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex = 0) + { return this->m_spOutsideMarker->is_marked(vrt); } + + /// returns true, if vertex lies INSIDE fluid AND near to interface + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex = 0) + { return this->m_spNearInterfaceVrtMarker->is_marked(vrt); } + + + ///////////////////////////////////////////////////////////////////////////////////////////// + /// methods, which handle the DoFs (and associated global indices) for the particle + /// velocities, which are located in specified grid nodes inside each particle + ///////////////////////////////////////////////////////////////////////////////////////////// + + // checks weather node is transDoF OR rotDoF: + /// returns true, if the local 'dofIndex' of a node of an element, which lies in the particle, + // is one of the selected DoFs for the particle velocities + // => outside domain, but a DoF! + bool is_extraDoF(DoFIndex dofIndex, int levIndex); + + // flags being set during initialisation, which indicate, whether the velocities of a particle + // will be a DoF or not + // --> for simulations of a fixed particle (e.g. cylinder benchmark), the particle velocities are + // not a DoF; + bool get_DoF_modus_linear(int prtIndex) { return m_spInterfaceProvider->get_DoF_modus_linear(prtIndex);} + bool get_DoF_modus_angular(int prtIndex){ return m_spInterfaceProvider->get_DoF_modus_angular(prtIndex);} + + /// Access methods for the global indices of the DoFs of the particle velocities + std::vector get_transInd(int levIndex, int prtIndex) + { + std::vector vTransInd; + for ( size_t cmp = 0; cmp < dim; ++cmp ) + vTransInd.push_back(m_vvvGlobalIndices_linearVel[levIndex][prtIndex][cmp]); + return vTransInd; + } + std::vector get_rotInd(int levIndex, int prtIndex) + { + std::vector vRotInd; + for ( size_t cmp = 0; cmp < dim; ++cmp ) + vRotInd.push_back(m_vvvGlobalIndices_angularVel[levIndex][prtIndex][cmp]); + return vRotInd; + } + + // returns single index for a given velocity component 'cmp' + DoFIndex get_transInd_Comp(int levIndex, int prtIndex, size_t cmp) + { if ( cmp == dim ) UG_THROW("no acces to pressure index in transInd! EXIT...\n"); + return m_vvvGlobalIndices_linearVel[levIndex][prtIndex][cmp]; } + DoFIndex get_rotInd_Comp(int levIndex, int prtIndex, size_t cmp) + { if ( cmp == dim ) UG_THROW("no acces to pressure index in rotInd! EXIT...\n"); + return m_vvvGlobalIndices_angularVel[levIndex][prtIndex][cmp]; } + + // returns all indices for transVel and rotVel + void get_global_indices(std::vector& transInd, std::vector& rotInd, + const int levIndex, const int prtIndex) + { + transInd = get_transInd(levIndex, prtIndex); + rotInd = get_rotInd(levIndex, prtIndex); + } + + // writes the solution of the particle velocities into the data storage provided in the + // 'ParticleProvider' called during PartcleMapper::modify_GlobalSol(): + void set_extraSolTrans(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_spInterfaceProvider->set_linear_velocity(solution, prtIndex, timeSeriesInd, cmp); } + void set_extraSolTrans(MathVector solution, size_t prtIndex, int timeSeriesInd) + { m_spInterfaceProvider->set_linear_velocity(solution, prtIndex, timeSeriesInd); } + void set_extraSolRot(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_spInterfaceProvider->set_angular_velocity(solution, prtIndex, timeSeriesInd, cmp); } + void set_extraSolRot(MathVector solution, size_t prtIndex, int timeSeriesInd) + { m_spInterfaceProvider->set_angular_velocity(solution, prtIndex, timeSeriesInd); } + + /// get solution values + MathVector get_transSol(size_t prtIndex, size_t timeSeriesInd) + { return m_spInterfaceProvider->get_linear_velocity(prtIndex, timeSeriesInd); } + MathVector get_rotSol(size_t prtIndex, size_t timeSeriesInd) + { return m_spInterfaceProvider->get_angular_velocity(prtIndex, timeSeriesInd); } + + // returns the rotation matrix associated with the radial vector + MathMatrix get_rotationMat(MathVector radialVector); + - typedef typename domain_traits::grid_base_object grid_base_object; + ///////////////////////////////////////////////////////////////////////////////////////////// + /// some functionality forwarded to the 'ParticleProvider' for according computations + ///////////////////////////////////////////////////////////////////////////////////////////// + + size_t num_particles() const { return m_spInterfaceProvider->num_particles();} + number get_density(int prtIndex) { return m_spInterfaceProvider->get_density(prtIndex);} + MathVector get_center(int prtIndex){ return m_spInterfaceProvider->get_center(prtIndex);} + void set_center(MathVector center, int prtIndex){ m_spInterfaceProvider->set_center(center, prtIndex);} + number get_radius(int prtIndex) { return m_spInterfaceProvider->get_radius(prtIndex);} + + /// methods called by local-to-global-mapper 'ParticleMapper': + number Volume(int levIndex, size_t prtIndex) + { return m_spInterfaceProvider->Volume(levIndex, prtIndex);} + number Mass(const int levIndex, const int prtIndex, const number fluidDensity) + { return m_spInterfaceProvider->Mass(levIndex, prtIndex, fluidDensity);} + number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) + { return m_spInterfaceProvider->Mass(levIndex, prtIndex, volume, fluidDensity);} + number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) + { return m_spInterfaceProvider->MomOfInertia(levIndex, prtIndex, fluidDensity);} + number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) + { return m_spInterfaceProvider->MomOfInertia(levIndex, prtIndex, volume, fluidDensity);} + -/// list of element needed for looping cut OR all elements of a particle - typedef std::vector > vvElemList; + ////////////////////////////////////////////////////////////////////////////////// + /// furhter functionality + ////////////////////////////////////////////////////////////////////////////////// + + /// for moving interfaces, the location needs to be updated + void update_interface(const int topLevel, const number deltaT) + { update_prtCoords(topLevel, deltaT); } + + void update_prtCoords(const int topLevel, const number deltaT); + + // computes the intersection point of the interface with an edge of the cut element + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int PrtIndex) + { return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, PrtIndex); } + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int PrtIndex, std::vector& alphaOut) + { return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut); } + + + // getter and setter for the index of the particle, cutting the current element + void set_prtIndex(const int prtIndex) { m_spInterfaceProvider->set_prtIndex(prtIndex); } + const int get_prtIndex() const { return m_spInterfaceProvider->get_prtIndex(); } + int get_prtIndex(size_t dof) + { + UG_THROW("attention: You want to get the particle index of an array. Make sure that the data was set!\n"); + return m_vPrtIndex[dof]; + } + + // called during update_elem() in InterfaceHandler + void compute_and_set_prtIndex(GridObject* elem); + + /// returns true, if 'elem' is a pyramid; used for setting the BoolMarker appropriately + bool element_is_pyramid(grid_base_object* elem); + + + ///////////////////////////////////////////////////////////////////////////////////////////// + // output + ///////////////////////////////////////////////////////////////////////////////////////////// + + /// writes particle velocities into a file -> lua-call + void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, + const bool isTimedep, const number time, const char* filename) + { m_spInterfaceProvider->print_velocity(transSol, rotSol, prtIndex, isTimedep, time, filename); } + + void print_elem_lists(ConstSmartPtr dd); -/// default constructor: - CutElementHandlerImmersed(SmartPtr mg, const char* fctNames, - SmartPtr > interfaceProvider); + // returns the number of cut Elements on the level 'levIndex': + size_t get_numCutElements( const int levIndex, const size_t prtIndex) + { return m_vvvElemListCut[levIndex][prtIndex].size(); } -/// destructor - ~CutElementHandlerImmersed() {} + ///////////////////////////////////////////////////////////////////////////////////////////// + /// methods for parallel computations + ///////////////////////////////////////////////////////////////////////////////////////////// - /// computing the element modus ONCE and marks according BoolMarker (called by 'InterfaceHandlerLocalParticle::update_marker()') - ElementModus compute_element_modus(GridObject* elem) - { return compute_element_modus(elem, 1); } + void set_mpi_routine(int val) + { active_mpi_routine = val; } + +#ifdef UG_PARALLEL + void synchronize_particles(int levIndex); +#endif +/* + bool valid_prt_information(int prtIndex) + { return particleData[prtIndex].valid; } +*/ + + ////////////////////////////////////////////////////////// + /// class member + ////////////////////////////////////////////////////////// + + const char* m_fctNames; + + //ToDo:brauche ich das?? + std::vector m_vPrtIndex; + + /// global indices of the DoFs for the particle velocities + /// indexing: [levIndex][prtIndex][cmp] + std::vector< std::vector< std::vector > > m_vvvGlobalIndices_linearVel; + std::vector< std::vector< std::vector > > m_vvvGlobalIndices_angularVel; + + /// element lists computed during 'update_interface_data()' to enable looping over + // distinguished element types, i.e. all, cut elements or outside elements + /// indexing: [levIndex][prtIndex][counter] + std::vector m_vvvElemList; + std::vector m_vvvElemListCut; + std::vector m_vvvElemListOutside; + + /// contains radius, center and density of all given particles + SmartPtr > m_spInterfaceProvider; + + + // CombinedParticleData particleData; + std::size_t active_mpi_routine; + + std::map m_vPrtIndices; - ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation); +}; + + + + +template +class CutElementHandler_TwoSided : public CutElementHandlerBase +{ + + public: + /// world Dimension + static const int dim = TWorldDim; + + /// Type of position coordinates + typedef MathVector position_type; + + /// Type of Position Attachment + typedef Attachment position_attachment_type; + + /// Type of Accessor to the Position Data Attachment + typedef Grid::VertexAttachmentAccessor position_accessor_type; + + typedef typename domain_traits::grid_base_object grid_base_object; + + /// list of element needed for looping cut OR all elements of a particle + typedef std::vector > vvElemList; + + /// default constructor: + CutElementHandler_TwoSided(SmartPtr mg, const char* fctNames, + SmartPtr > interfaceProvider); + + /// destructor + virtual ~CutElementHandler_TwoSided() {} + -/// derives the 'ElementModus' from the boolian of the BoolMarker - ElementModus get_element_modus(GridObject* elem) - { return m_elementModus; } - VertexModus get_vertex_modus(Vertex* vrt, size_t vrtIndex) - { return m_vVertexMode[vrtIndex];} - VertexModus get_vertex_modus(size_t vrtIndex) - { return m_vVertexMode[vrtIndex];} - VertexModus get_vertex_modus(size_t vrtIndex, const int interfaceOrientation) - { return m_vvVertexMode[interfaceOrientation][vrtIndex];} - -/// only call, when you are sure, that the data is available; if NOT: THROW error! - int get_Index(const GridLevel& gridLevel, ConstSmartPtr dd); - int get_Index(const GridLevel& gridLevel); - int get_Index_old(const GridLevel& gridLevel); - - bool is_outsideDomain(Vertex* vrt, const int interfaceOrientation) - { - if (interfaceOrientation == 1 ) - return is_outsideDomain(vrt); - else if (interfaceOrientation == -1 ) - return is_outsideDomain_inverse(vrt); - else UG_THROW("in 'CutElementHandler::is_outsideDomain()': no valid orientation given!\n"); - } - bool is_outsideDomain(Vertex* vrt); - bool is_outsideDomain_inverse(Vertex* vrt); - -/// returns true, if 'vrt' lies inside the 'prtIndex'-th particle OR: -/// if the vrt lies outside the particle BUT near the interface, -/// i.e.'m_pNearInterfaceVrtMarker->_is_marked(vrt) = true" && 'm_spFlatTopVrtMarker->is_marked(vrt) == true' - bool is_nearInterface(Vertex* vrt, const number threshold); - bool is_nearInterface(Vertex* vrt) - { - const number threshold = get_threshold(vrt); - return is_nearInterface(vrt, threshold); - } - - //ToDO: not needed? - VertexModus compute_vertex_modus(Vertex* vrt, const int interfaceOrientation); - - size_t get_or_insert_vertex_near(const MathVector& vrtPos); - const size_t get_numNearVerticesPos() const { return m_verticesNearPos.size(); } - - bool is_element_near_interface() { return m_bElementNearInterface;} - - /// returns true, if vertex lies INSIDE fluid, BUT near to interface => no DoF - bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex, const int interfaceOrientation) - { - size_t localInd = -0.5*interfaceOrientation + 0.5; - if ( get_vertex_modus(vrtIndex, localInd) == vrtModus ) - return true; - return false; - } - bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex) - { - if ( get_vertex_modus(vrtIndex) == vrtModus ) - return true; - return false; - } - /// returns true, if vertex lies INSIDE fluid, BUT near to interface => no DoF - bool check_vertex_modus(VertexModus vrtModus, Vertex* vrt, size_t vrtIndex) - { - if ( get_vertex_modus(vrt, vrtIndex) == vrtModus ) - return true; - return false; - } - - /// returns true, if vertex lies OUTSIDE fluid, BUT near to interface => FT-vertex - bool is_FTVertex(Vertex* vrt, size_t vrtIndex) - { return !check_vertex_modus(INSIDE, vrt, vrtIndex); } + //////////////////////////////////////////////////////////////////////////////// + /// virtual base class methods, needed for all basic computations + //////////////////////////////////////////////////////////////////////////////// + + /// for explanations regarding the relation between near-interface, outside, + /// on interface: see the 'Info File 1' + /// returns boolian for 'does 'vrt' lie near interface?' + bool is_nearInterface(Vertex* vrt); + + /// returns boolian for 'does 'vrt' lie outside the domain?' + bool is_outsideDomain(Vertex* vrt); + + // Remark: not only returns the boolian for 'is outise?', but also writes the + // according 'PrtIndex' into data, in which the 'vrt' is located + bool is_outsideDomain(int& PrtIndex, Vertex* vrt); + + + //////////////////////////////////////////////////////////////////////////////// + // methods needed during call of 'is_outsideDomain(), 'is_nearInterface()': + //////////////////////////////////////////////////////////////////////////////// + + // computes the 'level-set' value of a point w.r.t. the interface, in order to + // derive its 'VertexModus', i.e. INSIDE, OUTSIDE, ON_INTERFACE + // --> evaluate the distance between a vrt and the interface + number get_LSvalue_byPosition(MathVector vrtPos) + { return m_spInterfaceProvider->get_LSvalue_byPosition(vrtPos); } + + // new 'get_LSvalue()'-method needed for 'is_outsideDomain()' and 'is_nearInterface()': + // --> with prtIndex as parameter + number get_LSvalue(Vertex* vrt, const int prtIndex) + { return get_LSvalue_byPosition(this->m_aaPos[vrt], prtIndex); } + + number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) + { return m_spInterfaceProvider->get_LSvalue_byPosition(vrtPos, prtIndex);} + + + //////////////////////////////////////////////////////////////////////////////////////// + /// checks for the 'VertexModus' of a vrt + //////////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////////// + /// REMARK: We can NOT use the BoolMarker for the methods 'is_onInterfaceVertex()', + /// 'is_OutsideVertex(), and 'is_nearInterfaceVertex()', since for the + /// two-sided case, they will be overwritten after switch to the other + /// orientation of the interface + // => LOCAL acces, as specified in the base class, see comments there! + //////////////////////////////////////////////////////////////////////////////////////// + + /// returns true, if vertex lies OUTSIDE fluid AND near to interface + bool is_onInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { return !check_vertex_modus(INSIDE, vrtIndex, this->get_orientation()); } + /// returns true, if vertex lies OUTSIDE fluid => no DoF - bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) - { return check_vertex_modus(OUTSIDE, vrt, vrtIndex); } - - bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) - { return check_vertex_modus(ON_INTERFACE, vrt, vrtIndex); } - - void set_threshold(size_t level, const number threshold) - { m_vThresholdOnLevel[level] = threshold; } - number get_threshold(Vertex* vrt) - { - const size_t lev = m_spMG->get_level(vrt); - return m_vThresholdOnLevel[lev]; - } - - size_t num_particles() const { return m_spInterfaceProvider->num_particles();} - // number get_radius(int prtIndex) { return m_spInterfaceProvider->get_radius(prtIndex);} - number get_theta(int prtIndex) { return m_spInterfaceProvider->get_theta(prtIndex);} - number get_density(int prtIndex) { return m_spInterfaceProvider->get_density(prtIndex);} - MathVector get_center(int prtIndex){ return m_spInterfaceProvider->get_center(prtIndex);} - - // called during PartcleMapper::modify_GlobalSol(): - void set_solution(number solution, size_t prtIndex, int timeSeriesInd, int cmp) - { m_spInterfaceProvider->set_solution(solution, prtIndex, timeSeriesInd); } - - /// get solution values - number get_solution(size_t prtIndex, size_t timeSeriesInd) - { return m_spInterfaceProvider->get_solution(prtIndex, timeSeriesInd); } - - void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) - { m_spInterfaceProvider->print_velocity(transSol, rotSol, prtIndex, isTimedep, time, filename); } - - SmartPtr m_spMG; - position_attachment_type m_aPos; /// m_vPrtIndex; - /// associotion of 'GridLevel' with an 'Index' value for access to m_vvv-lists: - std::map m_Map; + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { return check_vertex_modus(OUTSIDE, vrtIndex, this->get_orientation()); } + + /// returns true, if vertex lies INSIDE fluid AND near to interface + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { return check_vertex_modus(ON_INTERFACE, vrtIndex, this->get_orientation()); } + + ////////////////////////////////////////////////////////////////////////// + /// access methods for the 'VertexModus' WITHOUT 'Vertex'-Parameter: + // --> needed for access during loc_to_glob_mapper! + + VertexModus get_vertex_modus(size_t vrtIndex, const int localind) { return this->m_vvVertexMode[localind][vrtIndex];} + + /// returns true, if vertex lies INSIDE fluid and near to interface => no DoF + bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex, const int interfaceOrientation) + { + size_t localInd = -0.5*interfaceOrientation + 0.5; + if ( get_vertex_modus(vrtIndex, localInd) == vrtModus ) + return true; + return false; + } + + + /////////////////////////////////////////////////////////////////////////////////////// + /// further getter and setter methods + /////////////////////////////////////////////////////////////////////////////////////// + + // getter and setter for prtIndex of the particle, cutting the current element + void set_prtIndex(const int prtIndex) { m_spInterfaceProvider->set_prtIndex(prtIndex); } + const int get_prtIndex() const{ return m_spInterfaceProvider->get_prtIndex(); } + + int get_prtIndex(size_t dof) + { + UG_THROW("attention: You want to get the particle index of an array. Make sure that the data was set!\n"); + return m_vPrtIndex[dof]; + } + + // called during update_elem() in InterfaceHandler + void compute_and_set_prtIndex(GridObject* elem); + + size_t get_or_insert_vertex_near(const MathVector& vrtPos); + const size_t get_numNearVerticesPos() const { return m_verticesNearPos.size(); } + + // ToDo: 'm_bElementNearInterface' und method brauche ich nicht mehr! + bool is_element_near_interface() { return m_bElementNearInterface;} + + + ///////////////////////////////////////////////////////////////////////////////////////////// + /// some functionality forwarded to the 'ParticleProvider' for according computations + ///////////////////////////////////////////////////////////////////////////////////////////// + + size_t num_particles() const { return m_spInterfaceProvider->num_particles();} + number get_theta(int prtIndex) { return m_spInterfaceProvider->get_theta(prtIndex);} + number get_density(int prtIndex) { return m_spInterfaceProvider->get_density(prtIndex);} + MathVector get_center(int prtIndex) { return m_spInterfaceProvider->get_center(prtIndex);} + + ///////////////////////////////////////////////////////////////////////////////////////////// + // output + ///////////////////////////////////////////////////////////////////////////////////////////// + + /// writes particle velocities into a file -> lua-call - /// contains radius, center and density of all given particles - SmartPtr > m_spInterfaceProvider; - - std::vector m_vThresholdOnLevel; - std::vector m_vVertexMode; - std::vector > m_vvVertexMode; - ElementModus m_elementModus; - bool m_bElementNearInterface; - std::map, size_t> m_MapNearVertices; - std::vector > m_verticesNearPos; + void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, + const bool isTimedep, const number time, const char* filename) + { m_spInterfaceProvider->print_velocity(transSol, rotSol, prtIndex, isTimedep, time, filename); } + + ////////////////////////////////////////////////////////// + /// class member + ////////////////////////////////////////////////////////// + + //ToDo:brauche ich das?? + std::vector m_vPrtIndex; + std::map m_vPrtIndices; + + /// element lists computed during 'update_interface_data()' to enable looping over + // distinguished element types, i.e. all, cut elements or outside elements + /// indexing: [levIndex][prtIndex][counter] + std::vector m_vvvElemList; + std::vector m_vvvElemListCut; + std::vector m_vvvElemListOutside; + + /// contains radius, center and density of all given particles + SmartPtr > m_spInterfaceProvider; + + + bool m_bElementNearInterface; + std::map, size_t> m_MapNearVertices; + std::vector > m_verticesNearPos; + + }; - }// end namespace ug -#include "cut_element_handler_FT_impl.h" -#include "cut_element_handler_immersed_impl.h" +#include "cut_element_handler_base_impl.h" +#include "cut_element_handler_flat_top_impl.h" +#include "cut_element_handler_two_sided_impl.h" + #endif /* CUT_ELEMENT_HANDLER_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_FT.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_base_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_base_impl.h index 11fae7d15..d721aaee9 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_base_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_base_impl.h @@ -10,18 +10,22 @@ namespace ug{ - template CutElementHandlerBase:: -CutElementHandlerBase(SmartPtr mg, const char* fctNames, - SmartPtr > interfaceProvider) - : m_spMG(mg.operator->()), m_fctNames(fctNames), - m_spInterfaceProvider(interfaceProvider) +CutElementHandlerBase(SmartPtr mg, + SmartPtr > interfaceProvider) + : m_spMG(mg), + m_elementModus(INSIDE_DOM), + m_bBoolMarkerInit(false), + m_spInterfaceProvider((SmartPtr >) interfaceProvider) { - - m_vThresholdOnLevel.resize(mg->num_levels(), 0.0); + m_vvVertexMode.resize(2); + m_vThresholdOnLevel.resize(mg->num_levels(), 1e-10); + + m_vvVertexMode.clear(); + // get position attachment m_aPos = GetDefaultPositionAttachment(); @@ -30,26 +34,444 @@ CutElementHandlerBase(SmartPtr mg, const char* fctNames, m_spMG->attach_to(m_aPos); m_aaPos.access(*m_spMG, m_aPos); + // initialize data m_spCutMarker = make_sp(new BoolMarker); m_spOutsideMarker = make_sp(new BoolMarker); - m_spFlatTopVrtMarker = make_sp(new BoolMarker); + m_spInsideMarker = make_sp(new BoolMarker); + m_spInterfaceVrtMarker = make_sp(new BoolMarker); m_spNearInterfaceVrtMarker = make_sp(new BoolMarker); + m_spCutMarker->assign_grid(*m_spMG); + m_spOutsideMarker->assign_grid(*m_spMG); + m_spInsideMarker->assign_grid(*m_spMG); + m_spInterfaceVrtMarker->assign_grid(*m_spMG); + m_spNearInterfaceVrtMarker->assign_grid(*m_spMG); + + m_spCutMarker->enable_mark_inheritance(false); + m_spOutsideMarker->enable_mark_inheritance(false); + m_spInsideMarker->assign_grid(*m_spMG); + m_spInterfaceVrtMarker->enable_mark_inheritance(false); + m_spNearInterfaceVrtMarker->enable_mark_inheritance(false); + + UG_LOG("init bool_marker done!\n"); + +} + +template +CutElementHandlerBase:: +CutElementHandlerBase(SmartPtr mg, + SmartPtr > interfaceProvider) + : m_spMG(mg), + m_elementModus(INSIDE_DOM), + m_bBoolMarkerInit(false), + m_spInterfaceProvider((SmartPtr >) interfaceProvider) +{ + + m_vvVertexMode.resize(2); + m_vThresholdOnLevel.resize(mg->num_levels(), 1e-10); + + m_vvVertexMode.clear(); + + // get position attachment + m_aPos = GetDefaultPositionAttachment(); + + // let position accessor access Vertex Coordinates + if(!m_spMG->has_attachment(m_aPos)) + m_spMG->attach_to(m_aPos); + m_aaPos.access(*m_spMG, m_aPos); + + + // initialize data + m_spCutMarker = make_sp(new BoolMarker); + m_spOutsideMarker = make_sp(new BoolMarker); + m_spInsideMarker = make_sp(new BoolMarker); + m_spInterfaceVrtMarker = make_sp(new BoolMarker); + m_spNearInterfaceVrtMarker = make_sp(new BoolMarker); m_spCutMarker->assign_grid(*m_spMG); m_spOutsideMarker->assign_grid(*m_spMG); - m_spFlatTopVrtMarker->assign_grid(*m_spMG); + m_spInsideMarker->assign_grid(*m_spMG); + m_spInterfaceVrtMarker->assign_grid(*m_spMG); m_spNearInterfaceVrtMarker->assign_grid(*m_spMG); m_spCutMarker->enable_mark_inheritance(false); m_spOutsideMarker->enable_mark_inheritance(false); - m_spFlatTopVrtMarker->enable_mark_inheritance(false); + m_spInsideMarker->assign_grid(*m_spMG); + m_spInterfaceVrtMarker->enable_mark_inheritance(false); m_spNearInterfaceVrtMarker->enable_mark_inheritance(false); UG_LOG("init bool_marker done!\n"); } + +template +CutElementHandlerBase:: +CutElementHandlerBase(SmartPtr mg, + SmartPtr > interfaceProvider) + : m_spMG(mg), + m_elementModus(INSIDE_DOM), + m_bBoolMarkerInit(false), + m_spInterfaceProvider((SmartPtr >) interfaceProvider) +{ + + m_vvVertexMode.resize(2); + m_vThresholdOnLevel.resize(mg->num_levels(), 1e-10); + + m_vvVertexMode.clear(); + + // get position attachment + m_aPos = GetDefaultPositionAttachment(); + + // let position accessor access Vertex Coordinates + if(!m_spMG->has_attachment(m_aPos)) + m_spMG->attach_to(m_aPos); + m_aaPos.access(*m_spMG, m_aPos); + + + // initialize data + m_spCutMarker = make_sp(new BoolMarker); + m_spOutsideMarker = make_sp(new BoolMarker); + m_spInsideMarker = make_sp(new BoolMarker); + m_spInterfaceVrtMarker = make_sp(new BoolMarker); + m_spNearInterfaceVrtMarker = make_sp(new BoolMarker); + + m_spCutMarker->assign_grid(*m_spMG); + m_spOutsideMarker->assign_grid(*m_spMG); + m_spInsideMarker->assign_grid(*m_spMG); + m_spInterfaceVrtMarker->assign_grid(*m_spMG); + m_spNearInterfaceVrtMarker->assign_grid(*m_spMG); + + m_spCutMarker->enable_mark_inheritance(false); + m_spOutsideMarker->enable_mark_inheritance(false); + m_spInsideMarker->enable_mark_inheritance(false); + m_spInterfaceVrtMarker->enable_mark_inheritance(false); + m_spNearInterfaceVrtMarker->enable_mark_inheritance(false); + + clear_bool_marker(); + + UG_LOG("CutElementHandlerBase constructor done!\n"); + +} + + +template +template +void CutElementHandlerBase:: +init(ConstSmartPtr dd, const int baseLevel, const int topLevel) +{ +// clear all marks in grid + clear_bool_marker(); + +// clear data associated to gridlevel + m_Map.clear(); + +// update cut element data + const int levIndex = get_Index(GridLevel(topLevel, GridLevel::LEVEL), dd); + update_multigrid_data(dd, levIndex); + +} + + +template +int CutElementHandlerBase:: +get_Index(const GridLevel& gridLevel, ConstSmartPtr dd) +{ + std::pair::iterator,bool> ret; + ret = m_Map.insert ( std::pair(gridLevel,m_Map.size()) ); + + if (ret.second==false) { + // std::cout << "element already existed"; + // std::cout << " with a value of " << ret.first->second << '\n'; + } + else{ + update_multigrid_data(dd, ret.first->second); + } + + return ret.first->second; +} + +template +int CutElementHandlerBase:: +get_Index(const GridLevel& gridLevel) +{ + std::map::iterator it; + it = m_Map.find(gridLevel); + // if NO element is found for the key 'gridLevel', the iterator points to the end: + if (it == m_Map.end()) + UG_THROW("in CutElementHandler_FlatTop::get_Index(): no data available on gridLevel " << gridLevel << "!\n"); + + return it->second; +} + + + +template +bool CutElementHandlerBase:: +is_nearInterface(Vertex* vrt) +{ +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = get_threshold(vrt); + +// compute the distance between the location of vrt and the interface: +// level set value: LS_value := radius - distance + const number LS_value = get_LSvalue(vrt); + + if (fabs(LS_value) < threshold) + return true; + + return false; +} + +template +bool CutElementHandlerBase:: +is_outsideDomain(Vertex* vrt) +{ +// get data + const int orientation = get_orientation(); + +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = get_threshold(vrt); + +// compute the distance between the location of vrt and the interface: +// level set value: LS_value := radius - distance + const number LS_value = get_LSvalue(vrt); + +// a vertex is considered outside, if: +// (A) it lies accross the interface OR +// (B) it lies near to it according to either side +// check (A) + if ( LS_value > threshold && orientation == 1 ) + return true; +// check (A) + else if ( LS_value < -threshold && orientation == -1 ) + return true; +// check (B) + else if ( is_nearInterface(vrt) ) + return true; + + + return false; +} + + +template +ElementModus CutElementHandlerBase:: +get_element_modus(GridObject* elem) // --> ToDo: siehe FT impl!! +{ + if ( !m_bBoolMarkerInit ) + UG_THROW("global element modus not initialized! Call the method update_interface_data()'\n"); + if ( m_spCutMarker->is_marked(elem) ) + { + return CUT_BY_INTERFACE; + } + else if ( m_spOutsideMarker->is_marked(elem) ) + { + return OUTSIDE_DOM; + } + else + return INSIDE_DOM; + +} + +// This method can be used for call during 'compute_element_modes(): +// --> check 'VertexModus' instead of 'boolian' during is_outside()/is_nearInterface() +template +VertexModus CutElementHandlerBase:: +compute_vertex_modus(Vertex* vrt) +{ + if ( is_nearInterface(vrt) ) + return ON_INTERFACE; + else if ( is_outsideDomain(vrt) ) + return OUTSIDE; + else + return INSIDE; +} + + +template +ElementModus CutElementHandlerBase:: +compute_element_modus(GridObject* elem) +{ + + size_t localInd = -0.5*get_orientation() + 0.5; + + m_vvVertexMode[localInd].clear(); + m_vVertexMode.clear(); + + bool insideDomain = false; + bool outsideDomain = false; + std::vector vVertex; + CollectVertices(vVertex, *m_spMG, elem); + m_aaPos.access(*m_spMG, m_aPos); + + size_t num_onInterface = 0; + size_t num_outside = 0; + size_t num_inside = 0; + +// loop vertices + for(size_t i = 0; i < vVertex.size(); ++i) + { + Vertex* vrt = vVertex[i]; + if ( is_nearInterface(vrt) ) + { + // A. update counter: + num_onInterface++; + + // get_or_insert_vertex_near(m_aaPos[vrt]); // ToDo: brauche ich diese Funktion und daten 'm_MapNearVertices' (in Immersed-Klasse) noch?? + + // B. set local modus + m_vVertexMode.push_back(ON_INTERFACE); + m_vvVertexMode[localInd].push_back(ON_INTERFACE); + + // C. set global modus: BoolMarker + m_spNearInterfaceVrtMarker->mark(vrt); + m_spOutsideMarker->mark(vrt); + + // D. set boolian + outsideDomain = true; + + } + else if ( is_outsideDomain(vrt) ) + { + // A. update counter + num_outside++; + + // B. set local modus + m_vVertexMode.push_back(OUTSIDE); + m_vvVertexMode[localInd].push_back(OUTSIDE); + + // C. set global modus: BoolMarker + m_spOutsideMarker->mark(vrt); + m_spCutMarker->mark(vrt); + + // D. set boolian + outsideDomain = true; + } + else + { + // A. update counter + num_inside++; + + // B. set local modus + m_vVertexMode.push_back(INSIDE); + m_vvVertexMode[localInd].push_back(INSIDE); + + // C. set global modus: BoolMarker + m_spInsideMarker->mark(vrt); + + // D. set boolian + insideDomain = true; + + if ( is_nearInterface(vrt) ) + UG_THROW("CutElementHandlerBase::compute_element_modus(): case 'is_nearInterface(vrt) = true' not possible!\n"); + } + } // vertex loop + + + size_t checkOut = num_onInterface + num_outside; + size_t checkIn = num_onInterface + num_inside; + + if ( checkOut == vVertex.size() ) m_elementModus = OUTSIDE_DOM; + else if ( checkIn == vVertex.size() ) m_elementModus = INSIDE_DOM; + else if (insideDomain && outsideDomain) + { + m_elementModus = CUT_BY_INTERFACE; + m_spCutMarker->mark((grid_base_object*)elem); + } + else if (outsideDomain) + { + m_elementModus = OUTSIDE_DOM; + m_spOutsideMarker->mark((grid_base_object*)elem); + } + else + { + m_elementModus = INSIDE_DOM; + m_spInsideMarker->mark((grid_base_object*)elem); + } + + return m_elementModus; + +} + + +template +void CutElementHandlerBase:: +clear_bool_marker() +{ + m_spNearInterfaceVrtMarker->clear(); + m_spInterfaceVrtMarker->clear(); + m_spOutsideMarker->clear(); + m_spInsideMarker->clear(); + m_spCutMarker->clear(); +} + + +template +void CutElementHandlerBase:: +update_interface_data(ConstSmartPtr dd, const int levIndex) +{ + m_bBoolMarkerInit = true; + +// initialize vectors + m_vvElemList.resize(levIndex + 1); + m_vvElemListCut.resize(levIndex + 1); + m_vvElemListOutside.resize(levIndex + 1); + + m_vvElemList[levIndex].clear(); + m_vvElemListCut[levIndex].clear(); + m_vvElemListOutside[levIndex].clear(); + + +// get data + typedef typename domain_traits::grid_base_object grid_base_object; + + typename DoFDistribution::traits::const_iterator iter, iterEnd; + iter = dd->template begin(); + iterEnd = dd->template end(); + +// loop elements in order to compute the volume and set rhs: + for( ; iter != iterEnd; iter++) + { + // get element + grid_base_object* elem = *iter; + + ElementModus elemModus = compute_element_modus(elem); + + if ( elemModus == CUT_BY_INTERFACE ) + { + m_vvElemList[levIndex].push_back(elem); + m_vvElemListCut[levIndex].push_back(elem); + + // mark vrt in order to remove them from 'm_spOutsideMarker'-list! + for(size_t i = 0; i < elem->num_vertices(); ++i) + { + if ( m_spOutsideMarker->is_marked(elem->vertex(i)) ) + this->m_spInterfaceVrtMarker->mark(elem->vertex(i)); + + // check: all nearInterface-vertices also are outside-vertices: + if ( !m_spOutsideMarker->is_marked(elem->vertex(i)) && + m_spNearInterfaceVrtMarker->is_marked(elem->vertex(i)) ) + UG_THROW("Error: all nearInterface-vertices also are outside-vertices!!\n"); + } + } + else if ( elemModus == OUTSIDE_DOM ) + { + m_vvElemList[levIndex].push_back(elem); + m_vvElemListOutside[levIndex].push_back(elem); + } + else // INSIDE_DOM + { + if ( elemModus != INSIDE_DOM ) + UG_THROW("in 'update_interface_data()': no case found for 'elemModus'!\n"); + } + + } // end elem-loop + + +} + +} // end ug namespace -}; +#endif /* CUT_ELEMENT_HANDLER_BASE_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_flat_top_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_flat_top_impl.h index fca31f89d..e7fef910b 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_flat_top_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_flat_top_impl.h @@ -5,8 +5,8 @@ * Author: suze */ -#ifndef CUT_ELEMENT_HANDLER_IMPL_H_ -#define CUT_ELEMENT_HANDLER_IMPL_H_ +#ifndef CUT_ELEMENT_HANDLER_FLAT_TOP_IMPL_H_ +#define CUT_ELEMENT_HANDLER_FLAT_TOP_IMPL_H_ #ifdef UG_PARALLEL #include "pcl/pcl_interface_communicator.h" @@ -17,8 +17,8 @@ namespace ug{ template -CutElementHandlerFlatTop:: -CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, +CutElementHandler_FlatTop:: +CutElementHandler_FlatTop(SmartPtr mg, const char* fctNames, SmartPtr > interfaceProvider) : CutElementHandlerBase(mg, interfaceProvider), m_fctNames(fctNames), @@ -28,8 +28,8 @@ CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, } template -CutElementHandlerFlatTop:: -CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, +CutElementHandler_FlatTop:: +CutElementHandler_FlatTop(SmartPtr mg, const char* fctNames, SmartPtr > interfaceProvider) : CutElementHandlerBase(mg, interfaceProvider), m_fctNames(fctNames), @@ -40,7 +40,7 @@ CutElementHandlerFlatTop(SmartPtr mg, const char* fctNames, // checks weather node is transDoF OR rotDoF template -bool CutElementHandlerFlatTop:: +bool CutElementHandler_FlatTop:: is_extraDoF(DoFIndex dofIndex, int levIndex) { // pressure dof is always NO extraDoF: @@ -88,7 +88,7 @@ is_extraDoF(DoFIndex dofIndex, int levIndex) } template -MathMatrix CutElementHandlerFlatTop:: +MathMatrix CutElementHandler_FlatTop:: get_rotationMat(MathVector radialVector) { MathMatrix rotationMat; @@ -121,33 +121,35 @@ get_rotationMat(MathVector radialVector) template -bool CutElementHandlerFlatTop:: -is_nearInterface(Vertex* vrt, const number threshold) +bool CutElementHandler_FlatTop:: +is_nearInterface_with_given_index(const int prtIndex, Vertex* vrt) { -// loop all particles: - for (size_t p = 0; p < m_spInterfaceProvider->num_particles(); ++p) - { - // compute the distance between the location of vrt and the interface: - const number LS_value = get_LSvalue(vrt, p); - - if (fabs(LS_value) < threshold) - { - set_prtIndex(p); - return true; - } +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = this->get_threshold(vrt); + +// compute the distance between the location of vrt and the interface: + const number LS_value = get_LSvalue(vrt, prtIndex); - } // end particle loop - + if (fabs(LS_value) < threshold) + { + set_prtIndex(prtIndex); + return true; + } + return false; } template -bool CutElementHandlerFlatTop:: -is_outsideFluid(Vertex* vrt, const number threshold) +bool CutElementHandler_FlatTop:: +is_outsideFluid(Vertex* vrt) { +// get data const int orientation = this->get_orientation(); - + +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = this->get_threshold(vrt); + // loop all particles for (size_t p = 0; p < m_spInterfaceProvider->num_particles(); ++p) { @@ -167,7 +169,7 @@ is_outsideFluid(Vertex* vrt, const number threshold) set_prtIndex(p); return true; } - else if ( is_nearInterface(vrt) ) + else if ( is_nearInterface_with_given_index(p, vrt) ) { // set particle index to data set_prtIndex(p); @@ -180,11 +182,14 @@ is_outsideFluid(Vertex* vrt, const number threshold) } template -bool CutElementHandlerFlatTop:: -is_outsideFluid(int& PrtIndex, Vertex* vrt, const number threshold) +bool CutElementHandler_FlatTop:: +is_outsideFluid(int& PrtIndex, Vertex* vrt) { bool outsideFluid = false; - + +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = this->get_threshold(vrt); + // loop over all centers and pick the index with minimal distance for (size_t p = 0; p < this->num_particles(); ++p) { @@ -198,7 +203,7 @@ is_outsideFluid(int& PrtIndex, Vertex* vrt, const number threshold) PrtIndex = p; outsideFluid = true; } - else if ( is_nearInterface(vrt) ) + else if ( is_nearInterface_with_given_index(p, vrt) ) { // set particle index to data PrtIndex = p; @@ -210,12 +215,15 @@ is_outsideFluid(int& PrtIndex, Vertex* vrt, const number threshold) } template -bool CutElementHandlerFlatTop:: -is_outsideFluid_prtIndex(const int prtIndex, Vertex* vrt, const number threshold) +bool CutElementHandler_FlatTop:: +is_insideParticle_with_given_index(const int prtIndex, Vertex* vrt) { bool outsideFluid = false; - + +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = this->get_threshold(vrt); + // compute the distance between the location of vrt and the interface: // level set value: LS_value := radius - distance const number LS_value = get_LSvalue(vrt, prtIndex); @@ -224,7 +232,7 @@ is_outsideFluid_prtIndex(const int prtIndex, Vertex* vrt, const number threshold { outsideFluid = true; } - else if ( is_nearInterface(vrt) ) + else if ( is_nearInterface_with_given_index(prtIndex, vrt) ) { outsideFluid = true; } @@ -234,7 +242,7 @@ is_outsideFluid_prtIndex(const int prtIndex, Vertex* vrt, const number threshold template -void CutElementHandlerFlatTop:: +void CutElementHandler_FlatTop:: compute_and_set_prtIndex(GridObject* elem) { m_vPrtIndices.clear(); @@ -280,7 +288,7 @@ compute_and_set_prtIndex(GridObject* elem) template -void CutElementHandlerFlatTop:: +void CutElementHandler_FlatTop:: update_prtCoords(const int topLevel, const number deltaT) { if ( deltaT == 0.0 ) @@ -290,13 +298,13 @@ update_prtCoords(const int topLevel, const number deltaT) for (size_t p = 0; p < num_particles(); ++p) { #ifdef UG_PARALLEL -// use size of member 'CutElementHandlerFlatTop::m_vvvElemListCut' in order to +// use size of member 'CutElementHandler_FlatTop::m_vvvElemListCut' in order to // indicate, whether a particle lies on a processor or not const int levIndex = this->get_Index(GridLevel(topLevel, GridLevel::LEVEL)); std::vector ElemList = m_vvvElemListCut[levIndex][p]; - UG_LOG("1 CutElementHandlerFlatTop::update_prtCoords() ElemList.size(): " << ElemList.size() << "\n"); + UG_LOG("1 CutElementHandler_FlatTop::update_prtCoords() ElemList.size(): " << ElemList.size() << "\n"); if ( ElemList.size() == 0 ) { - UG_LOG("2 CutElementHandlerFlatTop::update_prtCoords() ElemList.size(): " + UG_LOG("2 CutElementHandler_FlatTop::update_prtCoords() ElemList.size(): " << ElemList.size() << " => skip assembling! \n"); return; } @@ -315,7 +323,7 @@ update_prtCoords(const int topLevel, const number deltaT) template -ElementModus CutElementHandlerFlatTop:: +ElementModus CutElementHandler_FlatTop:: compute_element_modus(int prtIndex, GridObject* elem) { bool insideFluid = false; @@ -328,7 +336,13 @@ compute_element_modus(int prtIndex, GridObject* elem) for(size_t i = 0; i < vVertex.size(); ++i) { Vertex* vrt = vVertex[i]; - if ( is_outsideFluid_prtIndex(prtIndex, vrt) ) + if ( is_nearInterface_with_given_index(prtIndex, vrt) ) + { + outsideFluid = true; + this->m_spNearInterfaceVrtMarker->mark(vrt); + this->m_spOutsideMarker->mark(vrt); + } + else if ( is_insideParticle_with_given_index(prtIndex, vrt) ) { outsideFluid = true; this->m_spOutsideMarker->mark(vrt); @@ -336,8 +350,8 @@ compute_element_modus(int prtIndex, GridObject* elem) else { insideFluid = true; - if ( is_nearInterface(vrt) ) - UG_THROW("CutElementHandlerFlatTop::compute_element_modus(): case 'is_nearInterface(vrt) = true' not possible!\n"); + if ( is_nearInterface_with_given_index(prtIndex, vrt) ) + UG_THROW("CutElementHandler_FlatTop::compute_element_modus(): case 'is_nearInterface_with_given_index(vrt) = true' not possible!\n"); } } // vertex loop @@ -349,45 +363,9 @@ compute_element_modus(int prtIndex, GridObject* elem) } -template -ElementModus CutElementHandlerFlatTop:: -compute_element_modus(GridObject* elem) -{ - bool insideFluid = false; - bool outsideFluid = false; - std::vector vVertex; - CollectVertices(vVertex, *this->m_spMG, elem); - this->m_aaPos.access(*this->m_spMG, this->m_aPos); - - - // loop vertices - for(size_t i = 0; i < vVertex.size(); ++i) - { - Vertex* vrt = vVertex[i]; - if ( is_outsideFluid(vrt) ) - { - outsideFluid = true; - this->m_spOutsideMarker->mark(vrt); - } - else - { - insideFluid = true; - if ( is_nearInterface(vrt) ) - UG_THROW("CutElementHandlerFlatTop::compute_element_modus(): case 'is_nearInterface(vrt) = true' not possible!\n"); - } - - } // vertex loop - - if (insideFluid && outsideFluid) return CUT_BY_INTERFACE; - else if (outsideFluid) return OUTSIDE_DOM; - - return INSIDE_DOM; - -} - template -ElementModus CutElementHandlerFlatTop:: +ElementModus CutElementHandler_FlatTop:: get_element_modus(GridObject* elem) { if ( !this->m_bBoolMarkerInit ) @@ -408,7 +386,7 @@ get_element_modus(GridObject* elem) template -void CutElementHandlerFlatTop:: +void CutElementHandler_FlatTop:: update_global_indices(ConstSmartPtr dd, const int levIndex) { // get data @@ -444,7 +422,7 @@ update_global_indices(ConstSmartPtr dd, const int levIndex) for (size_t p = 0; p < num_particles(); ++p) { #ifdef UG_PARALLEL - // use size of member 'CutElementHandlerFlatTop::m_vvvElemListCut' in order to + // use size of member 'CutElementHandler_FlatTop::m_vvvElemListCut' in order to // indicate, whether a particle lies on a processor or not std::vector ElemList = m_vvvElemListCut[levIndex][p]; UG_LOG("1_ update_global_indices() ElemList.size(): " << ElemList.size() << "\n"); @@ -483,9 +461,9 @@ update_global_indices(ConstSmartPtr dd, const int levIndex) const MathVector& center = get_center(p); dist += VecDistance(vrtPos, center); - if (is_outsideFluid_prtIndex(p, vrt)) + if (is_insideParticle_with_given_index(p, vrt)) vrtArray.push_back(vrt); - if (is_outsideFluid_prtIndex(p, vrt) && !this->m_spOutsideMarker->is_marked(vrt)) + if (is_insideParticle_with_given_index(p, vrt) && !this->m_spOutsideMarker->is_marked(vrt)) UG_THROW("Mist, immeroch falsche marker:-(\n"); } @@ -543,7 +521,7 @@ update_global_indices(ConstSmartPtr dd, const int levIndex) template -void CutElementHandlerFlatTop:: +void CutElementHandler_FlatTop:: update_interface_data(ConstSmartPtr dd, const int levIndex) { this->m_bBoolMarkerInit = true; @@ -589,24 +567,27 @@ update_interface_data(ConstSmartPtr dd, const int levIndex) if ( dim == 3 ) { if ( element_is_pyramid(elem) ) - isPyramid = true; - } + { + isPyramid = true; + UG_LOG("isPyramid = true...\n"); + } + } // mark vrt in order to remove them from 'm_spOutsideMarker'-list! for(size_t i = 0; i < elem->num_vertices(); ++i) { - if ( is_outsideFluid_prtIndex(prtIndex, elem->vertex(i)) ) + if ( is_insideParticle_with_given_index(prtIndex, elem->vertex(i)) ) { this->m_spCutMarker->mark(elem->vertex(i)); this->m_spInterfaceVrtMarker->mark(elem->vertex(i)); // for pyramids, set ALL outside nodes to 'nearInterface' nodes // => in 'get_cutMode()': numOutside == numNearInterface => original tetrahedron - if ( 0 ) //isPyramid ) + if ( isPyramid ) { this->m_spNearInterfaceVrtMarker->mark(elem->vertex(i)); } - else if ( is_nearInterface(elem->vertex(i))) + else if ( is_nearInterface_with_given_index(prtIndex, elem->vertex(i))) { if ( !this->m_spNearInterfaceVrtMarker->is_marked(elem->vertex(i))) UG_THROW("hmmm...muesste schon laengst markiert sein...oder noch nicht implementiert in 'is_nearInterface!!\n"); @@ -628,15 +609,15 @@ update_interface_data(ConstSmartPtr dd, const int levIndex) } // end particle loop } // end elem-loop - + } // same fuction as in class 'FlatTopHandler', but since m_spParticleHandlerLocal is not a member of -// CutElementHandlerFlatTop, there is no option for using it +// CutElementHandler_FlatTop, there is no option for using it template -bool CutElementHandlerFlatTop:: +bool CutElementHandler_FlatTop:: element_is_pyramid(grid_base_object* elem) { @@ -664,7 +645,7 @@ element_is_pyramid(grid_base_object* elem) template -void CutElementHandlerFlatTop:: +void CutElementHandler_FlatTop:: update_multigrid_data(ConstSmartPtr dd, const int levIndex) { // 1. 'update_interface_data()': @@ -678,7 +659,7 @@ update_multigrid_data(ConstSmartPtr dd, const int levIndex) template -void CutElementHandlerFlatTop:: +void CutElementHandler_FlatTop:: print_elem_lists(ConstSmartPtr dd) { @@ -777,7 +758,7 @@ print_elem_lists(ConstSmartPtr dd) #ifdef UG_PARALLEL template -void CutElementHandlerFlatTop:: +void CutElementHandler_FlatTop:: synchronize_particles(int levIndex) { bool verbose = false; @@ -953,4 +934,4 @@ synchronize_particles(int levIndex) { -#endif /* CUT_ELEMENT_HANDLER_IMPL_H_ */ +#endif /* CUT_ELEMENT_HANDLER_FLAT_TOP_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_immersed.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_two_sided_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_two_sided_impl.h index 9e8accb61..6bc8063fe 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_two_sided_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/cut_element_handler/cut_element_handler_two_sided_impl.h @@ -5,8 +5,8 @@ * Author: suze */ -#ifndef CUT_ELEMENT_HANDLER_IMMERSED_IMPL_H_ -#define CUT_ELEMENT_HANDLER_IMMERSED_IMPL_H_ +#ifndef CUT_ELEMENT_HANDLER_TWO_SIDED_IMPL_H_ +#define CUT_ELEMENT_HANDLER_TWO_SIDED_IMPL_H_ @@ -31,8 +31,11 @@ CutElementHandler_TwoSided(SmartPtr mg, const char* fctNames, template bool CutElementHandler_TwoSided:: -is_nearInterface(Vertex* vrt, const number threshold) +is_nearInterface(Vertex* vrt) { +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = this->get_threshold(vrt); + // loop all particles: for (size_t p = 0; p < m_spInterfaceProvider->num_particles(); ++p) { @@ -54,11 +57,14 @@ is_nearInterface(Vertex* vrt, const number threshold) template bool CutElementHandler_TwoSided:: -is_outsideDomain(Vertex* vrt, const number threshold) +is_outsideDomain(Vertex* vrt) { // get data const int orientation = this->get_orientation(); +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = this->get_threshold(vrt); + // loop all particles for (size_t p = 0; p < m_spInterfaceProvider->num_particles(); ++p) { @@ -90,10 +96,13 @@ is_outsideDomain(Vertex* vrt, const number threshold) template bool CutElementHandler_TwoSided:: -is_outsideDomain(int& PrtIndex, Vertex* vrt, const number threshold) +is_outsideDomain(int& PrtIndex, Vertex* vrt) { bool outsideFluid = false; - + +// get threshold (either default = 1e-10 or set by user via .lua-call: + const number threshold = this->get_threshold(vrt); + // loop over all centers and pick the index with minimal distance for (size_t p = 0; p < this->num_particles(); ++p) { @@ -187,4 +196,4 @@ get_or_insert_vertex_near(const MathVector& vrtPos) -#endif /* CUT_ELEMENT_HANDLER_IMMERSED_IMPL_H_ */ +#endif /* CUT_ELEMENT_HANDLER_TWO_SIDED_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/Info File b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/Info File index e69de29bb..92565483a 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/Info File +++ b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/Info File @@ -0,0 +1,11 @@ +/* Info File for 'ParticleTransfer' class: */ + +The 'ParticleTransfer' class imlements adapted interpolation operators for the application on cut elements due to immersed interfaces. It mainly performs a re-definition of the local weights due to the new geometry (which is in particular the edge lenght) of the cut element. + +A detailed description of the re-definition of the weights can be found in [1]. + + + +[1] S. Höllbacher. + 'Voll gekoppelte Modellierung zur direkten numerischen Simulation partikulärer Fluide.' + PhD thesis, Universitat Frankfurt, 2016. diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer.h b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer.h index 262ed84e7..1929a5445 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer.h @@ -95,12 +95,12 @@ class ParticleTransfer : public: /// Constructor - ParticleTransfer(SmartPtr > approxSpace, SmartPtr > cutElementHandler) : + ParticleTransfer(SmartPtr > approxSpace, SmartPtr > cutElementHandler) : ITransferOperator(), m_p1LagrangeOptimizationEnabled(true), m_dampRes(1.0), bCached(true), m_bUseTransposed(false), m_spDebugWriter(NULL), - m_spParticleHandlerGlobal(cutElementHandler) + m_spCutElementHandler(cutElementHandler) {}; /// Default constructor @@ -143,7 +143,7 @@ class ParticleTransfer : /// sets if restriction and prolongation are transposed void set_use_transposed(bool bTransposed) {m_bUseTransposed = bTransposed;} /// sets if restriction and prolongation are transposed - void set_global_handler(SmartPtr > spCutElementHandler) {m_spParticleHandlerGlobal = spCutElementHandler;} + void set_global_handler(SmartPtr > spCutElementHandler) {m_spCutElementHandler = spCutElementHandler;} public: @@ -290,7 +290,7 @@ class ParticleTransfer : SmartPtr > m_spDebugWriter; // new member - SmartPtr > m_spParticleHandlerGlobal; + SmartPtr > m_spCutElementHandler; }; diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer_impl.h index 1a4baad6a..71d5d7f77 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/gmg_transfer/particle_transfer_impl.h @@ -217,18 +217,18 @@ namespace ug{ { typedef typename std::vector::iterator ListIter; - std::vector ElemListLog = m_spParticleHandlerGlobal->m_vvvElemListCut[levIndex][prtIndex]; + std::vector ElemListLog = m_spCutElementHandler->m_vvvElemListCut[levIndex][prtIndex]; for(ListIter listIter = ElemListLog.begin(); listIter != ElemListLog.end(); ++listIter) { // collect all vertices of the element std::vector vVertex; - CollectVertices(vVertex, *m_spParticleHandlerGlobal->m_spMG, *listIter); + CollectVertices(vVertex, *m_spCutElementHandler->m_spMG, *listIter); // loop vertices for(size_t v = 0; v < vVertex.size(); ++v) { - if ( m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(vVertex[v]) ) + if ( m_spCutElementHandler->m_spInterfaceVrtMarker->is_marked(vVertex[v]) ) { // loop velocity DoFs for (size_t fct = 0; fct < dim; ++fct) @@ -255,15 +255,15 @@ namespace ug{ const vector_type& corrCoarse, GridLevel coarseLvl, ConstSmartPtr > spApproxSpace) { - const int coarseIndex = m_spParticleHandlerGlobal->get_Index(coarseLvl); - const int fineIndex = m_spParticleHandlerGlobal->get_Index(fineLvl); + const int coarseIndex = m_spCutElementHandler->get_Index(coarseLvl); + const int fineIndex = m_spCutElementHandler->get_Index(fineLvl); - size_t numPrt = m_spParticleHandlerGlobal->num_particles(); + size_t numPrt = m_spCutElementHandler->num_particles(); for(size_t p = 0; p < numPrt; ++p) { #ifdef UG_PARALLEL - std::vector< grid_base_object* > ElemList = m_spParticleHandlerGlobal->m_vvvElemListCut[fineIndex][p]; + std::vector< grid_base_object* > ElemList = m_spCutElementHandler->m_vvvElemListCut[fineIndex][p]; if( ElemList.size() == 0 ) continue; #endif @@ -277,11 +277,11 @@ namespace ug{ /////////////////////////////////////////////////////////// // 2) injection for extraDoFs: //////////////////////////////////////////////////////////// - std::vector transIndCoarse = m_spParticleHandlerGlobal->get_transInd(coarseIndex, p); - std::vector rotIndCoarse = m_spParticleHandlerGlobal->get_rotInd(coarseIndex, p); + std::vector transIndCoarse = m_spCutElementHandler->get_transInd(coarseIndex, p); + std::vector rotIndCoarse = m_spCutElementHandler->get_rotInd(coarseIndex, p); - std::vector transIndFine = m_spParticleHandlerGlobal->get_transInd(fineIndex, p); - std::vector rotIndFine = m_spParticleHandlerGlobal->get_rotInd(fineIndex, p); + std::vector transIndFine = m_spCutElementHandler->get_transInd(fineIndex, p); + std::vector rotIndFine = m_spCutElementHandler->get_rotInd(fineIndex, p); for ( int d = 0; d < dim; ++d ) { @@ -305,16 +305,16 @@ namespace ug{ ConstSmartPtr ddCoarse = spApproxSpace->dof_distribution(coarseLvl); ConstSmartPtr ddFine = spApproxSpace->dof_distribution(coarseLvl); - const int coarseIndex = m_spParticleHandlerGlobal->get_Index(coarseLvl,ddCoarse); - const int fineIndex = m_spParticleHandlerGlobal->get_Index(fineLvl,ddFine); + const int coarseIndex = m_spCutElementHandler->get_Index(coarseLvl,ddCoarse); + const int fineIndex = m_spCutElementHandler->get_Index(fineLvl,ddFine); - size_t numPrt = m_spParticleHandlerGlobal->num_particles(); + size_t numPrt = m_spCutElementHandler->num_particles(); // loop over all particles and initialize defects: for(size_t p = 0; p < numPrt; ++p) { #ifdef UG_PARALLEL - std::vector< grid_base_object* > ElemList = m_spParticleHandlerGlobal->m_vvvElemListCut[fineIndex][p]; + std::vector< grid_base_object* > ElemList = m_spCutElementHandler->m_vvvElemListCut[fineIndex][p]; if( ElemList.size() == 0 ) continue; #endif @@ -328,11 +328,11 @@ namespace ug{ /////////////////////////////////////////////////////////// // 2) injection for extraDoFs: //////////////////////////////////////////////////////////// - std::vector transIndCoarse = m_spParticleHandlerGlobal->get_transInd(coarseIndex, p); - std::vector rotIndCoarse = m_spParticleHandlerGlobal->get_rotInd(coarseIndex, p); + std::vector transIndCoarse = m_spCutElementHandler->get_transInd(coarseIndex, p); + std::vector rotIndCoarse = m_spCutElementHandler->get_rotInd(coarseIndex, p); - std::vector transIndFine = m_spParticleHandlerGlobal->get_transInd(fineIndex, p); - std::vector rotIndFine = m_spParticleHandlerGlobal->get_rotInd(fineIndex, p); + std::vector transIndFine = m_spCutElementHandler->get_transInd(fineIndex, p); + std::vector rotIndFine = m_spCutElementHandler->get_rotInd(fineIndex, p); for ( int d = 0; d < dim; ++d ) { @@ -350,13 +350,13 @@ namespace ug{ get_vertex_index(Vertex* vrt, GridObject* elem) { std::vector vVertex; - CollectVertices(vVertex, *m_spParticleHandlerGlobal->m_spMG, elem); + CollectVertices(vVertex, *m_spCutElementHandler->m_spMG, elem); for(size_t i = 0; i < vVertex.size(); ++i) if ( vrt == vVertex[i]) return i; - UG_THROW("in CutElementHandlerImmersed::get_vertex_index: no index found!\n"); + UG_THROW("in CutElementHandler_TwoSided::get_vertex_index: no index found!\n"); } @@ -376,63 +376,63 @@ namespace ug{ bool bChildVrt_isInside = false; - if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt0) && !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt0)) + if ( !m_spCutElementHandler->m_spOutsideMarker->is_marked(coarseVrt0) && !m_spCutElementHandler->m_spInterfaceVrtMarker->is_marked(coarseVrt0)) bCoarseVrt0_isInside = true; - if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt1) && !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt1)) + if ( !m_spCutElementHandler->m_spOutsideMarker->is_marked(coarseVrt1) && !m_spCutElementHandler->m_spInterfaceVrtMarker->is_marked(coarseVrt1)) bCoarseVrt1_isInside = true; - if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(childVrt) && !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(childVrt)) + if ( !m_spCutElementHandler->m_spOutsideMarker->is_marked(childVrt) && !m_spCutElementHandler->m_spInterfaceVrtMarker->is_marked(childVrt)) bChildVrt_isInside = true; int prtIndex = -1; - bool isOutside_vrt0 = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, coarseVrt0); - bool isOutside_vrt1 = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, coarseVrt1); + bool isOutside_vrt0 = m_spCutElementHandler->is_outsideFluid(prtIndex, coarseVrt0); + bool isOutside_vrt1 = m_spCutElementHandler->is_outsideFluid(prtIndex, coarseVrt1); - if ( m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt0) && !isOutside_vrt0 ) + if ( m_spCutElementHandler->m_spOutsideMarker->is_marked(coarseVrt0) && !isOutside_vrt0 ) UG_THROW("inconsistent 0!\n"); - if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt0) && isOutside_vrt0 ) + if ( !m_spCutElementHandler->m_spOutsideMarker->is_marked(coarseVrt0) && isOutside_vrt0 ) UG_THROW("inconsistent 1!\n"); - if ( m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt1) && !isOutside_vrt1 ) + if ( m_spCutElementHandler->m_spOutsideMarker->is_marked(coarseVrt1) && !isOutside_vrt1 ) UG_THROW("inconsistent 2!\n"); - if ( !m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt1) && isOutside_vrt1 ) + if ( !m_spCutElementHandler->m_spOutsideMarker->is_marked(coarseVrt1) && isOutside_vrt1 ) UG_THROW("inconsistent 3!\n"); // inside edge => alpha = (0.5, 0.5) if ( bCoarseVrt0_isInside && bCoarseVrt1_isInside) return 0; - // flat top edge => alpha = (0.5, 0.5) OR (1.0, 0.0) OR alphaNew! - // both flat top => alpha = (0.5,0.5) for pressure, for vel: reset later during adjust_prolongation: - else if ( m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt0) && m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt1) ) + // edge cutted by interface => alpha = (0.5, 0.5) OR (1.0, 0.0) OR alphaNew! + // both interface nodes => alpha = (0.5,0.5) for pressure, for vel: reset later during adjust_prolongation: + else if ( m_spCutElementHandler->m_spInterfaceVrtMarker->is_marked(coarseVrt0) && m_spCutElementHandler->m_spInterfaceVrtMarker->is_marked(coarseVrt1) ) return 0; // outside edge => alpha = (0.0, 0.0) - else if ( m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt0) && m_spParticleHandlerGlobal->m_spOutsideMarker->is_marked(coarseVrt1) ) + else if ( m_spCutElementHandler->m_spOutsideMarker->is_marked(coarseVrt0) && m_spCutElementHandler->m_spOutsideMarker->is_marked(coarseVrt1) ) return 1; - else if ( !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt0) && !m_spParticleHandlerGlobal->m_spFlatTopVrtMarker->is_marked(coarseVrt1) ) - {UG_THROW("error in 'particle_transfer_impl:get_vertex_mode': one vertex must be flat top!\n");} + else if ( !m_spCutElementHandler->m_spInterfaceVrtMarker->is_marked(coarseVrt0) && !m_spCutElementHandler->m_spInterfaceVrtMarker->is_marked(coarseVrt1) ) + {UG_THROW("error in 'particle_transfer_impl:get_vertex_mode': one vertex must be 'on interface'!\n");} // check: exactly one vertex must be inside: else if ( !bCoarseVrt0_isInside && !bCoarseVrt1_isInside ) {UG_THROW("error in 'particle_transfer_impl:get_vertex_mode': one vertex must be inside!\n");} // if one vertex is inside, BUT the FlatTopVertex is also ON interface: (0.5, 0.5) ! - else if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker->is_marked(coarseVrt0) || m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker->is_marked(coarseVrt1) ) + else if ( m_spCutElementHandler->m_spNearInterfaceVrtMarker->is_marked(coarseVrt0) || m_spCutElementHandler->m_spNearInterfaceVrtMarker->is_marked(coarseVrt1) ) { /* std::vector vParentDoF; coarseDD.inner_dof_indices(coarseVrt0, 0, vParentDoF); - if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker.is_marked(coarseVrt0) ) + if ( m_spCutElementHandler->m_spNearInterfaceVrtMarker.is_marked(coarseVrt0) ) UG_THROW("oho 0: vParentDoF = " << vParentDoF[0] << "\n"); coarseDD.inner_dof_indices(coarseVrt1, 0, vParentDoF); - if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker.is_marked(coarseVrt1) ) + if ( m_spCutElementHandler->m_spNearInterfaceVrtMarker.is_marked(coarseVrt1) ) UG_THROW("oho 1: vParentDoF = " << vParentDoF[0] << "\n");*/ - if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker->is_marked(coarseVrt0) ) - UG_LOG("0 pos: " << m_spParticleHandlerGlobal->m_aaPos[coarseVrt0] << "\n"); + if ( m_spCutElementHandler->m_spNearInterfaceVrtMarker->is_marked(coarseVrt0) ) + UG_LOG("0 pos: " << m_spCutElementHandler->m_aaPos[coarseVrt0] << "\n"); - if ( m_spParticleHandlerGlobal->m_spNearInterfaceVrtMarker->is_marked(coarseVrt1) ) - UG_LOG("1: pos: " << m_spParticleHandlerGlobal->m_aaPos[coarseVrt1] << "\n"); + if ( m_spCutElementHandler->m_spNearInterfaceVrtMarker->is_marked(coarseVrt1) ) + UG_LOG("1: pos: " << m_spCutElementHandler->m_aaPos[coarseVrt1] << "\n"); return 0; } // childVertex lies inside => compute new weigthing for prolongation! else if ( bChildVrt_isInside ) return 3; - // childVertex lies outside AND on flat top edge => constant prologation for pressure and reset during + // childVertex lies outside AND on edge cutted by interface => constant prologation for pressure and reset during // adjust_prolongation for velocity: else return 2; @@ -551,8 +551,8 @@ assemble_prolongation_p1(matrix_type& P, MathVector intersectionPnt; int prtIndex = -1; - bool isOutside_vrt0 = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, edge->vertex(0)); - bool isOutside_vrt1 = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, edge->vertex(1)); + bool isOutside_vrt0 = m_spCutElementHandler->is_outsideFluid(prtIndex, edge->vertex(0)); + bool isOutside_vrt1 = m_spCutElementHandler->is_outsideFluid(prtIndex, edge->vertex(1)); size_t vrtInd0 = get_vertex_index(edge->vertex(0), parent); size_t vrtInd1 = get_vertex_index(edge->vertex(1), parent); @@ -567,7 +567,7 @@ assemble_prolongation_p1(matrix_type& P, */ size_t vertexMode = get_vertex_mode(edge->vertex(0), edge->vertex(1), child); - //bool isOutside_childDoF = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, child); + //bool isOutside_childDoF = m_spCutElementHandler->is_outsideFluid(prtIndex, child); if ( vertexMode == 1 ) @@ -586,22 +586,22 @@ assemble_prolongation_p1(matrix_type& P, // only new weighting, if childDoF insideFluid => get boolian isInside_childDoF else if ( vertexMode == 3 ) //!isOutside_childDoF ) { - UG_LOG("vertexMode == 3\n"); + // UG_LOG("vertexMode == 3\n"); // case1: vrt0 = insideFluid && vrt1 = outsideFluid: if ( !isOutside_vrt0 && isOutside_vrt1 ){ coarseDD.inner_dof_indices(edge->vertex(1), fct, vParentDoF); - if ( m_spParticleHandlerGlobal->is_nearInterfaceVertex(edge->vertex(1), vrtInd1) ) + if ( m_spCutElementHandler->is_nearInterfaceVertex(edge->vertex(1), vrtInd1) ) UG_THROW("1 oho, vParentDoF = " << vParentDoF[0] << "\n"); - m_spParticleHandlerGlobal->m_spInterfaceProvider->get_intersection_point(intersectionPnt, m_spParticleHandlerGlobal->m_aaPos[edge->vertex(0)], m_spParticleHandlerGlobal->m_aaPos[edge->vertex(1)], prtIndex, alpha); + m_spCutElementHandler->m_spInterfaceProvider->get_intersection_point(intersectionPnt, m_spCutElementHandler->m_aaPos[edge->vertex(0)], m_spCutElementHandler->m_aaPos[edge->vertex(1)], prtIndex, alpha); newWeights1 = true; coarseDD.inner_dof_indices(edge->vertex(0), fct, vParentDoF); - UG_LOG("1: vertex[0] = " << vParentDoF[0] << "\n"); - UG_LOG("1: alpha = " << alpha[0] << ", " << alpha[1] << "\n"); - UG_LOG("VORHER: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); + // UG_LOG("1: vertex[0] = " << vParentDoF[0] << "\n"); + // UG_LOG("1: alpha = " << alpha[0] << ", " << alpha[1] << "\n"); + // UG_LOG("VORHER: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); alpha[0] = 0.5/alpha[0]; alpha[1] = 1.0 - alpha[0]; @@ -611,15 +611,15 @@ assemble_prolongation_p1(matrix_type& P, else if ( isOutside_vrt0 && !isOutside_vrt1 ){ coarseDD.inner_dof_indices(edge->vertex(0), fct, vParentDoF); - if ( m_spParticleHandlerGlobal->is_nearInterfaceVertex(edge->vertex(0), vrtInd0) ) + if ( m_spCutElementHandler->is_nearInterfaceVertex(edge->vertex(0), vrtInd0) ) UG_THROW("2 oho, vParentDoF = " << vParentDoF[0] << "\n"); - m_spParticleHandlerGlobal->m_spInterfaceProvider->get_intersection_point(intersectionPnt, m_spParticleHandlerGlobal->m_aaPos[edge->vertex(1)], m_spParticleHandlerGlobal->m_aaPos[edge->vertex(0)], prtIndex, alpha); + m_spCutElementHandler->m_spInterfaceProvider->get_intersection_point(intersectionPnt, m_spCutElementHandler->m_aaPos[edge->vertex(1)], m_spCutElementHandler->m_aaPos[edge->vertex(0)], prtIndex, alpha); newWeights2 = true; coarseDD.inner_dof_indices(edge->vertex(1), fct, vParentDoF); - UG_LOG("2: vertex[0] = " << vParentDoF[0] << "\n"); - UG_LOG("2: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); - UG_LOG("VORHER: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); + // UG_LOG("2: vertex[0] = " << vParentDoF[0] << "\n"); + // UG_LOG("2: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); + // UG_LOG("VORHER: alpha[i] = " << alpha[0] << ", " << alpha[1] << "\n"); // switch also ordering of original alpha!!! alpha[1] = 0.5/alpha[0]; @@ -643,15 +643,15 @@ assemble_prolongation_p1(matrix_type& P, bool isOutside_parentDoF = false; if ( newWeights2 || newWeights1 ) - isOutside_parentDoF = m_spParticleHandlerGlobal->is_outsideFluid(prtIndex, edge->vertex(i)); + isOutside_parentDoF = m_spCutElementHandler->is_outsideFluid(prtIndex, edge->vertex(i)); if ( isOutside_parentDoF && fct != dim ) { - const int coarseIndex = m_spParticleHandlerGlobal->get_Index(coarseDD.grid_level()); + const int coarseIndex = m_spCutElementHandler->get_Index(coarseDD.grid_level()); - std::vector transIndCoarse = m_spParticleHandlerGlobal->get_transInd(coarseIndex, prtIndex); + std::vector transIndCoarse = m_spCutElementHandler->get_transInd(coarseIndex, prtIndex); - std::vector rotIndCoarse = m_spParticleHandlerGlobal->get_rotInd(coarseIndex, prtIndex); + std::vector rotIndCoarse = m_spCutElementHandler->get_rotInd(coarseIndex, prtIndex); /* UG_LOG("fct = " << fct << "\n"); UG_LOG("transIndCoarse[0] = " << transIndCoarse[0] << "\n"); @@ -1136,7 +1136,7 @@ assemble_restriction(matrix_type& R, Vertex* vrt = static_cast(parent); if(coarseDD.dof_indices(vrt, fct, vInd) != 1) UG_THROW("Only one index expected."); - if ( m_spParticleHandlerGlobal->is_FTVertex(vrt) ) + if ( m_spCutElementHandler->is_onInterfaceVertex(vrt) ) { fprintf(outputFile,"ParentPos: %e \t %e (index = %lu)\n", vDoFPosParent[0][0], vDoFPosParent[0][1], vInd[0][0]); DoFRef(R, vParentDoF[sh], vChildDoF[ip]) = vvShape[ip][sh]; @@ -1163,7 +1163,7 @@ assemble_restriction(matrix_type& R, // get multi indices if(coarseDD.dof_indices(edge->vertex(i), fct, vInd) != 1) UG_THROW("Only one index expected."); - if ( m_spParticleHandlerGlobal->is_FTVertex(edge->vertex(i)) && vParentDoF[sh][0] == vInd[0][0] ) + if ( m_spCutElementHandler->is_onInterfaceVertex(edge->vertex(i)) && vParentDoF[sh][0] == vInd[0][0] ) { fprintf(outputFile,"vParentDoF[%lu], vInd[0]: %lu \t %lu \n", i, vParentDoF[sh][0], vInd[0][0]); DoFRef(R, vParentDoF[sh], vChildDoF[ip]) = vvShape[ip][sh]; @@ -1414,8 +1414,8 @@ do_restrict(GF& uCoarse, const GF& uFine) apply_ignore_zero_rows(uCoarse, m_dampRes, uFine); -// m_spParticleHandlerGlobal->plotCoarse(uCoarse); -// m_spParticleHandlerGlobal->plotFine(uFine); +// m_spCutElementHandler->plotCoarse(uCoarse); +// m_spCutElementHandler->plotFine(uFine); // adjust using constraints for (int type = 1; type < CT_ALL; type = type << 1) @@ -1445,7 +1445,7 @@ ParticleTransfer::clone() op->set_debug(m_spDebugWriter); op->enable_p1_lagrange_optimization(p1_lagrange_optimization_enabled()); op->set_use_transposed(m_bUseTransposed); - op->set_global_handler(m_spParticleHandlerGlobal); + op->set_global_handler(m_spCutElementHandler); return op; } diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base.h b/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base.h index afc7802ad..960a26c6c 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base.h @@ -1,5 +1,5 @@ /* - * moving_interface.h + * immersed_interface_base.h * * Created on: 15.01.2015 * Author: susanne hoellbacher @@ -17,7 +17,12 @@ namespace ug{ ////////////////////////////////////////////////////////////////////////////////// -// class 'IInterfaceMapper': member of class 'IMovingInterface' (see below) +// class 'IInterfaceMapper': member of class 'IImmersedInterface' (see below) +// +// it handles the local-to-global mapping, which potentially is changed +// if the additional DoFs on the immersed interface needs to be associated +// to its according entries in the global algebra +// ////////////////////////////////////////////////////////////////////////////////// template @@ -87,7 +92,13 @@ class IInterfaceMapper : public ILocalToGlobalMapper }; ////////////////////////////////////////////////////////////////////////////////// -// class 'IInterfaceBndCond': member of class 'IMovingInterface' (see below) +// class 'IInterfaceBndCond': member of class 'IImmersedInterface' (see below) +// +// class in order to implement boundary conditions on the immersed interface +// it interhits the 'IInterfaceHandlerLocal' class, which provides access +// to all information important for assembling on a cut element, such as +// local indices of DoFs on the interface, size of new local algebra etc. +// ////////////////////////////////////////////////////////////////////////////////// template @@ -160,11 +171,11 @@ class IInterfaceBndCond : public IElemDisc ////////////////////////////////////////////////////////////////////////////////// -// main class 'IMovingInterface' +// main class 'IImmersedInterface' ////////////////////////////////////////////////////////////////////////////////// template -class IMovingInterface +class IImmersedInterface { public: /// world Dimension @@ -180,16 +191,16 @@ class IMovingInterface typedef typename algebra_type::vector_type vector_type; // default constructor - IMovingInterface(){}; + IImmersedInterface(){}; - IMovingInterface(SmartPtr > ass, + IImmersedInterface(SmartPtr > ass, const char* functions, const char* subsets, SmartPtr localHandler); - IMovingInterface(SmartPtr > ass, + IImmersedInterface(SmartPtr > ass, const std::vector& vFct, const std::vector& vSubset, SmartPtr localHandler); - virtual ~IMovingInterface() {} + virtual ~IImmersedInterface() {} private: diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base_impl.h index 7cb7923f7..923ee3847 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/immersed_interface_base_impl.h @@ -1,5 +1,5 @@ /* - * moving_interface_impl.h + * immersed_interface_base_impl.h * * Created on: 15.01.2015 * Author: suze @@ -123,11 +123,11 @@ IInterfaceBndCond(const std::vector& vFct, const std::vector -IMovingInterface:: -IMovingInterface(SmartPtr > ass, +IImmersedInterface:: +IImmersedInterface(SmartPtr > ass, const char* functions, const char* subsets, SmartPtr localHandler) : m_spInterfaceHandlerLocal(localHandler), @@ -135,20 +135,14 @@ IMovingInterface(SmartPtr > ass, m_spInterfaceBndCond(new IInterfaceBndCond(functions, subsets, localHandler)) { -// m_spInterfaceHandlerLocal = localHandler; - -// m_spInterfaceMapper = make_sp(new IInterfaceMapper(localHandler)); -// m_spInterfaceBndCond = make_sp(new IInterfaceBndCond(localHandler)); - SmartPtr > assAdapt = ass->ass_tuner(); assAdapt->set_mapping(m_spInterfaceMapper.get()); -// assAdapt->enable_modify_solution(true); // ToDo: brauche ich das in der base class? - + } template -IMovingInterface:: -IMovingInterface(SmartPtr > ass, +IImmersedInterface:: +IImmersedInterface(SmartPtr > ass, const std::vector& vFct, const std::vector& vSubset, SmartPtr localHandler) : m_spInterfaceHandlerLocal(localHandler), @@ -156,15 +150,9 @@ IMovingInterface(SmartPtr > ass, m_spInterfaceBndCond(new IInterfaceBndCond(vFct, vSubset, localHandler)) { -// m_spInterfaceHandlerLocal = localHandler; - -// m_spInterfaceMapper = make_sp(new IInterfaceMapper(localHandler)); -// m_spInterfaceBndCond = make_sp(new IInterfaceBndCond(localHandler)); - SmartPtr > assAdapt = ass->ass_tuner(); assAdapt->set_mapping(m_spInterfaceMapper.get()); -// assAdapt->enable_modify_solution(true); // ToDo: brauche ich das in der base class? - + } diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 1 b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 1 index da39c8da8..4296051dc 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 1 +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 1 @@ -4,7 +4,7 @@ The 'InterfaceHandlerLocal' class acts as a link between the assembling process All assembling of the ElemDisc is cintered around the finite volume/element geometry object 'TFVGeom'. It inherits all local data, like corner coordinates, local indices, ReferenceObjectID. And from that it derives further local data (ip coordinates, normal vectors, gradients) and global data (global corner coordinates, global gradients, global ip coordinates). -On a cut element, the (finite volume/element) geometry of the element changes from its state in the original mesh. In particular, the coordinates of the corners change and can increase. With that the cut element can change from a triangle/tetrahedron in the original grid to a quadrilateral/hexagon in the cut geometry (i.e. ReferenceObjectID changes). +On a cut element, the (finite volume/element) geometry of the element changes from its state in the original mesh. In particular, the coordinates of the corners change and can increase. With that, the cut element can change from a triangle/tetrahedron in the original grid to a quadrilateral/hexagon in the cut geometry (i.e. ReferenceObjectID changes). Finally, for the local assembling procedures in UG4, due to the changed geometry, also the local indices of the corners need to be adapted and stored. @@ -37,7 +37,7 @@ Important data: Further remarks: -- The inner boundary faces, which form the linear approximation onto the immersed interface, are stored in the according derived class as 'm_vBF'. Because this object is derived from the finite volume/element geometry, it can not be initialized in the 'InterfaceHandlerLocalBase' class, which does not rely on this specific information. +- The inner boundary faces, which form the linear approximation onto the immersed interface, are stored in the according derived class as 'm_vBF'. Since this object is derived from the finite volume/element geometry, it can not be initialized in the 'InterfaceHandlerLocalBase' class, which does not rely on this specific information. --> See e.g. in 'InterfaceHandlerLocalParticle': typedef typename DimFV1FTGeometry >::BF interfaceBF; diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 2 b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 2 index e69de29bb..03ac35fbd 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 2 +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/Info File 2 @@ -0,0 +1,103 @@ +/* Info File on the local data provided by the 'InterfaceHandlerLocal' class: */ + +As explained in the 'Info File 1' of this folder, the 'InterfaceHandlerLocal' class computes and holds the following NEW local data on a cut element: + + +- NEW LOCAL CORNERS: Stored in: 'm_vCornerCoords' + +- NEW LOCAL INDICES: Stored in: 'm_vInterfaceID', 'm_vNOInterfaceID', 'm_vOriginalCornerID' + +- NEW ReferenceObjectID: Stored in: 'm_roid' + + + +The 'print_CutElementData()'- method and an according lua-acces enables to print these data into a file for each cut element. + +For explanation of the output let us start with an arbitrary, oiginal element with local numbering of the corners in couterclockwise order as follows: + + 1 _____________ 0 + \ / + \ / + \ / + \ / + \ / + \ / + \ / + 2 + + + +Case 1: The interface cuts the element as follows and the new ReferenceObjectID is ROID_TRIANGLE: + + + 1 _____________ 0 + \ / + \ out / +.....1.........0..... = interface + \ in / + \ / + \ / + \ / + 2 + +--> The two interface corners inherit the local ID of the associated original corners, i.e. 0 and 1. +--> Due to the numbering in counterclockwise order, it is m_vInterfaceID[0] = 0, m_vInterfaceID[1] = 1. + +The output is as follows: + + +------------ ROID_TRIANGLE ---------- + +Cut element corner 0: 9.052746e-01, -3.204833e-02 +Cut element corner 1: 9.041373e-01, -2.846668e-02 +Cut element corner 2: 9.014088e-01, -3.181983e-02 + +Original corner ID: 0 +Original corner ID: 1 +Original corner ID: 2 + +Interface corner ID: 0 +Interface corner ID: 1 + + + + +Case 2: The interface cuts the element as follows and the new ReferenceObjectID is ROID_QUADRILATERAL: + + + 1 _____________ 0 + \ / + \ in / +.....2.........2..... = interface + \ out / + \ / + \ / + \ / + 2 + +--> The two interface corners inherit the local ID of the associated original corner, i.e. 2. +--> Due to the numbering in counterclockwise order, it is m_vInterfaceID[0] = 2, m_vInterfaceID[1] = 3. + + +The output is as follows: + + + +--------- ROID_QUADRILATERAL -------- + +Cut element corner 0: 1.073265e+00, 9.822172e-02 +Cut element corner 1: 1.010256e+00, 1.019461e-01 +Cut element corner 2: 1.011714e+00, 9.931158e-02 +Cut element corner 3: 1.059025e+00, 8.072213e-02 + +Original corner ID: 0 +Original corner ID: 1 +Original corner ID: 2 +Original corner ID: 2 + +Interface corner ID: 2 +Interface corner ID: 3 + + + + diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base.h index 0c658daa6..baec24ec3 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base.h @@ -10,6 +10,8 @@ #include "lib_grid/multi_grid.h" #include "../cut_element_handler/cut_element_handler.h" +//#include "../cut_element_handler/cut_element_handler_flat_top.h" +//#include "../cut_element_handler/cut_element_handler_two_sided.h" #include "../interface_provider/interface_provider_particle.h" namespace ug{ @@ -32,20 +34,20 @@ class IInterfaceHandlerLocal /// access to element modus ElementModus elementModus(){ return m_elemModus; } - //////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////// /// virtual class contains all methods which need to be implemented by /// the class, derived from 'InterfaceHandlerLocalBase' - //////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////// /// computes the element modus and writes it to 'm_elemModus' virtual ElementModus get_element_modus(GridObject* elem) { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: get_element_modus()."); } - virtual ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation) + virtual ElementModus compute_element_modus(GridObject* elem) { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: compute_element_modus()."); } - virtual bool is_FTVertex(Vertex* vrt, size_t vrtIndex) - { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: is_FTVertex()."); } + virtual bool is_onInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: is_onInterfaceVertex()."); } virtual bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) { UG_THROW("in 'IInterfaceHandlerLocal': Missing virtual method: is_OutsideVertex()."); } @@ -85,106 +87,125 @@ class InterfaceHandlerLocalBase : public IInterfaceHandlerLocal typedef Grid::VertexAttachmentAccessor position_accessor_type; - InterfaceHandlerLocalBase(SmartPtr > cutElementHandler); - InterfaceHandlerLocalBase(SmartPtr > cutElementHandler); + InterfaceHandlerLocalBase(SmartPtr > cutElementHandler); + InterfaceHandlerLocalBase(SmartPtr > cutElementHandler); - ~InterfaceHandlerLocalBase(){} + virtual ~InterfaceHandlerLocalBase(){} - ////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// /// virtual base class methods: - ////////////////////////////////////////////////////////// - - /* - // used for method 'CollectCorners_': - virtual number get_LSvalue_byPosition(MathVector vrtPos) - { - // ToDo - // if ( m_prtIndex == -1 ) - // UG_THROW("'get_LSvalue_byPosition()': value of m_prtIndex not valid!\n"); - - return m_spCutElementHandler->get_LSvalue_byPosition(vrtPos); - } - virtual number get_LSvalue(Vertex* vrt, const int prtIndex) - { return m_spCutElementHandler->get_LSvalue(vrt, prtIndex); } - */ - virtual number get_LSvalue_byPosition(MathVector vrtPos) = 0; - virtual number get_LSvalue(Vertex* vrt, const int prtIndex) = 0; - - number get_edge_intersection(Vertex* vrt1, Vertex* vrt2); + /////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////////////// + /// central method: update_elem(): + /// it is called during TFVGeom:update() and computes the new cornders + /// i.e. 'vCornerCoords' of the cut element. Based on that ALL local + /// TFVGeom-computations (compute ip's, normals, gradients, ...) follow + /// as for the standard case - virtual bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc) = 0; - virtual bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc, std::vector& alphaOut)= 0; + // central method called by TFVGeom:update() + virtual bool update_elem(GridObject* elem, const MathVector* vCornerCoords); - - ////////////////////////////////////////////////////////// - /// base class methods: _impl.h - ////////////////////////////////////////////////////////// - bool update_elem(GridObject* elem, const MathVector* vCornerCoords); + /// recomputes the 'vCornerCoords' of the cut element and derives 'm_roid' + virtual void compute_cut_element_data(GridObject* elem); /// sets data needed for usual computations in case of INSIDE_DOM: 'm_vCornerCoords' and 'm_roid' - void set_flat_top_data(GridObject* elem, const MathVector* vCornerCoords, ReferenceObjectID roid); + virtual void set_element_data(GridObject* elem, const MathVector* vCornerCoords, + ReferenceObjectID roid); + /// computes the 'ElementModus' based on the corners of 'elem' and also sets some BoolMarker + // and cut element data ('VertexModus') in 'CutElementHander' storage + virtual ElementModus compute_element_modus(GridObject* elem) + { return m_spCutElementHandler->compute_element_modus(elem); } - /// updates all std::vectors-data and especially derives 'm_roid' - void compute_flat_top_data(GridObject* elem); + virtual ElementModus get_element_modus(GridObject* elem) + { return m_spCutElementHandler->get_element_modus(elem); } + + /// updates inner boundary data (called during FV1CutGeom::update()) + virtual void update_inner_boundary(const MathVector* vCornerCoords){}; + virtual void update_inner_boundary_for2(){}; + - /// updates inner boundary data (called during FV1CutGeom::update()) - void update_inner_boundary(const std::vector > vCornerCoords){}; - void update_inner_boundary_for2(){}; + //////////////////////////////////////////////////////////////// + /// helper methods for 'compute_cut_element_data()': _tools.h + /// ALL methods perform: + /// (1) computation of the new corners of a cut element + /// by computing the intersection with an edge + /// (2) adding the positions to 'vCornerCoords' data of + /// the finite element/volume geometry data storage + //////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////// - /// helper methods for 'update()': _tools.h - ////////////////////////////////////////////////////////// + /// collects new corners of the cut element + int CollectCorners_StdFV(GridObject* elem); + int CollectCorners_FlatTop_2d(GridObject* elem); + int CollectCorners_FlatTop_3d(GridObject* elem); + int get_cutMode(std::vector vVertex); + int CollectCorners_FlatTop_Prism3(GridObject* elem); + int CollectCorners_FlatTop_Prism4(GridObject* elem); + int CollectCorners_FlatTop_Pyramid(GridObject* elem); + int CollectCorners_FlatTop_originalTet(GridObject* elem); - /// collects all corners of the flat top element - int CollectCorners_StdFV(GridObject* elem); - int CollectCorners_FlatTop_2d(GridObject* elem); - int CollectCorners_FlatTop_3d(GridObject* elem); - int get_cutMode(std::vector vVertex); - int CollectCorners_FlatTop_Prism3(GridObject* elem); - int CollectCorners_FlatTop_Prism4(GridObject* elem); - int CollectCorners_FlatTop_Pyramid(GridObject* elem); - int CollectCorners_FlatTop_originalTet(GridObject* elem); + /// helper methods called during 'CollectCorners_FlatTop_2d' to bring the newly computed + // 'vCornerCoords' in correct order (counter clockwise) + void ResortQuadrilateral(std::vector, size_t > > vInsideCorners, + std::vector, size_t > > vOutsideCorners, + MathVector normalDir); + bool isCCW(std::vector > vCornerCoords, MathVector normal); + + // newly computed intersectino points get collected during 'CollectCorners_...()' only, + // if they were not collected before + bool isIncluded(std::vector > vCheckList, MathVector checkPoint); - void ResortQuadrilateral(std::vector, size_t > > vInsideCorners, - std::vector, size_t > > vOutsideCorners, - MathVector normalDir); + ////////////////////////////////////////////////////////////////////// + /// central methods to compute the intersectin with an edge + ////////////////////////////////////////////////////////////////////// + + // computes the 'level-set' value of a point w.r.t. the interface, in order to + // derive its 'VertexModus', i.e. INSIDE, OUTSIDE, ON_INTERFACE + virtual number get_LSvalue_byPosition(MathVector vrtPos) = 0; - bool isIncluded(std::vector > vCheckList, MathVector checkPoint); - bool isCCW(std::vector > vCornerCoords, MathVector normal); + number get_LSvalue(Vertex* vrt) + { return get_LSvalue_byPosition(m_aaPos[vrt]); } + virtual bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, + Vertex* vrtInsideCirc) = 0; + virtual bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, + Vertex* vrtInsideCirc, std::vector& alphaOut)= 0; + ////////////////////////////////////////////////////////// - /// further helper methods + /// further helper methods in _tools.h ////////////////////////////////////////////////////////// /// for boundary computations - bool lies_onInterface(const size_t newID); + bool lies_onInterface(const size_t newID); - bool remapped_fromInterface(const size_t origID); - bool remapped_fromInterface(const size_t origID, size_t& get_interfaceID); - bool is_boundary_face(const size_t sideID); + bool remapped_fromInterface(const size_t origID); + bool remapped_fromInterface(const size_t origID, size_t& get_interfaceID); + bool is_boundary_face(const size_t sideID); + size_t get_vertex_index(Vertex* vrt, GridObject* elem); - ////////////////////////////////////////////////////////// - /// getter methods + /// access methods ////////////////////////////////////////////////////////// - size_t get_vertex_index(Vertex* vrt, GridObject* elem); - /// access to roid ReferenceObjectID roid(){ return m_roid; } /// access to 'm_vCornerCoords' const std::vector > corners() const { return m_vCornerCoords; } const MathVector* pCorners() const { return &m_vCornerCoords[0]; } + /// access to single entry of 'm_vCornerCoords' const MathVector corner(size_t i) { return m_vCornerCoords[i]; } + /// access to 'm_vInterfaceID' std::vector interface_id_all() { return m_vInterfaceID; } + /// access to single entry of 'm_vInterfaceID' size_t interface_id(size_t i) { return m_vInterfaceID[i]; } + /// access to single entry of 'm_vOriginalCornerID' const size_t corner_orig(size_t i) const { return m_vOriginalCornerID[i]; } @@ -209,15 +230,21 @@ class InterfaceHandlerLocalBase : public IInterfaceHandlerLocal void set_StdFV_assembling(bool bValue) { m_bUseStdFVAssembling = bValue; } bool StdFV_assembling() { return m_bUseStdFVAssembling; } - // called by FV1Geom during geo.update() of ElemDisc: - void set_orientation(const int orientation) - { m_orientationInterface = orientation; } - int get_orientation() - { return m_orientationInterface; } + void set_print_cutElemData(bool bValue) { m_bPrintCutElemDataToFile = bValue; } + bool print_cutElment_data() { return m_bPrintCutElemDataToFile; } + // called by FV1Geom during geo.update() of ElemDisc: + void set_orientation(const int orientation) { m_spCutElementHandler->set_orientation(orientation); } + int get_orientation() { return m_spCutElementHandler->get_orientation(); } - void print_InterfaceDdata(); + + ////////////////////////////////////////////////////////// + /// output + ////////////////////////////////////////////////////////// + void print_CutElementData(); + + /////////////////////////////////////////////////////////////// /// base members /////////////////////////////////////////////////////////////// @@ -228,16 +255,19 @@ class InterfaceHandlerLocalBase : public IInterfaceHandlerLocal position_accessor_type m_aaPos; /// > m_vCornerCoords; - /// current indices of flat top corners + /// local indices of interface corners + /// (in case of a remapping onto the original grid nodes, it is the local + /// index of the node accross the interface, lying on the same edge as + /// the interface node std::vector m_vInterfaceID; - /// current indices of all not-flat-top corners + /// local indices of all not-interface corners std::vector m_vNOInterfaceID; /// maps the new corner indices to the original indices: @@ -253,14 +283,19 @@ class InterfaceHandlerLocalBase : public IInterfaceHandlerLocal LocalVector m_quadriLocD; LocalVector m_quadriLocU; - int m_orientationInterface; + /// for a circular interface and orientation = 1, the + /// inner of the circle belongs to the outside domain + int m_orientationInterface; // default = 1 /// flag for call of CollectCorners_StdFV() bool m_bUseStdFVAssembling; // default = false + /// flag for print of cut-element data into file + bool m_bPrintCutElemDataToFile; // default = false + /// contains radius, center and density of all given particles - SmartPtr > m_spCutElementHandler; + SmartPtr > m_spCutElementHandler; }; diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_impl.h index a5492883e..15f55635b 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_impl.h @@ -12,27 +12,18 @@ namespace ug{ -/////////////////////////////////////////////////////////////// -/// methods for class 'IInterfaceHandlerLocal' -/////////////////////////////////////////////////////////////// - - - -/////////////////////////////////////////////////////////////// -/// methods for class 'InterfaceHandlerLocalBase' -/////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////// template InterfaceHandlerLocalBase:: -InterfaceHandlerLocalBase(SmartPtr > cutElementHandler) : +InterfaceHandlerLocalBase(SmartPtr > cutElementHandler) : m_spMG(cutElementHandler->m_spMG), m_roid(ROID_UNKNOWN), - m_orientationInterface(1), m_bUseStdFVAssembling(false), - m_spCutElementHandler((SmartPtr >)cutElementHandler) + m_bPrintCutElemDataToFile(false), + m_spCutElementHandler((SmartPtr >)cutElementHandler) { // get position attachment m_aPos = GetDefaultPositionAttachment(); @@ -51,12 +42,11 @@ InterfaceHandlerLocalBase(SmartPtr > cutElementHan template InterfaceHandlerLocalBase:: -InterfaceHandlerLocalBase(SmartPtr > cutElementHandler) : +InterfaceHandlerLocalBase(SmartPtr > cutElementHandler) : m_spMG(cutElementHandler->m_spMG), m_roid(ROID_UNKNOWN), - m_orientationInterface(1), m_bUseStdFVAssembling(false), - m_spCutElementHandler((SmartPtr >)cutElementHandler) + m_spCutElementHandler((SmartPtr >)cutElementHandler) { // get position attachment m_aPos = GetDefaultPositionAttachment(); @@ -74,12 +64,10 @@ InterfaceHandlerLocalBase(SmartPtr > cutElementHa } -// see mod_elem_flat_top() of flat_top.h template void InterfaceHandlerLocalBase:: -compute_flat_top_data(GridObject* elem) +compute_cut_element_data(GridObject* elem) { - bool output = true; // get new element corners and according element type if ( StdFV_assembling() ) // Version an Stelle von 'm_bUsualAss = true' @@ -107,33 +95,20 @@ compute_flat_top_data(GridObject* elem) if ( elem->reference_object_id() != ROID_TETRAHEDRON ) UG_THROW("Discretisation only coded for tetrahedral elements!\n"); - - m_elemModus = get_element_modus(elem); // computed via 'compute_element_modus()' during 'update_marker()' - - if ( output ){ - if( m_elemModus == CUT_BY_INTERFACE) - { - UG_LOG("_________________ compute_flat_top_data()_________________\n"); - - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); - for ( size_t i = 0; i < m_vOriginalCornerID.size(); ++i ) - UG_LOG("Original: id = " << m_vOriginalCornerID[i] << "\n"); - UG_LOG("\n"); - for ( size_t i = 0; i < m_vInterfaceID.size(); ++i ) - UG_LOG("Interface: id = " << m_vInterfaceID[i] << "\n"); - UG_LOG("\n"); - } - - } +// output computed data to file + if ( print_cutElment_data() ) + print_CutElementData(); } template void InterfaceHandlerLocalBase:: -set_flat_top_data(GridObject* elem, const MathVector* vCornerCoords, ReferenceObjectID roid) +set_element_data(GridObject* elem, const MathVector* vCornerCoords, ReferenceObjectID roid) { - size_t numCo = dim+1; // -> ok, since implemented only for Triangles and Tetrahedra +// for elements, lying inside the domain, set the number of corners +// to the standard case, which is dim+1, since code is only valid +// for Triangles and Tetrahedra + size_t numCo = dim+1; // set 'm_vCornerCoords' m_vCornerCoords.clear(); @@ -143,9 +118,6 @@ set_flat_top_data(GridObject* elem, const MathVector* vCornerCoords, // set 'm_roid' m_roid = roid; - //if ( roid != ROID_UNKNOWN ) return; - - // for OUTSIDE_DOM, also fill 'vOriginalCornerID' and 'vInterfaceID': m_vInterfaceID.clear(); m_vOriginalCornerID.clear(); @@ -155,13 +127,13 @@ set_flat_top_data(GridObject* elem, const MathVector* vCornerCoords, std::vector vVertex; CollectVertices(vVertex, *m_spMG, elem); -// loop vertices +// loop vertices and fill cut element data with the usual nodes of the element for(size_t i = 0; i < vVertex.size(); ++i) { // get element Vertex* vrtRoot = vVertex[i]; - if ( !is_FTVertex(vrtRoot, -1) ) + if ( !is_onInterfaceVertex(vrtRoot, i) ) { m_vCornerCoords.push_back(m_aaPos[vrtRoot]); m_vOriginalCornerID.push_back(i); @@ -179,29 +151,31 @@ set_flat_top_data(GridObject* elem, const MathVector* vCornerCoords, -// see preprocess() of flat_top.h // called by geo.update()!! template bool InterfaceHandlerLocalBase:: update_elem(GridObject* elem, const MathVector* vCornerCoords) { bool do_update_local = false; + +// compute and set the element modus: + m_elemModus = compute_element_modus(elem); -// computing flat top modus - m_elemModus = compute_element_modus(elem, m_orientationInterface); +// m_elemModus = get_element_modus(elem); +// --> not possible to use, since local data will be computed during 'compute_element_modus()' switch(m_elemModus) { - case INSIDE_DOM: if ( dim == 2 ) set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); - if ( dim == 3 ) set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + case INSIDE_DOM: if ( dim == 2 ) set_element_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) set_element_data(elem, vCornerCoords, ROID_TETRAHEDRON); break; // usual assembling - case OUTSIDE_DOM: if ( dim == 2 ) set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); - if ( dim == 3 ) set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + case OUTSIDE_DOM: if ( dim == 2 ) set_element_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) set_element_data(elem, vCornerCoords, ROID_TETRAHEDRON); break; // usual assembling - case CUT_BY_INTERFACE: compute_flat_top_data(elem); + case CUT_BY_INTERFACE: compute_cut_element_data(elem); //if ( m_roid == ROID_PYRAMID )UG_THROW("PYRAMID\n"); do_update_local = true; - break; // flat top assembling + break; // cut element assembling default: throw(UGError("Error in InterfaceHandlerLocalBase::update(): switch(m_elemModus)!")); } diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_tools.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_tools.h index 748220149..ffe935b30 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_tools.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_base_tools.h @@ -10,24 +10,7 @@ namespace ug{ -//////////////////////////////////////////////////////////////////////////////// -// FlatTopBase methods - ROID/CollectCorners... -//////////////////////////////////////////////////////////////////////////////// - -template -number InterfaceHandlerLocalBase:: -get_edge_intersection(Vertex* vrt1, Vertex* vrt2) -{ - - number LSvalue1 = get_LSvalue(vrt1, 0); - number LSvalue2 = get_LSvalue(vrt2, 0); - - number alpha = LSvalue1 / (LSvalue1 - LSvalue2); - - return alpha; -} - -// used for boundary implementation + template bool InterfaceHandlerLocalBase:: lies_onInterface(const size_t newID) @@ -101,126 +84,7 @@ is_boundary_face(const size_t sideID) } -/* -// compare implementation of 'DimFV1Geometry::update_boundary_faces()' -template -void InterfaceHandlerLocalBase:: -update_inner_boundary_faces() -{ - - ///////////////////////////////////////////////////////////////////////////// - // get general data - ///////////////////////////////////////////////////////////////////////////// - const DimReferenceElement& rRefElem - = ReferenceElementProvider::get(this->m_roid); - - DimReferenceMapping& rMapping = ReferenceMappingProvider::get(this->m_roid); - rMapping.update(this->m_vCornerCoords); - - const LocalShapeFunctionSet& TrialSpace = - LocalFiniteElementProvider::get(this->m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); - - ///////////////////////////////////////////////////////////////////////////// - // compute local and global geom object midpoints for each dimension - ///////////////////////////////////////////////////////////////////////////// - - MathVector vvLocMid[dim+1][maxMid]; - MathVector vvGloMid[dim+1][maxMid]; - - // set corners of element as local centers of nodes - for(size_t i = 0; i < rRefElem.num(0); ++i) - vvLocMid[0][i] = rRefElem.corner(i); - - // compute local midpoints - interfaceComputeMidPoints, maxMid>(rRefElem, vvLocMid[0], vvLocMid); - - // remember global position of nodes - for(size_t i = 0; i < rRefElem.num(0); ++i) - vvGloMid[0][i] = this->m_vCornerCoords[i]; - // compute local midpoints - interfaceComputeMidPoints, maxMid>(rRefElem, vvGloMid[0], vvGloMid); - - ///////////////////////////////////////////////////////////////////////////// - // collect boudary faces - ///////////////////////////////////////////////////////////////////////////// - - // get number of sides of element - size_t numSides = 0; - numSides = rRefElem.num(dim-1); - - // current number of bf - size_t curr_bf = 0; - - m_vBF.clear(); - // loop sides of element - for(size_t side = 0; side < numSides; ++side) - { - // side is no boundary face => continue - if ( !is_boundary_face(side) ) - continue; - - // number of corners of side (special case bottom side pyramid) - const int coOfSide = (this->m_roid != ROID_PYRAMID || side != 0) - ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; - - // resize vector - m_vBF.resize(curr_bf + coOfSide); - - // loop corners - for(int co = 0; co < coOfSide; ++co) - { - // get current bf - interfaceBF& bf = m_vBF[curr_bf]; - - // set node id == scv this bf belongs to - if (this->m_roid != ROID_PYRAMID || side != 0) - bf.nodeId = rRefElem.id(dim-1, side, 0, co); - else - { - // map according to order defined in ComputeBFMidID - bf.nodeId = rRefElem.id(dim-1, side, 0, (co % 3) + (co>3 ? 1 : 0)); - } - - // Compute MidID for BF - interfaceComputeBFMidID(rRefElem, side, bf.vMidID, co); - - // copy corners of bf - interfaceCopyCornerByMidID(bf.vLocPos, bf.vMidID, vvLocMid, interfaceBF::numCo); - interfaceCopyCornerByMidID(bf.vGloPos, bf.vMidID, vvGloMid, interfaceBF::numCo); - - // integration point - AveragePositions(bf.localIP, bf.vLocPos, interfaceBF::numCo); - AveragePositions(bf.globalIP, bf.vGloPos, interfaceBF::numCo); - - // normal on scvf - traits::NormalOnSCVF(bf.Normal, bf.vGloPos, vvGloMid[0]); - - // compute volume - bf.Vol = VecTwoNorm(bf.Normal); - - // compute shapes and grads - bf.numSH = TrialSpace.num_sh(); - TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); - TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); - - // get reference mapping - rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); - bf.detj = rMapping.sqrt_gram_det(bf.localIP); - - // compute global gradients - for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) - MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); - - // increase curr_bf - ++curr_bf; - - } // end loop of corners of side - - } // end loop sides of element - - -} -*/ + template void InterfaceHandlerLocalBase:: set_roid_2d() @@ -311,9 +175,14 @@ ResortQuadrilateral(std::vector, size_t > > vInsideCor MathVector normalDir) { // some checks: - if ( vOutsideCorners.size() != 2 ) UG_THROW("vOutsideCorners.size() has to be 2 in 2d case, but is " << vOutsideCorners.size() << ".\n"); - if ( vInsideCorners.size() != 2 ) UG_THROW("vInsideCorners.size() has to be 2 in 2d case, but is " << vInsideCorners.size() << ".\n"); - if ( vOutsideCorners[0].second != vOutsideCorners[1].second ) UG_THROW("Outside indices must be identical!\n"); + if ( vOutsideCorners.size() != 2 ) + UG_THROW("vOutsideCorners.size() has to be 2 in 2d case, but is " + << vOutsideCorners.size() << ".\n"); + if ( vInsideCorners.size() != 2 ) + UG_THROW("vInsideCorners.size() has to be 2 in 2d case, but is " + << vInsideCorners.size() << ".\n"); + if ( vOutsideCorners[0].second != vOutsideCorners[1].second ) + UG_THROW("Outside indices must be identical!\n"); //////////////////////////////////////////////////////////////////////////////////////////// // 1) Copy 'vOutsideCorners'/'vOutsideCorners' to 'm_vCornerCoords' in special order: @@ -386,7 +255,9 @@ ResortQuadrilateral(std::vector, size_t > > vInsideCor CalculateTriangleNormalNoNormalize(vNormOut1, vCornerCoordsBlow[0], vCornerCoordsBlow[1], vCornerCoordsBlow[2]); CalculateTriangleNormalNoNormalize(vNormOut2, vCornerCoordsBlow[2], vCornerCoordsBlow[3], vCornerCoordsBlow[0]); - if ( VecDot(vNormOut1, vNormOut2) < 0 ) UG_THROW("check 1 failed after second check!\n"); +// some check + if ( VecDot(vNormOut1, vNormOut2) < 0 ) + UG_THROW("check 1 failed after second check!\n"); // pure copy of 'normalDir' data because of data type inconsistence (MathVector<3> vs. MathVector) @@ -423,10 +294,7 @@ template int InterfaceHandlerLocalBase:: CollectCorners_StdFV(GridObject* elem) { - ////////////////////////////////////////////// - // 1) fill vector with fluid corners: - ////////////////////////////////////////////// - +// prepare data m_vCornerCoords.clear(); m_vInterfaceID.clear(); m_vOriginalCornerID.clear(); @@ -440,31 +308,36 @@ CollectCorners_StdFV(GridObject* elem) std::vector vVertex; CollectVertices(vVertex, *m_spMG, elem); - +// perform check, whether element is valid for computations (i.e. CUT_BY_INTERFACE) bool isOutsideVertex = false; for(size_t i = 0; i < vVertex.size(); ++i) { // remember boolian for check, weather there existe at least one vertex, which is FT! - if ( is_OutsideVertex(vVertex[i], i) || is_FTVertex(vVertex[i], i) ) + if ( is_OutsideVertex(vVertex[i], i) || is_onInterfaceVertex(vVertex[i], i) ) { isOutsideVertex = true; break; } } - if ( !isOutsideVertex ) UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); + +////////////////////////////////////////////// +// 1) Start filling vector with element corners: +////////////////////////////////////////////// + // loop vertices for(size_t i = 0; i < vVertex.size(); ++i) { // get element Vertex* vrtRoot = vVertex[i]; - ////////////////////////////////////////////// - // case 1: - // vertex insideFluid => Position und index puschen - if ( !is_FTVertex(vVertex[i], i) ) + ////////////////////////////////////////////// + // case 1: + // vertex inside domain + // => push position and local index to 'vInsideCorners' + if ( !is_onInterfaceVertex(vVertex[i], i) ) { if ( is_nearInterfaceVertex(vrtRoot, i) ) { @@ -479,6 +352,10 @@ CollectCorners_StdFV(GridObject* elem) } } + ////////////////////////////////////////////// + // case 2: + // vertex = outside domain + // => push position and local index 'vOutsideCorners' else { m_vCornerCoords.push_back(m_aaPos[vrtRoot]); @@ -491,7 +368,7 @@ CollectCorners_StdFV(GridObject* elem) } - // skip whole element, since only FT points are included +// skip whole element, since only interface points are included if ( dim == 2 && m_vCornerCoords.size() != 3 ) UG_THROW("in 'CollectCorners_StdFV()': m_vCornerCoords.size() " "= " << m_vCornerCoords.size() << "not possible!\n"); @@ -499,43 +376,6 @@ CollectCorners_StdFV(GridObject* elem) UG_THROW("in 'CollectCorners_StdFV()': m_vCornerCoords.size() " "= " << m_vCornerCoords.size() << "not possible!\n"); -//////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////// - - const char* filename; - filename = "output_StdFV."; - - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* outputFile = fopen(name.c_str(), "a"); - - fprintf(outputFile,"\n_________________________ begin 'CollectIBCorners_StdFV' ________________________\n"); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); - - fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); - - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - - - fprintf(outputFile,"\n_________________________ end 'CollectIBCorners_StdFV()' ______________________________\n\n"); - - fclose(outputFile); - - return m_vCornerCoords.size(); } @@ -553,296 +393,9 @@ get_vertex_index(Vertex* vrt, GridObject* elem) if ( vrt == vVertex[i]) return i; - UG_THROW("in CutElementHandlerImmersed::get_vertex_index: no index found!\n"); + UG_THROW("in CutElementHandler_TwoSided::get_vertex_index: no index found!\n"); } -/* -template -int InterfaceHandlerLocalBase:: -CollectCorners_FlatTop_2d(GridObject* elem) -{ - bool bOutput = false; - - if ( bOutput ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_2d()' ______________________________\n\n"); - - ////////////////////////////////////////////// - // 1) fill vector with fluid corners: - ////////////////////////////////////////////// - - m_vCornerCoords.clear(); - m_vInterfaceID.clear(); - m_vOriginalCornerID.clear(); - -// buffer vectors for (cornerCoords, cornerIndex) - std::vector, size_t > > vOutsideCorners; - std::vector, size_t > > vInsideCorners; - std::vector, size_t > > vNearIntCorners; - -// collect all vertices of the element - std::vector vVertex; - CollectVertices(vVertex, *m_spMG, elem); - - bool isFTVertex = false; - for(size_t i = 0; i < vVertex.size(); ++i) - { - // remember boolian for check, weather there existe at least one vertex, which is FT! - isFTVertex = is_FTVertex(vVertex[i], i); - if ( isFTVertex ) - break; - } - - if ( !isFTVertex ) - UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); - - // collect all edges of the element - std::vector vEdges; - CollectEdgesSorted(vEdges, *m_spMG, elem); - - // loop vertices - ////////////////////////////////////////////// - // REMARK: - // order is the same as in 'vCornerCoords', therefore we can be sure, that the - // order of the new 'vCornerIBCoords' will be consistent with the grid standard - ////////////////////////////////////////////// - - bool bNearInterface = false; - for(size_t i = 0; i < vVertex.size(); ++i) - { - - // get element - Vertex* vrtRoot = vVertex[i]; - - ////////////////////////////////////////////// - // case 1: - // vertex insideFluid - // => Position und index puschen - if ( ! is_FTVertex(vrtRoot, i) ) - { - - if ( is_nearInterfaceVertex(vrtRoot, i) ) - { - UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); - } - else - { - m_vCornerCoords.push_back(m_aaPos[vrtRoot]); - m_vOriginalCornerID.push_back(i); - - vInsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); - } - - } - ////////////////////////////////////////////// - // case 2: - // vertex = FT + ON interface - // => KEINE Berechnung von 'intersectionPoint' notwendig! -> pushen und alten index pushen - - // REMARK: is_nearInterfaceVerx = false per default, if m_vThresholdOnLevel = 0.0 - else if ( is_nearInterfaceVertex(vrtRoot, i) ) - { - bNearInterface = true; - m_vCornerCoords.push_back(m_aaPos[vrtRoot]); - m_vOriginalCornerID.push_back(i); - m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! - - vOutsideCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); - vNearIntCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); - - } - ////////////////////////////////////////////// - // case 3: - // vertex 'outsideFluid' - // => NEUE Position berechen+pushen und alten index pushen - else - { - ////////////////////////////////////////////////////////////////////////////////////////// - // loop alle edges, die interface schneiden und damit einen neuen intersectionPnt - // beitragen zum damit assoziierten alten index - for(size_t e = 0; e < vEdges.size(); ++e) - { - Edge* edge = vEdges[e]; - std::vector vVertexEdge; - CollectVertices(vVertexEdge, *m_spMG, edge); - if ( vVertexEdge.size() != 2 ) - UG_THROW("error in collecting vertices associated to an edge!....EXIT!...\n"); - - Vertex* vrt1 = vVertexEdge[0]; - Vertex* vrt2 = vVertexEdge[1]; - size_t vrtInd1 = get_vertex_index(vrt1, elem); - size_t vrtInd2 = get_vertex_index(vrt2, elem); - - MathVector intersectionPnt; - - /////////////////////////////////////////////////////////////////// - // lies vrtRoot on a cutted edge? - /////////////////////////////////////////////////////////////////// - // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! - if ( is_nearInterfaceVertex(vrt2, vrtInd2) || is_nearInterfaceVertex(vrt1, vrtInd1) ) - { bNearInterface = true; continue; } - // case2: vert2 = outsideParticle && vrt1 = insideParticle: - else if ( vrtRoot == vrt1 && !is_FTVertex(vrt2, vrtInd2) ){ - get_intersection_point(intersectionPnt, vrt2, vrt1); - } - // case3: vrt1 = outsideParticle && vrt2 = insideParticle: - else if ( vrtRoot == vrt2 && !is_FTVertex(vrt1, vrtInd1) ) - get_intersection_point(intersectionPnt, vrt1, vrt2); - else - continue; - - - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) - UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " - " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); - - - /////////////////////////////////////////////////////////////////// - // only push_back, if not included yet! - // -> can be ONLY the case, if the intersectionPoint is a node - if ( ! isIncluded(m_vCornerCoords, intersectionPnt) ) - { - - m_vCornerCoords.push_back(intersectionPnt); - m_vOriginalCornerID.push_back(i); - m_vInterfaceID.push_back(m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! - - vOutsideCorners.push_back(std::make_pair(intersectionPnt, i)); - } - - - } // end edge-loop - - } // end else-case - - } // end vrt-loop - -//////////////////////////////////////////////////////////////////////////////////////////// -// Postprecessing for quadrilaterals ( <=> vOutsideCorners == 2 ) -// (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface -// => no Quadrilateral, but Triangle!! -//////////////////////////////////////////////////////////////////////////////////////////// - MathVector normalDir(0.0); - if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) - ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); - else if ( bNearInterface ) - { - // Quadrilateral -> Triangle - if ( vInsideCorners.size() == 1 ) // case 1 - { - // do nothing, since re-sorting not necessary...??? - } - // skip whole element, since only FT points are included - else if ( vInsideCorners.size() == 0 ) - UG_THROW("in 'CollectCorners_FlatTop_2d()': vInsideCorners.size() " - "= " << vInsideCorners.size() << "not possible!\n"); - } - - - if ( bOutput) - { -//////////////////////////////////////////////////////////////////////////////////////////// -// Wirte to files: -//////////////////////////////////////////////////////////////////////////////////////////// - if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) - { - const char* filename = "File_Quadrilateral."; - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* printFile = fopen(name.c_str(), "a"); - fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(printFile," vCornerCoords: %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1]); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(printFile,"OriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(printFile,"m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - for ( size_t i = 0; i < vInsideCorners.size(); ++i ) - fprintf(printFile," vInsideCorners: %e, %e \n", vInsideCorners[i].first[0], vInsideCorners[i].first[1]); - for ( size_t i = 0; i < vNearIntCorners.size(); ++i ) - fprintf(printFile," vNearIntCorners: %e, %e \n", vNearIntCorners[i].first[0], vNearIntCorners[i].first[1]); - for ( size_t i = 0; i < vOutsideCorners.size(); ++i ) - fprintf(printFile," vOutsideCorners: %e, %e \n", vOutsideCorners[i].first[0], vOutsideCorners[i].first[1]); - fclose(printFile); - } - else if ( bNearInterface ) - { - // Quadrilateral -> Triangle - if ( vInsideCorners.size() == 1 ) // case 1 - { - // do nothing, since re-sorting not necessary...??? - - const char* filename = "File_newTirangle."; - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* printFile = fopen(name.c_str(), "a"); - fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(printFile," vCornerCoords: %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1]); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(printFile,"OriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(printFile,"m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - for ( size_t i = 0; i < vInsideCorners.size(); ++i ) - fprintf(printFile," vInsideCorners: %e, %e \n", vInsideCorners[i].first[0], vInsideCorners[i].first[1]); - for ( size_t i = 0; i < vNearIntCorners.size(); ++i ) - fprintf(printFile," vNearIntCorners: %e, %e \n", vNearIntCorners[i].first[0], vNearIntCorners[i].first[1]); - for ( size_t i = 0; i < vOutsideCorners.size(); ++i ) - fprintf(printFile," vOutsideCorners: %e, %e \n", vOutsideCorners[i].first[0], vOutsideCorners[i].first[1]); - fclose(printFile); - } - - } -//////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////// - - if (bOutput) - { - const char* filename = "output."; - std::string name(filename); - char ext[50]; - if ( dim == 2 ) - sprintf(ext, "2d.txt"); - if ( dim == 3 ) - sprintf(ext, "3d.txt"); - name.append(ext); - FILE* outputFile = fopen(name.c_str(), "a"); - - fprintf(outputFile,"\n_________________________ begin 'CollectIBCorners2d' ________________________\n"); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); - - fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); - - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - - - fprintf(outputFile,"\n_________________________ end 'CollectIBCorners2d()' ______________________________\n\n"); - - fclose(outputFile); - - } - } - if ( bOutput ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_2d()' ______________________________\n\n"); - - return m_vCornerCoords.size(); - -} -*/ - @@ -850,14 +403,8 @@ template int InterfaceHandlerLocalBase:: CollectCorners_FlatTop_2d(GridObject* elem) { - bool bOutput = false; - bool bOutputToFile = false; - if ( bOutput ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_2d()' ______________________________\n\n"); - - ////////////////////////////////////////////// - // 1) fill vector with fluid corners: - ////////////////////////////////////////////// +// prepare data m_vCornerCoords.clear(); m_vInterfaceID.clear(); m_vOriginalCornerID.clear(); @@ -871,45 +418,47 @@ CollectCorners_FlatTop_2d(GridObject* elem) std::vector vVertex; CollectVertices(vVertex, *m_spMG, elem); +// perform check, whether element is valid for computations (i.e. CUT_BY_INTERFACE) bool isFTVertex = false; for(size_t i = 0; i < vVertex.size(); ++i) { // remember boolian for check, weather there existe at least one vertex, which is FT! - isFTVertex = is_FTVertex(vVertex[i], i); + isFTVertex = is_onInterfaceVertex(vVertex[i], i); if ( isFTVertex ) break; } - - if ( !isFTVertex ) UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); - // collect all edges of the element +/////////////////////////////////////////////////////////////////////////////// +// 1) Start filling the vector with corners: +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// REMARK: +// The order is the same as in 'vCornerCoords', therefore we can be sure, that +// the order of the new corners (on the interface) will be consistent with the +// grid standard +/////////////////////////////////////////////////////////////////////////////// + + +// collect all edges of the element std::vector vEdges; CollectEdgesSorted(vEdges, *m_spMG, elem); + bool bNearInterface = false; - // loop vertices - ////////////////////////////////////////////// - // REMARK: - // order is the same as in 'vCornerCoords', therefore we can be sure, that the - // order of the new 'vCornerIBCoords' will be consistent with the grid standard - ////////////////////////////////////////////// - - bool bNearInterface = false; +// loop vertices for(size_t i = 0; i < vVertex.size(); ++i) { // get element Vertex* vrtRoot = vVertex[i]; - if ( (fabs(m_aaPos[vVertex[i]][0] - 1.08941) < 1e-4) && (fabs(m_aaPos[vVertex[i]][1] + 0.140733) < 1e-4) ) - UG_LOG("stop here..\n"); - - ////////////////////////////////////////////// - // case 1: - // vertex insideFluid - // => Position und index puschen - if ( ! is_FTVertex(vrtRoot, i) ) + ////////////////////////////////////////////// + // case 1: + // vertex inside domain + // => push position and local index to 'vInsideCorners' + if ( ! is_onInterfaceVertex(vrtRoot, i) ) { if ( is_nearInterfaceVertex(vrtRoot, i) ) @@ -925,12 +474,12 @@ CollectCorners_FlatTop_2d(GridObject* elem) } } - ////////////////////////////////////////////// - // case 2: - // vertex = FT + ON interface - // => KEINE Berechnung von 'intersectionPoint' notwendig! -> pushen und alten index pushen - - // REMARK: is_nearInterfaceVerx = false per default, if m_vThresholdOnLevel = 0.0 + ////////////////////////////////////////////// + // case 2: + // vertex = on interface + near interface + // => no computation of position necessary, since the position of the + // near interface vertex will be taken and its local index + // => push position and local index else if ( is_nearInterfaceVertex(vrtRoot, i) ) { bNearInterface = true; @@ -942,15 +491,16 @@ CollectCorners_FlatTop_2d(GridObject* elem) vNearIntCorners.push_back(std::make_pair(m_aaPos[vrtRoot], i)); } - ////////////////////////////////////////////// - // case 3: - // vertex 'outsideFluid' - // => NEUE Position berechen+pushen und alten index pushen + ////////////////////////////////////////////// + // case 3: + // vertex = outside domain + // => compute new position: by loop of edges else { - ////////////////////////////////////////////////////////////////////////////////////////// - // loop alle edges, die interface schneiden und damit einen neuen intersectionPnt - // beitragen zum damit assoziierten alten index + ////////////////////////////////////////////////////////////////////////////// + // loop all edges, of which the current vertex (vrtRoot) is part of; if the + // edge is cut of the interface (i.e. the second vrt inside fluid), then + // compute intersection point and store local index for(size_t e = 0; e < vEdges.size(); ++e) { Edge* edge = vEdges[e]; @@ -967,26 +517,28 @@ CollectCorners_FlatTop_2d(GridObject* elem) MathVector intersectionPnt; /////////////////////////////////////////////////////////////////// - // lies vrtRoot on a cutted edge? + // does vrtRoot lie on a cutted edge? /////////////////////////////////////////////////////////////////// // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! if ( is_nearInterfaceVertex(vrt2, vrtInd2) || is_nearInterfaceVertex(vrt1, vrtInd1) ) { bNearInterface = true; continue; } - // case2: vert2 = outsideParticle && vrt1 = insideParticle: - else if ( vrtRoot == vrt1 && !is_FTVertex(vrt2, vrtInd2) ){ + // case2: vrt1 = outside domain && vrt2 = inside domain: + else if ( vrtRoot == vrt1 && !is_onInterfaceVertex(vrt2, vrtInd2) ){ get_intersection_point(intersectionPnt, vrt2, vrt1); } - // case3: vrt1 = outsideParticle && vrt2 = insideParticle: - else if ( vrtRoot == vrt2 && !is_FTVertex(vrt1, vrtInd1) ) + // case3: vrt1 = inside domain && vrt2 = outside domain: + else if ( vrtRoot == vrt2 && !is_onInterfaceVertex(vrt1, vrtInd1) ) get_intersection_point(intersectionPnt, vrt1, vrt2); else continue; // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + const number threshold_max = -1e+6; + const number LSValue = get_LSvalue_byPosition(intersectionPnt); + if ( fabs(LSValue) > 1e-6 && LSValue != threshold_max ) UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " - " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + " intersectionPnt = " << intersectionPnt << "\n distance from interface = " << LSValue << "\n"); /////////////////////////////////////////////////////////////////// @@ -1011,9 +563,11 @@ CollectCorners_FlatTop_2d(GridObject* elem) //////////////////////////////////////////////////////////////////////////////////////////// // Postprecessing for quadrilaterals ( <=> vOutsideCorners == 2 ) -// (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface +// (vInsideCorners.size() == 2) && (bNearInterface) +// => ALL nodes inside domain, BUT one ON surface // => no Quadrilateral, but Triangle!! //////////////////////////////////////////////////////////////////////////////////////////// + MathVector normalDir(0.0); if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); @@ -1030,106 +584,7 @@ CollectCorners_FlatTop_2d(GridObject* elem) "= " << vInsideCorners.size() << "not possible!\n"); } - -//////////////////////////////////////////////////////////////////////////////////////////// -// Wirte to files: -//////////////////////////////////////////////////////////////////////////////////////////// -if ( bOutputToFile ) -{ - if ( (m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) - { - const char* filename = "File_Quadrilateral."; - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* printFile = fopen(name.c_str(), "a"); - fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(printFile," vCornerCoords: %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1]); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(printFile,"OriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(printFile,"m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - for ( size_t i = 0; i < vInsideCorners.size(); ++i ) - fprintf(printFile," vInsideCorners: %e, %e \n", vInsideCorners[i].first[0], vInsideCorners[i].first[1]); - for ( size_t i = 0; i < vNearIntCorners.size(); ++i ) - fprintf(printFile," vNearIntCorners: %e, %e \n", vNearIntCorners[i].first[0], vNearIntCorners[i].first[1]); - for ( size_t i = 0; i < vOutsideCorners.size(); ++i ) - fprintf(printFile," vOutsideCorners: %e, %e \n", vOutsideCorners[i].first[0], vOutsideCorners[i].first[1]); - fclose(printFile); - } - else if ( bNearInterface ) - { - // Quadrilateral -> Triangle - if ( vInsideCorners.size() == 1 ) // case 1 - { - // do nothing, since re-sorting not necessary...??? - - const char* filename = "File_newTirangle."; - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* printFile = fopen(name.c_str(), "a"); - fprintf(printFile, "------------------------------------------------------\n\n new triangle: \n"); - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(printFile," vCornerCoords: %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1]); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(printFile,"OriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(printFile,"m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - for ( size_t i = 0; i < vInsideCorners.size(); ++i ) - fprintf(printFile," vInsideCorners: %e, %e \n", vInsideCorners[i].first[0], vInsideCorners[i].first[1]); - for ( size_t i = 0; i < vNearIntCorners.size(); ++i ) - fprintf(printFile," vNearIntCorners: %e, %e \n", vNearIntCorners[i].first[0], vNearIntCorners[i].first[1]); - for ( size_t i = 0; i < vOutsideCorners.size(); ++i ) - fprintf(printFile," vOutsideCorners: %e, %e \n", vOutsideCorners[i].first[0], vOutsideCorners[i].first[1]); - fclose(printFile); - } - - } -//////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////// - - const char* filename = "output."; - std::string name(filename); - char ext[50]; - if ( dim == 2 ) - sprintf(ext, "2d.txt"); - if ( dim == 3 ) - sprintf(ext, "3d.txt"); - name.append(ext); - FILE* outputFile = fopen(name.c_str(), "a"); - - fprintf(outputFile,"\n_________________________ begin 'CollectIBCorners2d' ________________________\n"); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); - - fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); - - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - - - fprintf(outputFile,"\n_________________________ end 'CollectIBCorners2d()' ______________________________\n\n"); - - fclose(outputFile); - - -} // end if ( bOutputToFile ) - - if ( bOutput ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_2d()' ______________________________\n\n"); - + return m_vCornerCoords.size(); } @@ -1170,7 +625,7 @@ CollectCorners_FlatTop_Prism3(GridObject* elem) // get element Vertex* vrtRoot = vVertex[i]; - if ( ! is_FTVertex(vrtRoot, i) ) + if ( ! is_onInterfaceVertex(vrtRoot, i) ) { /////////////////////////////////////////////////////////////////// // 1) push_back into 'vInsideCorners' @@ -1195,10 +650,10 @@ CollectCorners_FlatTop_Prism3(GridObject* elem) // lies vrtRoot on a cutted edge? // case1: vrt1 = outsideParticle && vrt2 = insideParticle: - if ( vrtRoot == vrt1 && is_FTVertex(vrt2, vrtInd2) ) + if ( vrtRoot == vrt1 && is_onInterfaceVertex(vrt2, vrtInd2) ) {outsideCornerFound = get_intersection_point(intersectionPnt, vrt1, vrt2);} // case2: vrt2 = outsideParticle && vrt1 = insideParticle: - else if ( vrtRoot == vrt2 && is_FTVertex(vrt1, vrtInd1) ) + else if ( vrtRoot == vrt2 && is_onInterfaceVertex(vrt1, vrtInd1) ) {outsideCornerFound = get_intersection_point(intersectionPnt, vrt2, vrt1);} // NO nearInterface handling necessary, since this is Pyramid or Tetrahedron case! else if ( is_nearInterfaceVertex(vrt2, vrtInd2) || is_nearInterfaceVertex(vrt1, vrtInd1) ) @@ -1206,10 +661,12 @@ CollectCorners_FlatTop_Prism3(GridObject* elem) else continue; - // check for correct intersectionPnt - if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) - UG_THROW("in 'CollectIBCorners3d_Prism3()': Error in computation of 'intersectionPnt':\n " - " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + // check for correct inersectionPnt + const number threshold_max = -1e+6; + const number LSValue = get_LSvalue_byPosition(intersectionPnt); + if ( fabs(LSValue) > 1e-6 && LSValue != threshold_max ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interface = " << LSValue << "\n"); } // end edge-loop @@ -1244,20 +701,22 @@ CollectCorners_FlatTop_Prism3(GridObject* elem) m_vCornerCoords.push_back(vOutsideCorners[i]); // some checks: - if ( m_vInterfaceID.size() != 3 ) UG_THROW("wrong size for m_vInterfaceID! Should be 3 and is " << m_vInterfaceID.size() << "\n"); - if ( m_vOriginalCornerID.size()!= 6 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 6 and is " << m_vOriginalCornerID.size() << "\n"); - if ( vInsideCorners.size() != 3 ) UG_THROW("wrong size for vInsideCorners! Should be 3 and is " << vInsideCorners.size() << "\n"); - if ( vOutsideCorners.size() != 3 ) UG_THROW("wrong size for vOutsideCorners! Should be 3 and is " << vOutsideCorners.size() << "\n"); - if ( m_vCornerCoords.size()!= 6 ) UG_THROW("wrong size for m_vCornerCoords! Should be 6 and is " << m_vCornerCoords.size() << "\n"); + if ( m_vInterfaceID.size() != 3 ) + UG_THROW("wrong size for m_vInterfaceID! Should be 3 and is " + << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 6 ) + UG_THROW("wrong size for m_vOriginalCornerID! Should be 6 and is " + << m_vOriginalCornerID.size() << "\n"); + if ( vInsideCorners.size() != 3 ) + UG_THROW("wrong size for vInsideCorners! Should be 3 and is " + << vInsideCorners.size() << "\n"); + if ( vOutsideCorners.size() != 3 ) + UG_THROW("wrong size for vOutsideCorners! Should be 3 and is " + << vOutsideCorners.size() << "\n"); + if ( m_vCornerCoords.size()!= 6 ) + UG_THROW("wrong size for m_vCornerCoords! Should be 6 and is " + << m_vCornerCoords.size() << "\n"); - if ( output ) - { - UG_LOG("---------- vor SWITCH ---------- \n"); - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); - } // check 'vOutsideCorners'-array for CCW: // get normal to triangle, built by 'vOutsideCorners'-array: MathVector normal = vInsideCorners[0]; @@ -1288,63 +747,7 @@ CollectCorners_FlatTop_Prism3(GridObject* elem) if ( output ) UG_LOG("SWITCH vInsideCorneers\n"); } - if ( output ) - { - UG_LOG("---------- nach SWITCH ---------- \n"); - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); - } - -/* - for(size_t i = 0; i < 3; ++i) - UG_LOG("vOutsideCorners[i] = " << vOutsideCorners[i] << "\n"); - for(size_t i = 0; i < 3; ++i) - UG_LOG("vInsideCorners[i] = " << vInsideCorners[i] << "\n"); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - UG_LOG("m_vInterfaceID[i] = " << m_vInterfaceID[i] << "\n"); - for(size_t i = 0; i < 6; ++i) - UG_LOG("m_vCornerCoords[i] = " << m_vCornerCoords[i] << "\n"); -*/ - - if ( output ) - { - const char* filename = "output3d."; - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* outputFile = fopen(name.c_str(), "a"); - - - fprintf(outputFile,"\n_________________________ begin 'Prism3' ________________________\n"); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); - - fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); - - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - - - fprintf(outputFile,"\n_________________________ end 'Prism3' ______________________________\n\n"); - - fclose(outputFile); - //UG_THROW("first check: Prism3\n"); - } + return m_vCornerCoords.size(); } @@ -1363,6 +766,7 @@ CollectCorners_FlatTop_Prism4(GridObject* elem) bool output = false; if ( output ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_Prism4()' ______________________________\n\n"); +// prepare data m_vCornerCoords.clear(); m_vInterfaceID.clear(); m_vOriginalCornerID.clear(); @@ -1371,25 +775,25 @@ CollectCorners_FlatTop_Prism4(GridObject* elem) std::vector vVertex; CollectVertices(vVertex, *m_spMG, elem); - // collect all edges of the element - std::vector vEdges; +// collect all edges of the element + std::vector vEdges; CollectEdgesSorted(vEdges, *m_spMG, elem); - // collect outside indices: +// collect outside indices: std::vector outsideInd; for(size_t i = 0; i < vVertex.size(); ++i) - if ( is_FTVertex(vVertex[i], i) ) + if ( is_onInterfaceVertex(vVertex[i], i) ) outsideInd.push_back(i); - - if ( outsideInd.size() != 2 ) UG_THROW("Wrong number of outsideInd!\n"); - for(size_t i = 0; i < outsideInd.size(); ++i) - if ( output ) UG_LOG("outsideInd = " << outsideInd[i] << "\n"); - + +// some check + if ( outsideInd.size() != 2 ) + UG_THROW("Wrong number of outsideInd!\n"); + // loop vertices for(size_t i = 0; i < vVertex.size(); ++i) { Vertex* vrtRoot = vVertex[i]; - if ( ! is_FTVertex(vrtRoot, i) ) + if ( ! is_onInterfaceVertex(vrtRoot, i) ) { /////////////////////////////////////////////////////////////////// // 1) push_back 'insideCorner' into 'm_vCornerCoords' @@ -1413,7 +817,7 @@ CollectCorners_FlatTop_Prism4(GridObject* elem) // lies vrtRoot on a cutted edge? // case1: vrt1 = outsideParticle && vrt2 = insideParticle: - if ( vrtRoot == vrt1 && is_FTVertex(vrt2, vrtInd2) ) + if ( vrtRoot == vrt1 && is_onInterfaceVertex(vrt2, vrtInd2) ) { /////////////////////////////////////////////////////////////////// // 3) push_back 'intersectionPnt' into 'm_vCornerCoords' @@ -1427,7 +831,7 @@ CollectCorners_FlatTop_Prism4(GridObject* elem) else UG_THROW("No outsideInd found.\n"); } // case2: vrt1 = insideParticle && vrt2 = outsideParticle: - else if ( vrtRoot == vrt2 && is_FTVertex(vrt1, vrtInd1) ) + else if ( vrtRoot == vrt2 && is_onInterfaceVertex(vrt1, vrtInd1) ) { /////////////////////////////////////////////////////////////////// // 3) push_back 'intersectionPnt' into 'm_vCornerCoords' @@ -1443,11 +847,13 @@ CollectCorners_FlatTop_Prism4(GridObject* elem) else continue; - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) - UG_THROW("in 'CollectIBCorners3d_Prism2()': Error in computation of 'intersectionPnt':\n " - " intersectionPnt = " << intersectionPnt << "\n distance from interace = " - << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + // check for correct inersectionPnt + const number threshold_max = -1e+6; + const number LSValue = get_LSvalue_byPosition(intersectionPnt); + if ( fabs(LSValue) > 1e-6 && LSValue != threshold_max ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interface = " << LSValue << "\n"); + } // end edge-loop } // end inside-case } // end vertex-loop @@ -1459,22 +865,18 @@ CollectCorners_FlatTop_Prism4(GridObject* elem) // some checks: - if ( m_vInterfaceID.size() != 4 ) UG_THROW("wrong size for m_vInterfaceID! Should be 4 and is " << m_vInterfaceID.size() << "\n"); - if ( m_vOriginalCornerID.size()!= 6 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 6 and is " << m_vOriginalCornerID.size() << "\n"); - if ( m_vCornerCoords.size()!= 6 ) UG_THROW("wrong size for m_vCornerCoords! Should be 6 and is " << m_vCornerCoords.size() << "\n"); + if ( m_vInterfaceID.size() != 4 ) + UG_THROW("wrong size for m_vInterfaceID! Should be 4 and is " + << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 6 ) + UG_THROW("wrong size for m_vOriginalCornerID! Should be 6 and is " + << m_vOriginalCornerID.size() << "\n"); + if ( m_vCornerCoords.size()!= 6 ) + UG_THROW("wrong size for m_vCornerCoords! Should be 6 and is " + << m_vCornerCoords.size() << "\n"); /////////////////////////////////////////////////////////////////// // 4) check for CCW-property - - if ( output ) - { - UG_LOG("---------- vor SWITCH ---------- \n"); - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); - } - std::vector > vTriangleCorners1; std::vector > vTriangleCorners2; for(size_t i = 0; i < 3; ++i){ @@ -1511,65 +913,7 @@ CollectCorners_FlatTop_Prism4(GridObject* elem) if ( output ) UG_LOG("SWITCH vTriangleCorners2\n"); } - if ( output ) - { - UG_LOG("---------- nach SWITCH ---------- \n"); - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); - } - -/* - for(size_t i = 0; i < 3; ++i) - UG_LOG("vTriangleCorners1[i] = " << vTriangleCorners1[i] << "\n"); - for(size_t i = 0; i < 3; ++i) - UG_LOG("vTriangleCorners2[i] = " << vTriangleCorners2[i] << "\n"); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - UG_LOG("m_vInterfaceID[i] = " << m_vInterfaceID[i] << "\n"); - for(size_t i = 0; i < 6; ++i) - UG_LOG("m_vCornerCoords[i] = " << m_vCornerCoords[i] << "\n"); -*/ - - if ( output ) - { - UG_LOG("_________________________ end 'CollectCorners_FlatTop_Prism4()' ______________________________\n\n"); - - - const char* filename = "output3d."; - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* outputFile = fopen(name.c_str(), "a"); - - fprintf(outputFile,"\n_________________________ begin 'Prism4' ________________________\n"); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); - - fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); - - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - - - fprintf(outputFile,"\n_________________________ end 'Prism4' ______________________________\n\n"); - - fclose(outputFile); - //UG_THROW("first check: Prism2\n"); - } + return m_vCornerCoords.size(); } @@ -1616,7 +960,7 @@ CollectCorners_FlatTop_Pyramid(GridObject* elem) // get nearInterfaceData and directly write cornerCoords to data: if ( is_nearInterfaceVertex(vrtRoot, i) ) nearInterfaceData = std::make_pair(m_aaPos[vrtRoot], i); - else if ( ! is_FTVertex(vrtRoot, i) ) + else if ( ! is_onInterfaceVertex(vrtRoot, i) ) { /////////////////////////////////////////////////////////////////// // 1) push_back into 'vInsideCorners' @@ -1644,18 +988,21 @@ CollectCorners_FlatTop_Pyramid(GridObject* elem) if ( is_nearInterfaceVertex(vrt1,vrtInd1) || is_nearInterfaceVertex(vrt2,vrtInd2) ) continue; // case2: vrt1 = outsideParticle && vrt2 = insideParticle: - else if ( vrtRoot == vrt1 && is_FTVertex(vrt2, vrtInd2) ) + else if ( vrtRoot == vrt1 && is_onInterfaceVertex(vrt2, vrtInd2) ) {outsideCornerFound = get_intersection_point(intersectionPnt, vrt1, vrt2);} // case3: vrt2 = outsideParticle && vrt1 = insideParticle: - else if ( vrtRoot == vrt2 && is_FTVertex(vrt1, vrtInd1) ) + else if ( vrtRoot == vrt2 && is_onInterfaceVertex(vrt1, vrtInd1) ) {outsideCornerFound = get_intersection_point(intersectionPnt, vrt2, vrt1);} else continue; - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) - UG_THROW("in 'CollectIBCorners3d_Prism3()': Error in computation of 'intersectionPnt':\n " - " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); + // check for correct inersectionPnt + const number threshold_max = -1e+6; + const number LSValue = get_LSvalue_byPosition(intersectionPnt); + if ( fabs(LSValue) > 1e-6 && LSValue != threshold_max ) + UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " + " intersectionPnt = " << intersectionPnt << "\n distance from interface = " << LSValue << "\n"); + } // end edge-loop @@ -1674,8 +1021,12 @@ CollectCorners_FlatTop_Pyramid(GridObject* elem) } // end vertex-loop // some checks: - if ( vInsideCorners.size() != 2 ) UG_THROW("wrong size for vInsideCorners! Should be 2 and is " << vInsideCorners.size() << "\n"); - if ( vOutsideCorners.size() != 2 ) UG_THROW("wrong size for vOutsideCorners! Should be 2 and is " << vOutsideCorners.size() << "\n"); + if ( vInsideCorners.size() != 2 ) + UG_THROW("wrong size for vInsideCorners! Should be 2 and is " + << vInsideCorners.size() << "\n"); + if ( vOutsideCorners.size() != 2 ) + UG_THROW("wrong size for vOutsideCorners! Should be 2 and is " + << vOutsideCorners.size() << "\n"); for(size_t i = 0; i < vOutsideCorners.size(); ++i) vOutsideCorners[i].second = outsideInd; @@ -1690,55 +1041,15 @@ CollectCorners_FlatTop_Pyramid(GridObject* elem) m_vInterfaceID.push_back(4); // some checks: - if ( m_vInterfaceID.size() != 3 ) UG_THROW("wrong size for m_vInterfaceID! Should be 3 and is " << m_vInterfaceID.size() << "\n"); - if ( m_vOriginalCornerID.size()!= 5 ) UG_THROW("wrong size for m_vOriginalCornerID! Should be 5 and is " << m_vOriginalCornerID.size() << "\n"); - if ( m_vCornerCoords.size()!= 5 ) UG_THROW("wrong size for m_vCornerCoords! Should be 5 and is " << m_vCornerCoords.size() << "\n"); - -/* - for(size_t i = 0; i < 2; ++i) - UG_LOG("vOutsideCorners[i] = " << vOutsideCorners[i] << "\n"); - for(size_t i = 0; i < 2; ++i) - UG_LOG("vInsideCorners[i] = " << vInsideCorners[i] << "\n"); - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - UG_LOG("m_vOriginalCornerID[i] = " << m_vOriginalCornerID[i] << "\n"); - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - UG_LOG("m_vInterfaceID[i] = " << m_vInterfaceID[i] << "\n"); - for(size_t i = 0; i < 5; ++i) - UG_LOG("m_vCornerCoords[i] = " << m_vCornerCoords[i] << "\n"); -*/ - - const char* filename = "output3d_Prism."; - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* outputFile = fopen(name.c_str(), "a"); - - - fprintf(outputFile,"\n_________________________ begin 'Pyramid' ________________________\n"); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_aaPos[vVertex[i]][0] , m_aaPos[vVertex[i]][1], m_aaPos[vVertex[i]][2]); - - fprintf(outputFile,"\n****Nachher: m_vCornerCoords.size() %lu \n", m_vCornerCoords.size()); -/* - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", m_vCornerCoords[i][0], m_vCornerCoords[i][1], m_vCornerCoords[i][2]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vInterfaceID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vInterfaceID = %lu\n", m_vInterfaceID[i]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: m_vOriginalCornerID = %lu\n", m_vOriginalCornerID[i]); - -*/ - fprintf(outputFile,"\n_________________________ end 'Pyramid' ______________________________\n\n"); - - fclose(outputFile); - //UG_THROW("first check: Prism3\n"); + if ( m_vInterfaceID.size() != 3 ) + UG_THROW("wrong size for m_vInterfaceID! Should be 3 and is " + << m_vInterfaceID.size() << "\n"); + if ( m_vOriginalCornerID.size()!= 5 ) + UG_THROW("wrong size for m_vOriginalCornerID! Should be 5 and is " + << m_vOriginalCornerID.size() << "\n"); + if ( m_vCornerCoords.size()!= 5 ) + UG_THROW("wrong size for m_vCornerCoords! Should be 5 and is " + << m_vCornerCoords.size() << "\n"); return m_vCornerCoords.size(); @@ -1748,12 +1059,7 @@ template int InterfaceHandlerLocalBase:: CollectCorners_FlatTop_originalTet(GridObject* elem) { - if ( 0 ) UG_LOG("_________________________ begin 'CollectCorners_FlatTop_originalTet()' ______________________________\n\n"); - - ////////////////////////////////////////////// - // 1) fill vector with fluid corners: - ////////////////////////////////////////////// - +// prepare data m_vCornerCoords.clear(); m_vInterfaceID.clear(); m_vOriginalCornerID.clear(); @@ -1763,7 +1069,11 @@ CollectCorners_FlatTop_originalTet(GridObject* elem) CollectVertices(vVertex, *m_spMG, elem); for(size_t i = 0; i < vVertex.size(); ++i) - is_FTVertex(vVertex[i], i); + is_onInterfaceVertex(vVertex[i], i); + +///////////////////////////////////////////////////// +// 1) Start filling vector with cut element corners: +///////////////////////////////////////////////////// // loop vertices for(size_t i = 0; i < vVertex.size(); ++i) @@ -1771,10 +1081,10 @@ CollectCorners_FlatTop_originalTet(GridObject* elem) // get element Vertex* vrtRoot = vVertex[i]; - if ( ! is_FTVertex(vrtRoot, i) ) + if ( ! is_onInterfaceVertex(vrtRoot, i) ) { if ( is_nearInterfaceVertex(vrtRoot, i) ) - { UG_THROW("NearInterface BUT !is_FTVertex() => error!\n"); } + { UG_THROW("NearInterface BUT !is_onInterfaceVertex() => error!\n"); } else { m_vCornerCoords.push_back(m_aaPos[vrtRoot]); @@ -1792,8 +1102,6 @@ CollectCorners_FlatTop_originalTet(GridObject* elem) UG_THROW("in 'CollectCorners_FlatTop_originalTet()': outside fluid and NOT nearInterface case not possible!\n"); } - if ( 0 ) UG_LOG("_________________________ end 'CollectCorners_FlatTop_originalTet()' ______________________________\n\n"); - return m_vCornerCoords.size(); } @@ -1806,7 +1114,7 @@ get_cutMode(std::vector vVertex) size_t numNearInterface = 0; for(size_t i = 0; i < vVertex.size(); ++i) { - if ( is_FTVertex(vVertex[i], i) ) + if ( is_onInterfaceVertex(vVertex[i], i) ) { numOutside++; if ( is_nearInterfaceVertex(vVertex[i], i) ) @@ -1856,10 +1164,7 @@ template int InterfaceHandlerLocalBase:: CollectCorners_FlatTop_3d(GridObject* elem) { - ////////////////////////////////////////////// - // 1) fill vector with fluid corners: - ////////////////////////////////////////////// - +// prepare data m_vCornerCoords.clear(); m_vInterfaceID.clear(); m_vOriginalCornerID.clear(); @@ -1887,23 +1192,35 @@ CollectCorners_FlatTop_3d(GridObject* elem) template void InterfaceHandlerLocalBase:: -print_InterfaceDdata() +print_CutElementData() { - UG_LOG(" ------------ print_InterfaceIDdata -----------\n"); - - if ( m_roid == ROID_QUADRILATERAL ) - UG_LOG("ín add_jac_A_elem ---------ROID_QUADRILATERAL--------\n"); - if ( m_roid == ROID_TRIANGLE ) - UG_LOG("ín add_jac_A_elem ---------ROID_TRIANGLE--------\n"); - - for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) - UG_LOG("m_vCornerCoords = " << m_vCornerCoords[i] << "\n"); - for ( size_t i = 0; i < m_vOriginalCornerID.size(); ++i ) - UG_LOG("Original: id = " << m_vOriginalCornerID[i] << "\n"); - UG_LOG("\n"); - for ( size_t i = 0; i < m_vInterfaceID.size(); ++i ) - UG_LOG("Interface: id = " << m_vInterfaceID[i] << "\n"); - UG_LOG("\n"); + const char* filename = "CutElementData."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* printFile = fopen(name.c_str(), "a"); + + if ( dim == 3 ) + fprintf(printFile, "--------- New cut element --------\n\n"); + else if ( m_roid == ROID_QUADRILATERAL ) + fprintf(printFile, "--------- ROID_QUADRILATERAL --------\n\n"); + else if ( m_roid == ROID_TRIANGLE ) + fprintf(printFile, "------------ ROID_TRIANGLE ----------\n\n"); + + for ( size_t i = 0; i < m_vCornerCoords.size(); ++i ) + fprintf(printFile,"Cut element corner %lu: %e, %e \n", i, m_vCornerCoords[i][0], m_vCornerCoords[i][1]); + fprintf(printFile,"\n"); + + for(size_t i = 0; i < m_vOriginalCornerID.size(); ++i) + fprintf(printFile,"Original corner ID: %lu\n", m_vOriginalCornerID[i]); + fprintf(printFile,"\n"); + + for(size_t i = 0; i < m_vInterfaceID.size(); ++i) + fprintf(printFile,"Interface corner ID: %lu\n", m_vInterfaceID[i]); + fprintf(printFile,"\n"); + + + fclose(printFile); } diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/Info File b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/Info File index e69de29bb..87fab8493 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/Info File +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/Info File @@ -0,0 +1,8 @@ +/* Info File for 'InterfaceHandlerLocalParticle' class: */ + +In addition to the data provided by the base class, the 'InterfaceHandlerLocal' for the moving particle simulation needs to provide infomation on radial data: The discrete scheme for the angular momentum contains the cross product with the radial vector. + +==> Most important new class members: + +- std::vector > m_vRadialAtIP; +- std::vector > m_vRadialAtCo; \ No newline at end of file diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h index 19ba1ade0..1f76dff90 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle.h @@ -5,8 +5,8 @@ * Author: suze */ -#ifndef INTERFACE_HANDLER_FLAT_TOP_H_ -#define INTERFACE_HANDLER_FLAT_TOP_H_ +#ifndef INTERFACE_HANDLER_LOCAL_PARTICLE_H_ +#define INTERFACE_HANDLER_LOCAL_PARTICLE_H_ #include "lib_disc/spatial_disc/disc_util/geom_provider.h" #include "lib_grid/multi_grid.h" @@ -50,77 +50,106 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase position_accessor_type; - InterfaceHandlerLocalParticle(SmartPtr > cutElementHandler, + InterfaceHandlerLocalParticle(SmartPtr > cutElementHandler, number fluidDensity, number fluidKinVisc); virtual ~InterfaceHandlerLocalParticle() {} - ////////////////////////////////////////////////////////////////// - /// virtual base class methods which need to be implemented: - ////////////////////////////////////////////////////////////////// - // used for method 'CollectCorners_': - number get_LSvalue_byPosition(MathVector vrtPos) - { - // ToTo - // if ( m_prtIndex == -1 ) - // UG_THROW("'get_LSvalue_byPosition()': value of m_prtIndex not valid!\n"); - return m_spCutElementHandler->get_LSvalue_byPosition(vrtPos, m_prtIndex); - } - number get_LSvalue(Vertex* vrt, const int prtIndex) - { - UG_THROW("Attention in 'get_LSvalue(vrt, prtIndex)': check if second argument = prtIndex is valid!...prtIndex = " << prtIndex << "\n"); - return m_spCutElementHandler->get_LSvalue(vrt, prtIndex); - } + ////////////////////////////////////////////////////////////////////////// + /// virtual methods in 'IInterfaceHandlerLocal': need to be impl. here + ////////////////////////////////////////////////////////////////////////// + + // simple forwarding to the associated 'CutElementHandler' class: + + bool is_onInterfaceVertex(Vertex* vrt, size_t vrtIndex = 0) + { return m_spCutElementHandler->is_onInterfaceVertex(vrt, vrtIndex); } + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex = 0) + { return m_spCutElementHandler->is_OutsideVertex(vrt, vrtIndex); } + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex = 0) + { return m_spCutElementHandler->is_nearInterfaceVertex(vrt, vrtIndex); } + + + ////////////////////////////////////////////////////////////////////////// + /// virtual methods in 'InterfaceHandlerLocalBase': need to be impl. here + ////////////////////////////////////////////////////////////////////////// + + // forwarding to m_spCutElementHandler: + number get_LSvalue_byPosition(MathVector vrtPos) + { return m_spCutElementHandler->get_LSvalue_byPosition(vrtPos); } + + + // forwarding to m_spCutElementHandler: bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc) { + const int orientation = this->get_orientation(); + const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; - - if ( this->m_orientationInterface == 1 ) - return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, m_prtIndex); + + const int prtIndex = get_prtIndex(); + if ( prtIndex == -1 ) UG_THROW("'get_intersection_point()': value of prtIndex not valid!\n"); + + if ( orientation == 1 ) + return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, prtIndex); // inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' // to avoid error for alpha < 0: - else if ( this->m_orientationInterface == -1 ) + else if ( orientation == -1 ) { - if ( m_prtIndex == -1 ) UG_THROW("'get_intersection_point()': value of m_prtIndex not valid!\n"); - return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, m_prtIndex); + return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, prtIndex); } else - UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); + UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): orientationInterface not set!\n"); } + // forwarding to m_spCutElementHandler: bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc, std::vector& alphaOut) { + const int orientation = this->get_orientation(); + const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; - if ( this->m_orientationInterface == 1 ) - return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, m_prtIndex, alphaOut); + const int prtIndex = get_prtIndex(); + if ( prtIndex == -1 ) UG_THROW("'get_intersection_point()': value of prtIndex not valid!\n"); + + if ( orientation == 1 ) + return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, prtIndex, alphaOut); // inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' // to avoid error for alpha < 0: - else if ( this->m_orientationInterface == -1 ) + else if ( orientation == -1 ) { - if ( m_prtIndex == -1 ) UG_THROW("'get_intersection_point()': value of m_prtIndex not valid!\n"); - return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, m_prtIndex, alphaOut); + return m_spCutElementHandler->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, prtIndex, alphaOut); } else - UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); + UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): orientationInterface not set!\n"); } ////////////////////////////////////////////////////////// - /// original class methods + /// InterfaceHandlerLocalBase methods ////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + /// central method: update_elem(): + /// it is called during TFVGeom:update() and computes the new cornders + /// i.e. 'vCornerCoords' of the cut element. Based on that ALL local + /// TFVGeom-computations (compute ip's, normals, gradients, ...) follow + /// as for the standard case + bool update(GridObject* elem, const MathVector* vCornerCoords); + + /// re-implement the base class method, since the cut element data does not need to + // be recomputed => herein: call of 'get_element_modus() instead of 'compute_element_modus()' bool update_elem(GridObject* elem, const MathVector* vCornerCoords) { - set_prtIndex(elem); + compute_and_set_prtIndex(elem); return update(elem, vCornerCoords); } + // called by FV1FTGeom::update() to fill data 'm_vBF' with the faces on + // the interface void update_inner_boundary(const MathVector* vCornerCoords) { if ( this->StdFV_assembling() ) @@ -137,18 +166,25 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase compute the data 'm_vRadialAtIP' and 'm_vRadialAtCo' + // -> in case of a moving particle, the radial direction is needed + // for the computation of the stresses + // -> this data is used in local-to-global-mapper void update_inner_boundary_radial(const MathVector* vCornerCoords); + void update_inner_boundary_radial_StdFV(const MathVector* vCornerCoords); + + + // REMARK: _for2()-methods not finally tested!! void update_inner_boundary_radial_for2(); void update_inner_boundary_radial_for2_StdFV(); - void update_inner_boundary_radial_old(); - void update_inner_boundary_radial_StdFV(const MathVector* vCornerCoords); + ////////////////////////////////////////////////////////// /// original class methods + helper methods for 'update()' ////////////////////////////////////////////////////////// - /// collects all corners of the flat top element + /// collects all corners of the cut element int CollectCorners_FlatTop_3d(GridObject* elem); int get_cutMode(std::vector vVertex); int CollectCorners_FlatTop_Prism3(GridObject* elem); @@ -156,8 +192,9 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase > vQuadriCorners); + /// !!! not implemented new => taken from the base class: +/* + void ResortQuadrilateral_for2(std::vector > vQuadriCorners); int CollectCorners_StdFV_for2(GridObject* elem); int CollectCorners_FlatTop_2d_for2(GridObject* elem); @@ -165,35 +202,30 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBaseis_FTVertex(m_prtIndex, vrt);} - else return m_spCutElementHandler->is_FTVertex(vrt); } - bool is_FTVertex(Vertex* vrt, size_t vrtIndex) - { return is_FTVertex(vrt); } - - - bool is_FTVertex(int& prtIndex, Vertex* vrt) - { return m_spCutElementHandler->is_outsideFluid(prtIndex, vrt); } - - bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) - { if ( m_prtIndex == -1 ) return m_spCutElementHandler->is_FTVertex(m_prtIndex, vrt); - else return m_spCutElementHandler->is_OutsideVertex(vrt, vrtIndex); } + void compute_cut_element_data_for2(GridObject* elem); +*/ + /////////////////////////////////////////////////////////////// + /// forwarding to 'm_spCutElementHandler' + /////////////////////////////////////////////////////////////// - bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) - { return m_spCutElementHandler->is_nearInterfaceVertex(vrt, vrtIndex); } - bool is_nearInterfaceVertex(Vertex* vrt) - { return is_nearInterfaceVertex(vrt, 0); } + int get_prtIndex() { return m_spCutElementHandler->get_prtIndex(); } + int getPrtIndex(size_t dof) { return m_spCutElementHandler->get_prtIndex(dof); } + + void compute_and_set_prtIndex(GridObject* elem) + { m_spCutElementHandler->compute_and_set_prtIndex(elem); } + /////////////////////////////////////////////////////////////// + /// access to the particle velocities, stored in the + /// 'ParticleProvider' class + + MathVector get_transSol(size_t prtIndex, size_t timeSeriesInd) + { return m_spCutElementHandler->get_transSol(prtIndex, timeSeriesInd); } + MathVector get_rotSol(size_t prtIndex, size_t timeSeriesInd) + { return m_spCutElementHandler->get_rotSol(prtIndex, timeSeriesInd); } + + MathMatrix get_rotationMat(MathVector radialVector) + { return m_spCutElementHandler->get_rotationMat(radialVector); } /////////////////////////////////////////////////////////////// @@ -206,27 +238,17 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase > quadriCorners() const { return m_vQuadriCorners_for2; } - /// needed during 'CollectQuadrilateral_besideTri_for2()': + // switches the order of storage in 'm_vQuadriCorners_for2' and 'this->m_vQuadriOrigID' + // --> earlier needed during 'CollectQuadrilateral_besideTri_for2()' + // --> currently not needed anymore void switch_order(); - void set_prtIndex(GridObject* elem); /// called during 'ParticleMapper::modify_LocalData()': + // --> resizes the local data (jacobian and defect) due to + // the potentially increased number of corners of a cut element void resize_local_indices(LocalVector& locU); void resize_local_indices(LocalVector& locU, size_t numCo); - - SmartPtr > get_cutElementHandler() { return m_spCutElementHandler; } - - /// updates 'm_elemModus'; called by FV1FTGeom::update()!! - bool update(GridObject* elem, const MathVector* vCornerCoords); // = preprocess() of flat_top.h - - /// should be called by 'CutElementHandler::update()' directly => no call via this method! - ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation) - { return m_spCutElementHandler->compute_element_modus(elem, interfaceOrientation); } - - /// called by 'InterfaceHandlerLocalParticle::update()' - ElementModus get_element_modus(GridObject* elem) - { return m_spCutElementHandler->get_element_modus(elem); } /////////////////////////////////////////////////////////////// @@ -243,66 +265,42 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase > get_particles() { return m_spCutElementHandler->get_particles(); } + size_t num_particles() const { return m_spCutElementHandler->num_particles();} + number get_density(int prtIndex) { return m_spCutElementHandler->get_density(prtIndex); } number get_density_fluid() { return m_fluidDensity; } number get_kinVisc_fluid() { return m_fluidKinVisc; } MathVector get_center(int prtIndex){ return m_spCutElementHandler->get_center(prtIndex);} + SmartPtr > get_cutElementHandler() { return m_spCutElementHandler; } + /// access to single entry of 'm_vRadialAtIP' MathVector radial_at_ip(size_t i) { return m_vRadialAtIP[i]; } /// access to single entry of 'm_vRadialAtCo' MathVector radial_at_co(size_t i) { return m_vRadialAtCo[i]; } - SmartPtr > get_particles() { return m_spCutElementHandler->get_particles(); } - - size_t num_particles() const { return m_spCutElementHandler->num_particles();} - - std::vector& get_boundary_faces() { return this->m_vBF; } - - const LocalIndices& get_local_indices() const { return m_ind; } - int get_prtIndex() - { if ( m_prtIndex == -1 ) UG_THROW("InterfaceHandlerLocalParticle::apper::get_prtIndex(): prtIndex not set!(): prtIndex not set!\n"); - return m_prtIndex; - } - int getPrtIndex(size_t dof) - { - int prtIndex = m_spCutElementHandler->get_prtIndex(dof); - return prtIndex; - } + std::vector& get_boundary_faces() { return m_vBF; } + const LocalIndices& get_local_indices() const { return m_ind; } - /// used in mapper: + + /////////////////////////////////////////////////////////////// + /// used in local to global mapper: number get_rotJ_ind(size_t fct1, size_t dof1, size_t fct2, size_t dof2) { return m_rotJ_ind(fct1, dof1, fct2, dof2); } number get_rotJ_rot(size_t fct1, size_t dof1, size_t fct2, size_t dof2) { return m_rotJ_rot(fct1, dof1, fct2, dof2); } - number get_rotD(size_t fct, size_t dof) { return m_rotD(fct, dof); } - /////////////////////////////////////////////////////////////// - /// get solution values (used by 'immersedbnd_cond.h' - - MathVector get_transSol(size_t prtIndex, size_t timeSeriesInd) - { return m_spCutElementHandler->get_transSol(prtIndex, timeSeriesInd); } - MathVector get_rotSol(size_t prtIndex, size_t timeSeriesInd) - { return m_spCutElementHandler->get_rotSol(prtIndex, timeSeriesInd); } - - MathMatrix get_rotationMat(MathVector radialVector) - { return m_spCutElementHandler->get_rotationMat(radialVector); } - /////////////////////////////////////////////////////////////// /// data for Particle /////////////////////////////////////////////////////////////// std::vector m_vBF; // updated during FV1FTGeom::update_inner_boundary_faces() - - /// actual particle index: set during 'm_spCutElementHandler->compute_element_modus()'!!! - int m_prtIndex; - - std::map m_vPrtIndices; - + /// fuid parameter imported by Constructor() number m_fluidDensity; number m_fluidKinVisc; @@ -312,18 +310,22 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase > m_vRadialAtIP; // global position of scvf on interface std::vector > m_vRadialAtCo; // global position of scv on interface + std::vector > m_vQuadriCorners_for2; + /// flag for computation of 'm_vRadialAtIP' during call of 'update_inner_boundary_faces()' const bool m_bRadial_forMassEq_equals_Normal; // default = true @@ -332,9 +334,8 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase > m_vQuadriCorners_for2; - SmartPtr > m_spCutElementHandler; + SmartPtr > m_spCutElementHandler; }; @@ -343,4 +344,4 @@ class InterfaceHandlerLocalParticle : public InterfaceHandlerLocalBase InterfaceHandlerLocalParticle:: -InterfaceHandlerLocalParticle(SmartPtr > cutElementHandler, +InterfaceHandlerLocalParticle(SmartPtr > cutElementHandler, number fluidDensity, number fluidKinVisc) : InterfaceHandlerLocalBase(cutElementHandler), - m_prtIndex(-1), m_fluidDensity(fluidDensity), m_fluidKinVisc(fluidKinVisc), - m_numFct(0), m_numCo(0), + m_numFct(0), + m_numCo(0), m_bRadial_forMassEq_equals_Normal(true), m_bBndDataNeeded(false), -// m_spInterfaceProvider(interfaceProvider), m_spCutElementHandler(cutElementHandler) { - + m_vBF.clear(); m_vRadialAtIP.clear(); m_vRadialAtCo.clear(); } @@ -82,54 +72,6 @@ void InterfaceHandlerLocalParticle::resize_local_indices(LocalVector& return; } -template -void InterfaceHandlerLocalParticle:: -set_prtIndex(GridObject* elem) -{ - int isOutside = 0; - - // collect all vertices of the element - std::vector vVertex; - CollectVertices(vVertex, *this->m_spMG, elem); - - std::vector vPrtIndex(vVertex.size(), -1); - - m_vPrtIndices.clear(); - - int refIndex = -1; - for(size_t i = 0; i < vVertex.size(); ++i) - { - if ( is_FTVertex(vVertex[i]) ) - { - if ( !m_spCutElementHandler->is_outsideFluid(vPrtIndex[i], vVertex[i]) ) - UG_THROW("in InterfaceHandlerLocalParticle::get_vPrtIndex(): inconsisent boolian for vertex: " - "is_FTVertex = true, but is_outsideFLuid = false!\n"); - refIndex = vPrtIndex[i]; - m_vPrtIndices[vVertex[i]] = refIndex; - isOutside++; - } - } - - bool set_prtIndex = true; - if ( isOutside > 0 ) - { - for(size_t i = 0; i < vVertex.size(); ++i) - { - if ( vPrtIndex[i] != refIndex && vPrtIndex[i] != -1) - { - set_prtIndex = false; - UG_LOG("SPECIAL case: 1 element is cut by 2 DIFFERENT particles! EXIT...\n"); - } - } - - } - - - // set m_prtIndex to unique prtIndex found: - if ( set_prtIndex ) m_prtIndex = refIndex; - - -} template void InterfaceHandlerLocalParticle:: @@ -139,7 +81,7 @@ switch_order() for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) UG_LOG("buffer_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); -// A: switch 'buffer_vCornerCoords' +// A: switch order of 'm_vQuadriCorners_for2' std::vector > buffer_vCornerCoords; buffer_vCornerCoords.push_back(m_vQuadriCorners_for2[1]); buffer_vCornerCoords.push_back(m_vQuadriCorners_for2[0]); @@ -148,7 +90,7 @@ switch_order() m_vQuadriCorners_for2.push_back(buffer_vCornerCoords[0]); m_vQuadriCorners_for2.push_back(buffer_vCornerCoords[1]); -// B: switch 'buffer_vQuadriOrigID': +// B: switch order of 'm_vQuadriOrigID': std::vector buffer_vQuadriOrigID; buffer_vQuadriOrigID.push_back(this->m_vQuadriOrigID[1]); buffer_vQuadriOrigID.push_back(this->m_vQuadriOrigID[0]); @@ -163,80 +105,42 @@ switch_order() } -/* -template -void InterfaceHandlerLocalParticle:: -compute_flat_top_data_for2(GridObject* elem) -{ - - if ( dim == 2 ) { CollectCorners_FlatTop_2d_for2(elem); } - if ( dim == 3 ) - UG_THROW("compute_flat_top_data_for2() not implemented for dim = 3!\n"); - - // some checks: - if ( this->m_vCornerCoords.size() == 0 ) - UG_THROW("this->m_vCornerCoords.size() = " << this->m_vCornerCoords.size() << "not possible!\n"); - - if ( dim == 2 ) - if ( elem->reference_object_id() != ROID_TRIANGLE ) - UG_THROW("Discretisation only coded for triangular elements!\n"); - - if ( dim == 3 ) - if ( elem->reference_object_id() != ROID_TETRAHEDRON ) - UG_THROW("Discretisation only coded for tetrahedral elements!\n"); - - // output routines - if ( 0 ) - { - UG_LOG("_________________ compute_flat_top_data_for2()_________________\n"); - - for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) - UG_LOG("this->m_vCornerCoords = " << this->m_vCornerCoords[i] << "\n"); - for ( size_t i = 0; i < this->m_vOriginalCornerID.size(); ++i ) - UG_LOG("Original: id = " << this->m_vOriginalCornerID[i] << "\n"); - UG_LOG("\n"); - for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i ) - UG_LOG("Interface: id = " << this->m_vInterfaceID[i] << "\n"); - UG_LOG("\n"); - } - -} -*/ - -// see preprocess() of flat_top.h // called by geo.update()!! template bool InterfaceHandlerLocalParticle:: update(GridObject* elem, const MathVector* vCornerCoords) { bool do_update_local = false; -// reset data - m_vBF.clear(); - -// computing flat top modus - this->m_elemModus = this->get_element_modus(elem); // computed via 'compute_element_modus()' during 'update_marker()' + +// needs to be cleared, since it can contain faces from former assembling + m_vBF.clear(); + +// getting cut element modus +// REMARK: In base class, here: call of 'compute_element_modus()' +// instead of 'get_element_modus()'. + this->m_elemModus = this->get_element_modus(elem); // element modus was computed via + // 'compute_element_modus()' during 'update_interface_data()' switch(this->m_elemModus) { - case INSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); - if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); + case INSIDE_DOM: if ( dim == 2 ) this->set_element_data(elem, vCornerCoords, ROID_TRIANGLE); + if ( dim == 3 ) this->set_element_data(elem, vCornerCoords, ROID_TETRAHEDRON); break; // usual assembling case OUTSIDE_DOM: if ( this->StdFV_assembling() ){ - //compute_flat_top_data(elem); - this->set_flat_top_data(elem, vCornerCoords, ROID_UNKNOWN); // => enforce update_local() for next element! (necessary, because hereafter num_SCVF == 0!!) + this->set_element_data(elem, vCornerCoords, ROID_UNKNOWN); } else - this->set_flat_top_data(elem, vCornerCoords, ROID_UNKNOWN); // => enforce update_local() for next element! (necessary, because hereafter num_SCVF == 0!!) + this->set_element_data(elem, vCornerCoords, ROID_UNKNOWN); break; - case CUT_BY_INTERFACE: this->compute_flat_top_data(elem); + case CUT_BY_INTERFACE: this->compute_cut_element_data(elem); //if ( this->m_roid == ROID_PYRAMID )UG_THROW("PYRAMID\n"); do_update_local = true; - break; // flat top assembling + break; // cut element assembling /* case CUT_BY_2_INTERFACE: if ( this->StdFV_assembling() ) - this->compute_flat_top_data(elem); + this->compute_cut_element_data(elem); else - compute_flat_top_data_for2(elem); + compute_cut_element_data_for2(elem); do_update_local = true; break;*/ default: @@ -251,4 +155,4 @@ update(GridObject* elem, const MathVector* vCornerCoords) -#endif /* INTERFACE_HANDLER_FLAT_TOP_IMPL_H_ */ +#endif /* INTERFACE_HANDLER_LOCAL_PARTICLE_IMPL_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_tools.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_tools.h index 6f73187bd..0aeb51c59 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_tools.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_flat_top_cut/interface_handler_particle_tools.h @@ -5,20 +5,19 @@ * Author: suze */ -#ifndef INTERFACE_HANDLER_FLAT_TOP_TOOLS_H_ -#define INTERFACE_HANDLER_FLAT_TOP_TOOLS_H_ +#ifndef INTERFACE_HANDLER_LOCAL_PARTICLE_TOOLS_H_ +#define INTERFACE_HANDLER_LOCAL_PARTICLE_TOOLS_H_ namespace ug{ -//////////////////////////////////////////////////////////////////////////////// -// FlatTopBase methods - ROID/CollectCorners... -//////////////////////////////////////////////////////////////////////////////// - template bool InterfaceHandlerLocalParticle:: is_boundary_face_for2(const size_t sideID) { +// REMARK: not finally tested! + UG_THROW("InterfaceHandlerLocalParticle::is_boundary_face_for2(): not finally tested!!!!\n"); + if ( dim == 3 ) UG_THROW("in 'is_boundary_face_for2()': only implemented for 2d!!\n"); @@ -50,12 +49,10 @@ is_boundary_face_for2(const size_t sideID) } - UG_LOG("prtIndex[0]: " << prtIndex[0] << "\n"); - UG_LOG("prtIndex[1]: " << prtIndex[1] << "\n"); - + if ( prtIndex[0] == prtIndex[1] ) - { UG_THROW("========= is_boundary_face = TRUE\n"); - + { + UG_THROW("========= is_boundary_face = TRUE\n"); return true; } UG_LOG("========= is_boundary_face = FALSE\n"); @@ -64,905 +61,26 @@ is_boundary_face_for2(const size_t sideID) } - -/* -// compare implementation of 'DimFV1Geometry::update_boundary_faces()' -template -void InterfaceHandlerLocalParticle:: -update_inner_boundary_faces() -{ - - ///////////////////////////////////////////////////////////////////////////// - // get general data - ///////////////////////////////////////////////////////////////////////////// - const DimReferenceElement& rRefElem - = ReferenceElementProvider::get(this->m_roid); - - DimReferenceMapping& rMapping = ReferenceMappingProvider::get(this->m_roid); - rMapping.update(this->m_vCornerCoords); - - const LocalShapeFunctionSet& TrialSpace = - LocalFiniteElementProvider::get(this->m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); - - ///////////////////////////////////////////////////////////////////////////// - // compute local and global geom object midpoints for each dimension - ///////////////////////////////////////////////////////////////////////////// - - MathVector vvLocMid[dim+1][maxMid]; - MathVector vvGloMid[dim+1][maxMid]; - - // set corners of element as local centers of nodes - for(size_t i = 0; i < rRefElem.num(0); ++i) - vvLocMid[0][i] = rRefElem.corner(i); - - // compute local midpoints - interfaceComputeMidPoints, maxMid>(rRefElem, vvLocMid[0], vvLocMid); - - // remember global position of nodes - for(size_t i = 0; i < rRefElem.num(0); ++i) - vvGloMid[0][i] = this->m_vCornerCoords[i]; - // compute local midpoints - interfaceComputeMidPoints, maxMid>(rRefElem, vvGloMid[0], vvGloMid); - - ///////////////////////////////////////////////////////////////////////////// - // collect boudary faces - ///////////////////////////////////////////////////////////////////////////// - - // get number of sides of element - size_t numSides = 0; - numSides = rRefElem.num(dim-1); - - // current number of bf - size_t curr_bf = 0; - - m_vBF.clear(); - // loop sides of element - for(size_t side = 0; side < numSides; ++side) - { - // side is no boundary face => continue - if ( !is_boundary_face(side) ) - continue; - - // number of corners of side (special case bottom side pyramid) - const int coOfSide = (this->m_roid != ROID_PYRAMID || side != 0) - ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; - - // resize vector - m_vBF.resize(curr_bf + coOfSide); - - // loop corners - for(int co = 0; co < coOfSide; ++co) - { - // get current bf - interfaceBF& bf = m_vBF[curr_bf]; - - // set node id == scv this bf belongs to - if (this->m_roid != ROID_PYRAMID || side != 0) - bf.nodeId = rRefElem.id(dim-1, side, 0, co); - else - { - // map according to order defined in ComputeBFMidID - bf.nodeId = rRefElem.id(dim-1, side, 0, (co % 3) + (co>3 ? 1 : 0)); - } - - // Compute MidID for BF - interfaceComputeBFMidID(rRefElem, side, bf.vMidID, co); - - // copy corners of bf - interfaceCopyCornerByMidID(bf.vLocPos, bf.vMidID, vvLocMid, interfaceBF::numCo); - interfaceCopyCornerByMidID(bf.vGloPos, bf.vMidID, vvGloMid, interfaceBF::numCo); - - // integration point - AveragePositions(bf.localIP, bf.vLocPos, interfaceBF::numCo); - AveragePositions(bf.globalIP, bf.vGloPos, interfaceBF::numCo); - - // normal on scvf - traits::NormalOnSCVF(bf.Normal, bf.vGloPos, vvGloMid[0]); - - // compute volume - bf.Vol = VecTwoNorm(bf.Normal); - - // compute shapes and grads - bf.numSH = TrialSpace.num_sh(); - TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); - TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); - - // get reference mapping - rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); - bf.detj = rMapping.sqrt_gram_det(bf.localIP); - - // compute global gradients - for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) - MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); - - // increase curr_bf - ++curr_bf; - - } // end loop of corners of side - - } // end loop sides of element - - -} -*/ - - - - - -/* -template -int InterfaceHandlerLocalParticle:: -CollectCorners_StdFV_for2(GridObject* elem) -{ - - ////////////////////////////////////////////// - // 1) fill vector with fluid corners: - ////////////////////////////////////////////// - - this->m_vCornerCoords.clear(); - this->m_vInterfaceID.clear(); - this->m_vOriginalCornerID.clear(); - -// buffer vectors for (cornerCoords, cornerIndex) - std::vector, size_t > > vOutsideCorners; - std::vector, size_t > > vInsideCorners; - std::vector, size_t > > vNearIntCorners; - -// collect all vertices of the element - std::vector vVertex; - CollectVertices(vVertex, *this->m_spMG, elem); - - // get prtIndex: - bool isOutsideVertex = false; - for(size_t i = 0; i < vVertex.size(); ++i) - { - // remember boolian for check, weather there existe at least one vertex, which is FT! - if ( is_OutsideVertex(vVertex[i]) || is_FTVertex(vVertex[i]) ) - { - isOutsideVertex = true; - break; - } - } - - if ( !isOutsideVertex ) - UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); - -// loop vertices - for(size_t i = 0; i < vVertex.size(); ++i) - { - // get element - Vertex* vrtRoot = vVertex[i]; - int prtIndex; - - ////////////////////////////////////////////// - // case 1: - // vertex insideFluid => Position und index puschen - if ( !is_FTVertex(vrtRoot, i) ) - - //if ( !is_OutsideVertex(vrtRoot) && !is_FTVertex(vVertex[i])) - { - if ( is_nearInterfaceVertex(vrtRoot) ) - { - UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); - } - else - { - this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); - this->m_vOriginalCornerID.push_back(i); - - vInsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); - } - - } - else - { - this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); - this->m_vOriginalCornerID.push_back(i); - this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); // attention: push AFTER 'this->m_vCornerCoords.push_back()'!! - - vOutsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); - - } - - } - - // skip whole element, since only FT points are included - if ( dim == 2 && this->m_vCornerCoords.size() != 3 ) - UG_THROW("in 'CollectCorners_StdFV()': this->m_vCornerCoords.size() " - "= " << this->m_vCornerCoords.size() << "not possible!\n"); - if ( dim == 3 && this->m_vCornerCoords.size() != 4 ) - UG_THROW("in 'CollectCorners_StdFV()': this->m_vCornerCoords.size() " - "= " << this->m_vCornerCoords.size() << "not possible!\n"); - -//////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////// - - const char* filename; - filename = "output_StdFV."; - - std::string name(filename); - char ext[50]; sprintf(ext, "txt"); - name.append(ext); - FILE* outputFile = fopen(name.c_str(), "a"); - - fprintf(outputFile,"\n_________________________ begin 'CollectIBCorners_StdFV' ________________________\n"); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", this->m_aaPos[vVertex[i]][0] , this->m_aaPos[vVertex[i]][1], this->m_aaPos[vVertex[i]][2]); - - fprintf(outputFile,"\n****Nachher: this->m_vCornerCoords.size() %lu \n", this->m_vCornerCoords.size()); - - for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) - fprintf(outputFile,"%e, %e, %e \n", this->m_vCornerCoords[i][0], this->m_vCornerCoords[i][1], this->m_vCornerCoords[i][2]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < this->m_vInterfaceID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: this->m_vInterfaceID = %lu\n", this->m_vInterfaceID[i]); - - fprintf(outputFile,"\n"); - - for(size_t i = 0; i < this->m_vOriginalCornerID.size(); ++i) - fprintf(outputFile,"Check in CollectIBCorner: this->m_vOriginalCornerID = %lu\n", this->m_vOriginalCornerID[i]); - - - fprintf(outputFile,"\n_________________________ end 'CollectIBCorners_StdFV()' ______________________________\n\n"); - - fclose(outputFile); - - - - return this->m_vCornerCoords.size(); - -} - - -template -void InterfaceHandlerLocalParticle:: -ResortQuadrilateral_for2(std::vector > vQuadriCorners) -{ - - UG_LOG("start ResortQuadrilateral_for2()...\n"); - - ///////////////////////////////////////////////////////////////////////////////////////////////////////// - // Check for CCW - // VecDot(vNormOut1,zDir) < 0 => corners of quadrilateral are not CCW: - ///////////////////////////////////////////////////////////////////////////////////////////////////////// - MathVector<3> vNormOut1, vNormOut2; - std::vector > vCornerCoordsBlow; vCornerCoordsBlow.resize(4); - for ( size_t i = 0; i < vQuadriCorners.size(); ++i ) - { - for ( size_t d = 0; d < dim; ++d ) - vCornerCoordsBlow[i][d] = vQuadriCorners[i][d]; - if ( dim == 2 ) vCornerCoordsBlow[i][2] = 0.0; - } - CalculateTriangleNormalNoNormalize(vNormOut1, vCornerCoordsBlow[0], vCornerCoordsBlow[1], vCornerCoordsBlow[2]); - CalculateTriangleNormalNoNormalize(vNormOut2, vCornerCoordsBlow[2], vCornerCoordsBlow[3], vCornerCoordsBlow[0]); - - UG_LOG("vNormOut1: " << vNormOut1 << "\n"); - UG_LOG("vNormOut2: " << vNormOut2 << "\n"); - - if ( VecDot(vNormOut1, vNormOut2) < 0 ) UG_THROW("----> check 1 failed after second check!\n"); - - - MathVector<3> normalDir; - for ( size_t i = 0; i < 2; ++i ) - normalDir[i] = 0.0; - normalDir[2] = 1.0; - - if ( VecDot(vNormOut1, normalDir) < 0 && VecDot(vNormOut2, normalDir) > 0) - { - UG_THROW("case1: inconsistent orientation: VecDot(vNormOut1, normalDir): " << VecDot(vNormOut1, normalDir) << - ", VecDot(vNormOut2, normalDir): " << VecDot(vNormOut2, normalDir) <<"\n"); - } - else if ( VecDot(vNormOut1, normalDir) > 0 && VecDot(vNormOut2, normalDir) < 0) - { - UG_THROW("case1: inconsistent orientation: VecDot(vNormOut1, normalDir): " << VecDot(vNormOut1, normalDir) << - ", VecDot(vNormOut2, normalDir): " << VecDot(vNormOut2, normalDir) <<"\n"); - } - else - { - std::vector > vCornerCoordsBuffer; - vCornerCoordsBuffer.clear(); - m_vQuadriCorners_for2.clear(); - std::vector vQuadriIDBuffer; - vQuadriIDBuffer.clear(); - if ( vQuadriCorners.size() != 4 ) - UG_THROW("wrong size of vQuadriCorners: " << vQuadriCorners.size() << "\n"); - - // A: change orientation OR simply copy: - if ( VecDot(vNormOut1, normalDir) < 0 && VecDot(vNormOut2, normalDir) < 0) - { - for ( size_t i = 0; i < 4; ++i ) - { - vCornerCoordsBuffer.push_back(vQuadriCorners[3-i]); - vQuadriIDBuffer.push_back(this->m_vQuadriOrigID[3-i]); - } - } - else - { - for ( size_t i = 0; i < 4; ++i ) - { - vCornerCoordsBuffer.push_back(vQuadriCorners[i]); - vQuadriIDBuffer.push_back(this->m_vQuadriOrigID[i]); - } - } - // B: re-order, s.t. 1.,2. node with prtIndex = 0; 3.,4. node with prtIndex = 1: - this->m_vQuadriOrigID.clear(); - for ( size_t i = 0; i < 3; ++i ) - { - m_vQuadriCorners_for2.push_back(vCornerCoordsBuffer[i+1]); - this->m_vQuadriOrigID.push_back(vQuadriIDBuffer[i+1]); - } - m_vQuadriCorners_for2.push_back(vCornerCoordsBuffer[0]); - this->m_vQuadriOrigID.push_back(vQuadriIDBuffer[0]); - - } - - -} - -template -int InterfaceHandlerLocalParticle:: -CollectTriangle_and_Quadri_for2(GridObject* elem, Vertex* vrtInside) -{ - UG_LOG("start CollectTriangle_and_Quadri_for2()...\n"); - -// collect all vertices of the element - std::vector vVertex; - CollectVertices(vVertex, *this->m_spMG, elem); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - UG_LOG("pos[" << i << "]: " << this->m_aaPos[vVertex[i]] << "\n"); - -// collect all edges of the element - std::vector vEdges; - CollectEdgesSorted(vEdges, *this->m_spMG, elem); - - for(size_t i = 0; i < vVertex.size(); ++i) - { - Vertex* vrtRoot = vVertex[i]; - - if ( !is_FTVertex(vrtRoot) ) - { - if ( vrtRoot != vrtInside ) - UG_THROW("in 'CollectTriangle_and_Quadri_for2()': error in collecting inside vertex\n"); - this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); - this->m_vOriginalCornerID.push_back(i); - this->m_vNOInterfaceID.push_back(i); - } - else - { - - // compute intersection point of edge, build by vrtRoot and vrtInside: - MathVector intersectionPnt; - get_intersection_point(intersectionPnt, vrtInside, vrtRoot); - - UG_LOG("posRoot: " << this->m_aaPos[vrtRoot] << "posInside: " << this->m_aaPos[vrtInside] << "\n"); - UG_LOG("intersectionPnt: " << intersectionPnt << "\n"); - - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) - UG_THROW("in 'CollectTriangle_and_Quadri_for2()': Error in computation of 'intersectionPnt':\n " - " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); - - this->m_vCornerCoords.push_back(intersectionPnt); - this->m_vOriginalCornerID.push_back(i); - this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); - m_vQuadriCorners_for2.push_back(intersectionPnt); - this->m_vQuadriOrigID.push_back(i); - - } - - } // end vrt-loop - - CollectQuadrilateral_besideTri_for2(elem); - -} - - - -template -int InterfaceHandlerLocalParticle:: -CollectQuadrilateral_besideTri_for2(GridObject* elem) -{ - UG_LOG("start CollectQuadrilateral_besideTri_for2()...\n"); - -// collect all vertices of the element - std::vector vVertex; - CollectVertices(vVertex, *this->m_spMG, elem); - -// collect all edges of the element - std::vector vEdges; - CollectEdgesSorted(vEdges, *this->m_spMG, elem); - - ////////////////////////////////////////////////////////////////////////////////////////// - // A: start with ordering 1 0 for the first corners in 'm_vQuardi_for2' - // => if ordering is 0 1 ---> switch - // B: add the two further corners in the order 0 1 - // => we end up with the setting 1 0 0 1 - // C: reorder as done in 'ResortQuadrilateral_for2(): - // => final order as it ought to be: 0 0 1 1 :-) - ////////////////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////////////////////// - // A: check for ordering, weather it is 0 1: - if ( m_vQuadriCorners_for2.size() != 2 ) - UG_THROW("worng start in 'CollectQuadrilateral_besideTri_for2'!\n"); - - size_t index_of_first_quadri_corner = this->m_vInterfaceID[0]; - Vertex* vrt = vVertex[index_of_first_quadri_corner]; - int prtIndex_of_first_quadri_corner; -// get prtIndex of first quadri corner: - if ( !is_FTVertex(prtIndex_of_first_quadri_corner, vrt) ) - UG_THROW("error in 'CollectQuadrilateral_besideTri_for2()'...\n"); - - UG_LOG("prtIndex_of_first_quadri_corner: " << prtIndex_of_first_quadri_corner << "\n"); - - if ( prtIndex_of_first_quadri_corner == 0 ) - this->switch_order(); - - UG_LOG("============= after A: CHECK order ===============\n"); - for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) - UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); - for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) - UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); - - ////////////////////////////////////////////////////////////////////////////////////////// - // B: add the two further corners in the order 0 1 - // => we end up with the setting 1 0 0 1 - - // loop edges and get edge, cut by both particles: - bool pushOrderSwitch = false; - for(size_t i = 0; i < vVertex.size(); ++i) - { - size_t j = i+1; - if ( j == vVertex.size() ) j = 0; - - Vertex* vrt1 = vVertex[i]; - Vertex* vrt2 = vVertex[j]; - int prtIndex1, prtIndex2; - - MathVector intersectionPnt1, intersectionPnt2; - - if ( !is_FTVertex(prtIndex1, vrt1) || !is_FTVertex(prtIndex2, vrt2) ) - continue; - - UG_LOG("this->m_aaPos[vrt1] = " << this->m_aaPos[vrt1] << "\n"); - UG_LOG("this->m_aaPos[vrt2] = " << this->m_aaPos[vrt2] << "\n"); - UG_LOG("prtIndex1 = " << prtIndex1 << ", prtIndex2 = " << prtIndex2 << "\n"); - - if ( prtIndex1 == prtIndex2 ) - UG_THROW("prtIndex1 == prtIndex2 NOT POSSIBLE on this element!\n"); - - /// intersectionPnt1 := intersection with prtIndex1 and vrt1 = inside circle of particle with prtIndex1 - get_intersection_point_for2(intersectionPnt1, vrt2, vrt1, prtIndex1); - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition_for2(intersectionPnt1, prtIndex1)) > 1e-6 ) - UG_THROW("in 'CollectQuadrilateral_besideTri_for2()': Error in computation of 'intersectionPnt1':\n " - " intersectionPnt1 = " << intersectionPnt1 << "\n distance from interace = " << fabs(get_LSvalue_byPosition_for2(intersectionPnt1, prtIndex1)) << "\n"); - - /// intersectionPnt2 := intersection with prtIndex2 and vrt2 = inside circle of particle with prtIndex2 - get_intersection_point_for2(intersectionPnt2, vrt1, vrt2, prtIndex2); - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition_for2(intersectionPnt2, prtIndex2)) > 1e-6 ) - UG_THROW("in 'CollectQuadrilateral_besideTri_for2()': Error in computation of 'intersectionPnt2':\n " - " intersectionPnt2 = " << intersectionPnt2 << "\n distance from interace = " << fabs(get_LSvalue_byPosition_for2(intersectionPnt2, prtIndex2)) << "\n"); - - UG_LOG("intersectionPnt1 = " << intersectionPnt1 << "\n"); - UG_LOG("intersectionPnt2 = " << intersectionPnt2 << "\n"); - - // FIRST: push intersectionpoint of particle 0, SECOND: push intersectionpoint of particle 1 - if ( prtIndex1 == 0 ) - { - m_vQuadriCorners_for2.push_back(intersectionPnt1); - m_vQuadriCorners_for2.push_back(intersectionPnt2); - - this->m_vQuadriOrigID.push_back(i); - this->m_vQuadriOrigID.push_back(j); - - } - else - { - m_vQuadriCorners_for2.push_back(intersectionPnt2); - m_vQuadriCorners_for2.push_back(intersectionPnt1); - - this->m_vQuadriOrigID.push_back(j); - this->m_vQuadriOrigID.push_back(i); - } - // => resulting order according to prtIndex: 1 0 0 1 :-) - - } // end edge-loop - - UG_LOG("============= after B: CHECK order ===============\n"); - for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) - UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); - for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) - UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); - - ////////////////////////////////////////////////////////////////////////////////////////// - // C: reorder as done in 'ResortQuadrilateral_for2(): - // => final order as it ought to be: 0 0 1 1 :-) - - ResortQuadrilateral_for2(m_vQuadriCorners_for2); - // => nach reordering: 0 0 1 1 ;-) - - - UG_LOG("============= after C: CHECK order ===============\n"); - for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) - UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); - for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) - UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); - - UG_LOG("end CollectQuadrilateral_besideTri_for2()...\n"); - -} - - -template -int InterfaceHandlerLocalParticle:: -CollectQuadrilateral_for2(GridObject* elem) -{ - UG_LOG("start CollectQuadrilateral_for2()...\n"); - -// buffer vectors for (cornerCoords, cornerIndex) - std::vector, size_t > > vQuadriCorners; - std::vector > buffer_vQuadriCorners; - -// collect all vertices of the element - std::vector vVertex; - CollectVertices(vVertex, *this->m_spMG, elem); - - for ( size_t i = 0; i < vVertex.size(); ++i ) - UG_LOG("pos[" << i << "]: " << this->m_aaPos[vVertex[i]] << "\n"); - -// collect all edges of the element - std::vector vEdges; - CollectEdgesSorted(vEdges, *this->m_spMG, elem); - - bool pushOrderSwitch = false; - for(size_t i = 0; i < vVertex.size(); ++i) - { - size_t j = i+1; - if ( j == vVertex.size() ) j = 0; - - - Vertex* vrt1 = vVertex[i]; - Vertex* vrt2 = vVertex[j]; - int prtIndex1, prtIndex2; - - MathVector intersectionPnt1, intersectionPnt2; - - if ( !is_FTVertex(prtIndex1, vrt1) ) - UG_THROW("wrong method! vrt1 = " << this->m_aaPos[vrt1] << " lies NOT outside!\n"); - if ( !is_FTVertex(prtIndex2, vrt2) ) - UG_THROW("wrong method! vrt2 = " << this->m_aaPos[vrt2] << " lies NOT outside!\n"); - - UG_LOG("this->m_aaPos[vrt1] = " << this->m_aaPos[vrt1] << "\n"); - UG_LOG("this->m_aaPos[vrt2] = " << this->m_aaPos[vrt2] << "\n"); - - UG_LOG("prtIndex1 = " << prtIndex1 << ", prtIndex2 = " << prtIndex2 << "\n"); - - // no intersection by interface for prtIndex1 == prtIndex2 - if ( prtIndex1 == prtIndex2 ) - { - UG_LOG("continue...\n"); - - continue; - } - /// intersectionPnt1 := intersection with prtIndex1 and vrt1 = inside circle of particle with prtIndex1 - get_intersection_point_for2(intersectionPnt1, vrt2, vrt1, prtIndex1); - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition_for2(intersectionPnt1, prtIndex1)) > 1e-6 ) - UG_THROW("in 'CollectQuadrilateral_for2()': Error in computation of 'intersectionPnt1':\n " - " intersectionPnt1 = " << intersectionPnt1 << "\n distance from interace = " << fabs(get_LSvalue_byPosition_for2(intersectionPnt1, prtIndex1)) << "\n"); - - /// intersectionPnt2 := intersection with prtIndex2 and vrt2 = inside circle of particle with prtIndex2 - get_intersection_point_for2(intersectionPnt2, vrt1, vrt2, prtIndex2); - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition_for2(intersectionPnt2, prtIndex2)) > 1e-6 ) - UG_THROW("in 'CollectQuadrilateral_for2()': Error in computation of 'intersectionPnt2':\n " - " intersectionPnt2 = " << intersectionPnt2 << "\n distance from interace = " << fabs(get_LSvalue_byPosition_for2(intersectionPnt2, prtIndex2)) << "\n"); - - UG_LOG("intersectionPnt1 = " << intersectionPnt1 << "\n"); - UG_LOG("intersectionPnt2 = " << intersectionPnt2 << "\n"); - - if ( !pushOrderSwitch ) - { - pushOrderSwitch = true; - // FIRST: push intersectionpoint of particle 1, SECOND: push intersectionpoint of particle 0 - if ( prtIndex1 == 1 ) - { - vQuadriCorners.push_back(std::make_pair(intersectionPnt1, prtIndex1)); - vQuadriCorners.push_back(std::make_pair(intersectionPnt2, prtIndex2)); - - this->m_vQuadriOrigID.push_back(i); - this->m_vQuadriOrigID.push_back(j); - } - else - { - vQuadriCorners.push_back(std::make_pair(intersectionPnt2, prtIndex2)); - vQuadriCorners.push_back(std::make_pair(intersectionPnt1, prtIndex1)); - - this->m_vQuadriOrigID.push_back(j); - this->m_vQuadriOrigID.push_back(i); - } - } - else - { - // FIRST: push intersectionpoint of particle 0, SECOND: push intersectionpoint of particle 1 - if ( prtIndex1 == 1 ) - { - vQuadriCorners.push_back(std::make_pair(intersectionPnt2, prtIndex2)); - vQuadriCorners.push_back(std::make_pair(intersectionPnt1, prtIndex1)); - - this->m_vQuadriOrigID.push_back(j); - this->m_vQuadriOrigID.push_back(i); - } - else - { - vQuadriCorners.push_back(std::make_pair(intersectionPnt1, prtIndex1)); - vQuadriCorners.push_back(std::make_pair(intersectionPnt2, prtIndex2)); - - this->m_vQuadriOrigID.push_back(i); - this->m_vQuadriOrigID.push_back(j); - } - } - - // => resulting order according to prtIndex: 0 1 1 0 :-) - - } // end edge-loop - - // copy data for call of 'ResortQuadrilateral_for2()': - buffer_vQuadriCorners.clear(); - for ( size_t i = 0; i < vQuadriCorners.size(); ++i ) - { - buffer_vQuadriCorners.push_back(vQuadriCorners[i].first); - UG_LOG("vQuadriCorners[" << i << "]: " << vQuadriCorners[i].first << ", index: " << vQuadriCorners[i].second << "\n"); - } - for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) - UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); - - ResortQuadrilateral_for2(buffer_vQuadriCorners); - - - UG_LOG("\n\n------------> NACH ordering:\n"); - for ( size_t i = 0; i < vQuadriCorners.size(); ++i ) - UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); - for ( size_t i = 0; i < this->m_vQuadriOrigID.size(); ++i ) - UG_LOG("this->m_vQuadriOrigID[" << i << "]: " << this->m_vQuadriOrigID[i] << "\n"); - - UG_LOG("end ResortQuadri...\n"); - -} - - -template -int InterfaceHandlerLocalParticle:: -CollectCorners_FlatTop_2d_for2(GridObject* elem) -{ - UG_LOG("start CollectCorners_FlatTop_2d_for2()...\n"); - - - m_vQuadriCorners_for2.clear(); - this->m_vQuadriOrigID.clear(); - this->m_vCornerCoords.clear(); - this->m_vInterfaceID.clear(); - this->m_vNOInterfaceID.clear(); - this->m_vOriginalCornerID.clear(); - - -// collect all vertices of the element - std::vector vVertex; - CollectVertices(vVertex, *this->m_spMG, elem); - - bool inside = false; - Vertex* vrtInside; - for(size_t i = 0; i < vVertex.size(); ++i) - { - if ( ! is_FTVertex(vVertex[i]) ) - { - inside = true; - vrtInside = vVertex[i]; - break; - } - } - - if ( inside ) - { - UG_LOG("vrtInside: " << this->m_aaPos[vrtInside] << "\n"); - this->m_roid = ROID_TRIANGLE; - CollectTriangle_and_Quadri_for2(elem, vrtInside); - } - else - { - this->m_roid = ROID_QUADRILATERAL; - CollectQuadrilateral_for2(elem); - ///////////////////////////////////////////////////////////////////////////// - // write data seperately, since 'CollectQuadrilateral_for2()' - // is also called during 'CollectTriangle_and_Quadri_for2()': - ///////////////////////////////////////////////////////////////////////////// - // A: copy corners into this->m_vCornerCoords: - for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) - this->m_vCornerCoords.push_back(m_vQuadriCorners_for2[i]); - - // B: set all corners to InterfaceIDs: - for ( size_t i = 0; i < 4; ++i ) - { - this->m_vInterfaceID.push_back(i); - this->m_vOriginalCornerID.push_back(this->m_vQuadriOrigID[i]); - } - } - - if ( inside ) - { - for ( size_t i = 0; i < this->m_vNOInterfaceID.size(); ++i ) - { - UG_LOG("this->m_vNOInterfaceID[" << i << "]: " << this->m_vNOInterfaceID[i] << "\n"); - } - UG_LOG("--------------------> m_vQuadriCorners_for2.size(): " << m_vQuadriCorners_for2.size() << "\n"); - for ( size_t i = 0; i < m_vQuadriCorners_for2.size(); ++i ) - { - UG_LOG("m_vQuadriCorners_for2[" << i << "]: " << m_vQuadriCorners_for2[i] << "\n"); - } - for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) - { - UG_LOG("this->m_vCornerCoords[" << i << "]: " << this->m_vCornerCoords[i] << "\n"); - } - if ( this->m_vCornerCoords.size() == 3 ) - UG_LOG("++++++++++++++++ end CollectCorners_FlatTop_2d_for2()...\n"); - } - - -} - -*/ - -template -void InterfaceHandlerLocalParticle:: -update_inner_boundary_radial_old() -{ -// VORSICHT: update_inner_boundary_radial() wird in fv1FT_geom_impl.h aufgerufen, BEVOR remap_BF() stattfindet! -// => bf.node_id() immer mit interfaceID, nicht OriginalCornerID! - - if (m_prtIndex == -1) - UG_THROW( - "InterfaceHandlerLocalParticle::update_inner_boundary_radial_old(): m_prtIndex not set!\n"); - const MathVector center = m_spCutElementHandler->get_center( - m_prtIndex); - -// reset data - m_vRadialAtCo.clear(); - m_vRadialAtCo.resize(this->numCo(), 0.0); - m_vRadialAtIP.clear(); - m_vRadialAtIP.resize(this->numCo(), 0.0); - -// Loop the boundary faces to assemble impulse equations - for (size_t i = 0; i < this->m_vBF.size(); ++i) { - interfaceBF bf = this->m_vBF[i]; - VecSubtract(m_vRadialAtCo[bf.node_id()], this->corner(bf.node_id()), - center); - - // original version for 'm_vRadialAtIP'-computation; - // - // VecSubtract(m_vRadialAtIP[bf.nodeId], bf.globalIP, center); - // - // BUT: after multiplication with normal of particle boundary (:= n = bf.normal) the - // integral '\int (w x r)*n dS' must be 0.0!! - // => r := m_vRadialAtIP != bf.normal - // => (wxr)*n = 0.0, since r = n - // - // Remark: m_massDefect = 0.0 INDEPENDENT of choice of r! - - if (1) //m_bRadial_forMassEq_equals_Normal ) // = default case! - { - VecScale(m_vRadialAtIP[bf.node_id()], bf.normal(), -1.0); - // UG_LOG("m_vRadialAtIP[" << bf.node_id() << "] = " << m_vRadialAtIP[bf.node_id()] << "\n"); - // UG_LOG("bf.normal() = " << bf.normal() << "\n"); - } else if (1) { - VecSubtract(m_vRadialAtIP[bf.node_id()], bf.global_ip(), center); - // VecNormalize(m_vRadialAtIP[bf.node_id()], m_vRadialAtIP[bf.node_id()]); - // VecScale(m_vRadialAtIP[bf.node_id()], m_vRadialAtIP[bf.node_id()], VecLength(bf.normal())); - // UG_LOG("bf.global_ip() " << bf.global_ip() << "\n"); - // UG_LOG("* m_vRadialAtIP[" << bf.node_id() << "] = " << m_vRadialAtIP[bf.node_id()] << "\n"); - } else { - typedef DimFV1FTGeometry > TFVGeom; - TFVGeom& geo = GeomProvider::get( - LFEID(LFEID::LAGRANGE, dim, 1), 1); - - int ip = (bf.node_id() - 1); - if (ip < 0) - ip = ip + 3; - - const typename TFVGeom::SCVF& scvf = geo.scvf(ip); - const MathVector& SCVFip_Pos = scvf.global_ip(); - VecSubtract(m_vRadialAtIP[ip], SCVFip_Pos, center); - VecNormalize(m_vRadialAtIP[ip], m_vRadialAtIP[ip]); - VecScale(m_vRadialAtIP[ip], m_vRadialAtIP[ip], - VecLength(bf.normal())); - - } - - } - - // UG_LOG("_____________\n"); - ////////////////////////////////////////////////////////////////////////////////////////// - // REMARK: - // bf.node_id() is still the node id of the flat top element, i.e. the value - // can potentially be 2 and 3! - // => rewriting m_vRadialAtIP/AtCo to the original node id necessary - // => for Quadrilaterals: 2 m_vRadialAtIP/AtCo-values, BUT only 1 original corner - // ---> averaging over both values and write this average to single corner - ////////////////////////////////////////////////////////////////////////////////////////// - - // 0. initialize buffer array - std::vector > vRadialAtCo; - std::vector > vRadialAtIP; - vRadialAtCo.clear(); - vRadialAtCo.resize(this->numCo(), 0.0); - vRadialAtIP.clear(); - vRadialAtIP.resize(this->numCo(), 0.0); - std::vector vCounter; - vCounter.clear(); - vCounter.resize(this->numCo(), 0); - - // ToDo for 3d? - -// 1. add and copy - for (size_t i = 0; i < this->interface_id_all().size(); ++i) { - size_t interfaceID = this->interface_id(i); - size_t originalID = this->corner_orig(interfaceID); - - vRadialAtCo[originalID] += m_vRadialAtCo[interfaceID]; - vRadialAtIP[originalID] += m_vRadialAtIP[interfaceID]; - - vCounter[originalID]++; - } -// 2. rescale and copy - /* for(size_t i = 0; i < this->interface_id_all().size(); ++i) - { - size_t interfaceID = this->interface_id(i); - size_t originalID = this->corner_orig(interfaceID); - if ( vCounter[originalID] > 1 ) - { - VecScale(m_vRadialAtCo[originalID], vRadialAtCo[originalID], 1.0/vCounter[originalID]); - VecScale(m_vRadialAtIP[originalID], vRadialAtIP[originalID], 1.0); // /vCounter[originalID]); - //UG_LOG("m_vRadialAtIP[" << originalID << "] = " << m_vRadialAtIP[originalID] << "\n"); - } - }*/ - // 2. rescale and copy - for (size_t i = 0; i < vRadialAtCo.size(); ++i) - if (vCounter[i] > 0) { - VecScale(m_vRadialAtCo[i], vRadialAtCo[i], 1.0 / vCounter[i]); - VecScale(m_vRadialAtIP[i], vRadialAtIP[i], 1.0 / vCounter[i]); - - } - -} - -// VORSICHT: update_inner_boundary_radial() wird in fv1FT_geom_impl.h aufgerufen, BEVOR remap_BF() stattfindet! -// => bf.node_id() immer mit interfaceID, nicht OriginalCornerID! template void InterfaceHandlerLocalParticle:: update_inner_boundary_radial(const MathVector* vCornerCoords) { +// some check if (dim == 2) { if (this->m_vBF.size() != 2 && this->m_vBF.size() != 0) - UG_THROW( - "oha, this->m_vBF.size() != 2:" << this->m_vBF.size() << "\n"); + UG_THROW("Error in 'update_inner_boundary_radial()': this->m_vBF.size() != 2:" + << this->m_vBF.size() << "\n"); } + const int prtIndex = get_prtIndex(); + if (prtIndex == -1) + UG_THROW("InterfaceHandlerLocalParticle::update_inner_boundary_radial(): prtIndex not set!\n"); - if (0) - UG_LOG("start update_inner_boundary_radial()...\n"); +// get data +// we choose the modusIP = 0 and useResized = true +// --> see implemenation and cases below const int modusIP = 0; const bool useResized = true; - - if (m_prtIndex == -1) - UG_THROW( - "InterfaceHandlerLocalParticle::update_inner_boundary_radial(): m_prtIndex not set!\n"); - - const MathVector center = m_spCutElementHandler->get_center(m_prtIndex); + const MathVector center = m_spCutElementHandler->get_center(prtIndex); // reset data m_vRadialAtCo.clear(); @@ -979,24 +97,10 @@ update_inner_boundary_radial(const MathVector* vCornerCoords) if (useResized) { VecSubtract(m_vRadialAtCo[i], this->corner(i), center); } else { UG_THROW("in 'update_inner_boundary_radial()': case not implemented anymore!\n");} -/* - { - size_t nodeID = this->corner_orig(i); - VecSubtract(m_vRadialAtCo[nodeID], vCornerCoords[nodeID], center); - // project in radial direction onto interface - VecNormalize(m_vRadialAtCo[nodeID], m_vRadialAtCo[nodeID]); - VecScale(m_vRadialAtCo[nodeID], m_vRadialAtCo[nodeID], radius); - } -*/ - if (0) { - UG_LOG("i = " << i << "\n"); - UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); - UG_LOG( - "---> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); - } + } - // B. set 'm_vRadialAtIP' --> for boundary faces! +// B. set 'm_vRadialAtIP' --> for boundary faces! for (size_t i = 0; i < this->m_vBF.size(); ++i) { interfaceBF bf = this->m_vBF[i]; @@ -1026,13 +130,6 @@ update_inner_boundary_radial(const MathVector* vCornerCoords) case 2: // AtIP == bf.normal() UG_THROW("in 'update_inner_boundary_radial()': case not implemented anymore!\n"); break; -/* - VecScale(m_vRadialAtIP[nodeID], bf.normal(), -1.0); - // rescale - VecNormalize(m_vRadialAtIP[nodeID], m_vRadialAtIP[nodeID]); - VecScale(m_vRadialAtIP[nodeID], m_vRadialAtIP[nodeID], radius); - break; - */ case 3: VecSubtract(m_vRadialAtIP[nodeID], SCVFip_Pos, center); // VecNormalize(m_vRadialAtIP[ip], m_vRadialAtIP[ip]); @@ -1043,25 +140,6 @@ update_inner_boundary_radial(const MathVector* vCornerCoords) "Error in IInterfaceMapper::update_inner_boundary_radial()!")); } - if (0) { - - UG_LOG("i = " << i << "\n"); - UG_LOG("bf.node_id() = " << bf.node_id() << "\n"); - UG_LOG( - "this->corner(" << nodeID << ") = " << this->corner(nodeID) << "\n"); - UG_LOG( - "vCornerCoords[" << nodeID << "] = " << vCornerCoords[nodeID] << "\n"); - UG_LOG( - "* m_vRadialAtCo[" << nodeID << "] = " << m_vRadialAtCo[nodeID] << "\n"); - UG_LOG( - "* m_vRadialAtIP[" << nodeID << "] = " << m_vRadialAtIP[nodeID] << "\n"); - //VecSubtract(m_vRadialAtIP[nodeID], bf.global_ip(), center); - UG_LOG( - "** m_vRadialAtIP[" << nodeID << "] = " << m_vRadialAtIP[nodeID] << "\n"); - - UG_LOG("end update_inner_boundary_radial()...\n"); - - } } } @@ -1070,11 +148,14 @@ template void InterfaceHandlerLocalParticle:: update_inner_boundary_radial_for2_StdFV() { - UG_LOG("\n start update_inner_boundary_radial_for2_StdFV()...\n"); +// REMARK: not finally tested! + UG_THROW("InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2_StdFV(): not finally tested!!!!\n"); - if (m_prtIndex == -1) - UG_THROW( - "InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2_StdFV(): m_prtIndex not set!\n"); + const int prtIndex = get_prtIndex(); + +// some check + if (prtIndex == -1) + UG_THROW("InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2_StdFV(): prtIndex not set!\n"); const MathVector center1 = m_spCutElementHandler->get_center(0); const MathVector center2 = m_spCutElementHandler->get_center(1); @@ -1111,9 +192,7 @@ update_inner_boundary_radial_for2_StdFV() for (size_t i = 0; i < this->numCo(); ++i) { const int prtIndex = getPrtIndex(i); - UG_LOG("prtIndex = " << prtIndex << "\n"); - - // set 'm_vRadialAtCo' + // set 'm_vRadialAtCo' if (prtIndex == 0) { VecSubtract(m_vRadialAtCo[i], this->corner(i), center1); RadialIPRef1 += this->corner(i); @@ -1132,23 +211,9 @@ update_inner_boundary_radial_for2_StdFV() "inconsistent in 'update_inner_boundary_radial_for2_StdFV()'!\n"); } - if (1) { - UG_LOG("i = " << i << "\n"); - - UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); - UG_LOG( - "---> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); - } } - UG_LOG( - "____________________________________________________________________________\n"); - UG_LOG( - "____________________________________________________________________________\n"); - UG_LOG("numOutCo1 = " << numOutCo1 << "\n"); - UG_LOG("numOutCo2 = " << numOutCo2 << "\n"); - - // set 'm_vRadialAtIP' +// set 'm_vRadialAtIP' VecScale(RadialIPRef1, RadialIPRef1, 1.0 / numOutCo1); VecScale(RadialIPRef2, RadialIPRef2, 1.0 / numOutCo2); UG_LOG("RadialIPRef1 = " << RadialIPRef1 << "\n"); @@ -1157,24 +222,15 @@ update_inner_boundary_radial_for2_StdFV() for (size_t i = 0; i < this->numCo(); ++i) { const int prtIndex = getPrtIndex(i); - UG_LOG("IP: prtIndex = " << prtIndex << "\n"); - if (prtIndex == 0) { VecSubtract(m_vRadialAtIP[i], RadialIPRef1, center1); - UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); - UG_LOG( - "---> m_vRadialAtIP[" << i << "] = " << m_vRadialAtIP[i] << "\n"); - } else if (prtIndex == 1) { + } + else if (prtIndex == 1) { VecSubtract(m_vRadialAtIP[i], RadialIPRef2, center2); - UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); - UG_LOG( - "---> m_vRadialAtIP[" << i << "] = " << m_vRadialAtIP[i] << "\n"); - } + } } - UG_LOG("END update_inner_boundary_radial_for2_StdFV()...\n\n"); - } // VORSICHT: update_inner_boundary_radial() wird in fv1FT_geom_impl.h aufgerufen, BEVOR remap_BF() stattfindet! @@ -1183,26 +239,28 @@ template void InterfaceHandlerLocalParticle:: update_inner_boundary_radial_for2() { - UG_LOG("start update_inner_boundary_radial_for2()...\n"); +// REMARK: not finally tested! + UG_THROW("InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2(): not finally tested!!!!\n"); // get data: std::vector > vCornerCoords; for (size_t i = 0; i < 4; ++i) vCornerCoords.push_back(this->m_vQuadriCorners_for2[i]); - for (size_t i = 0; i < 4; ++i) - UG_LOG("vCornerCoords[" << i << "] = " << vCornerCoords[i] << "\n"); - +// we choose the modusIP = 0 and useResized = true +// --> see implemenation and cases below const int modusIP = 1; const bool useResized = true; - if (m_prtIndex == -1) - UG_THROW( - "InterfaceHandlerLocalParticle::update_inner_boundary_radial(): m_prtIndex not set!\n"); + const int prtIndex = get_prtIndex(); + +// some Check + if (prtIndex == -1) + UG_THROW("InterfaceHandlerLocalParticle::update_inner_boundary_radial(): prtIndex not set!\n"); if (this->m_vBF.size() != 4) - UG_THROW( - "in 'update_inner_boundary_radial_for2()': this->m_vBF.size() should be 4, but is " << this->m_vBF.size() << "\n"); + UG_THROW("in 'update_inner_boundary_radial_for2()': this->m_vBF.size() should be 4, but is " + << this->m_vBF.size() << "\n"); const MathVector center1 = m_spCutElementHandler->get_center(0); const MathVector center2 = m_spCutElementHandler->get_center(1); @@ -1225,27 +283,18 @@ update_inner_boundary_radial_for2() // A. set 'm_vRadialAtCo' --> independent of boundary faces! // fill m_vRadialAtCO for center1: for (size_t i = 0; i < 2; ++i) { - UG_LOG( - "setting for center1 = " << center1 << " and corner[" << i << "]: " << vCornerCoords[i] << "\n"); - if (useResized) VecSubtract(m_vRadialAtCo[i], vCornerCoords[i], center1); else - UG_THROW( - "in 'update_inner_boundary_radial_for2()': not implemented in the for2-case!\n"); + UG_THROW("in 'update_inner_boundary_radial_for2()': not implemented in the for2-case!\n"); - UG_LOG("-> vCornerCoords[" << i << "] = " << vCornerCoords[i] << "\n"); - UG_LOG("-> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); - } + } // fill m_vRadial for center2: for (size_t i = 2; i < 4; ++i) { - UG_LOG( - "setting for center2 = " << center2 << " and corner[" << i << "]: " << vCornerCoords[i] << "\n"); - if (useResized) + if (useResized) VecSubtract(m_vRadialAtCo[i], vCornerCoords[i], center2); else - UG_THROW( - "in 'update_inner_boundary_radial_for2()': not implemented in the for2-case!\n"); + UG_THROW("in 'update_inner_boundary_radial_for2()': not implemented in the for2-case!\n"); UG_LOG("-> vCornerCoords[" << i << "] = " << vCornerCoords[i] << "\n"); UG_LOG("-> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); @@ -1259,8 +308,7 @@ update_inner_boundary_radial_for2() size_t nodeID = bf.node_id(); // ok, since bf.nodeID = 0,1,2,3 if (!useResized) - UG_THROW( - "in 'update_inner_boundary_radial_for2()': case '!useResized' not implemented!\n"); + UG_THROW("in 'update_inner_boundary_radial_for2()': case '!useResized' not implemented!\n"); int ip = (bf.node_id() - 1); if (ip < 0) @@ -1278,18 +326,6 @@ update_inner_boundary_radial_for2() "Error in InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2()!")); } - if (1) { - UG_LOG("i = " << i << "\n"); - UG_LOG("bf.node_id() = " << bf.node_id() << "\n"); - UG_LOG("bf.normal() = " << bf.normal() << "\n"); - UG_LOG("bf.global_ip()" << bf.global_ip() << "\n"); - UG_LOG( - "vCornerCoords[" << nodeID << "] = " << vCornerCoords[nodeID] << "\n"); - UG_LOG( - "* m_vRadialAtCo[" << nodeID << "] = " << m_vRadialAtCo[nodeID] << "\n"); - UG_LOG( - "** m_vRadialAtIP[" << nodeID << "] = " << m_vRadialAtIP[nodeID] << "\n"); - } } // fill m_vRadialAtCO for center2: @@ -1298,8 +334,7 @@ update_inner_boundary_radial_for2() size_t nodeID = bf.node_id(); // ok, since bf.nodeID = 0,1,2,3 if (!useResized) - UG_THROW( - "in 'update_inner_boundary_radial_for2()': case '!useResized' not implemented!\n"); + UG_THROW("in 'update_inner_boundary_radial_for2()': case '!useResized' not implemented!\n"); int ip = (bf.node_id() - 1); if (ip < 0) @@ -1317,41 +352,20 @@ update_inner_boundary_radial_for2() "Error in InterfaceHandlerLocalParticle::update_inner_boundary_radial_for2()!")); } - if (1) { - UG_LOG("i = " << i << "\n"); - UG_LOG("bf.node_id() = " << bf.node_id() << "\n"); - UG_LOG("bf.normal() = " << bf.normal() << "\n"); - UG_LOG("bf.global_ip()" << bf.global_ip() << "\n"); - UG_LOG( - "vCornerCoords[" << nodeID << "] = " << vCornerCoords[nodeID] << "\n"); - UG_LOG( - "* m_vRadialAtCo[" << nodeID << "] = " << m_vRadialAtCo[nodeID] << "\n"); - UG_LOG( - "** m_vRadialAtIP[" << nodeID << "] = " << m_vRadialAtIP[nodeID] << "\n"); - } - } - UG_LOG("end update_inner_boundary_radial()...\n"); - - for (size_t i = 0; i < 4; ++i) { - UG_LOG("i = " << i << "\n"); - UG_LOG("--> vCornerCoords[" << i << "] = " << vCornerCoords[i] << "\n"); - UG_LOG("--> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); - UG_LOG("--> m_vRadialAtIP[" << i << "] = " << m_vRadialAtIP[i] << "\n"); - } + } template void InterfaceHandlerLocalParticle:: update_inner_boundary_radial_StdFV(const MathVector* vCornerCoords) { + const int prtIndex = get_prtIndex(); - if (m_prtIndex == -1) - UG_THROW( - "InterfaceHandlerLocalParticle::update_inner_boundary_radial(): m_prtIndex not set!\n"); + if (prtIndex == -1) + UG_THROW("InterfaceHandlerLocalParticle::update_inner_boundary_radial(): prtIndex not set!\n"); - const MathVector center = m_spCutElementHandler->get_center( - m_prtIndex); + const MathVector center = m_spCutElementHandler->get_center(prtIndex); /* typedef DimFV1FTGeometry > TFVGeom; @@ -1383,13 +397,6 @@ update_inner_boundary_radial_StdFV(const MathVector* vCornerCoords) numOutCo++; } - if (0) { - UG_LOG("i = " << i << "\n"); - - UG_LOG("this->corner(" << i << ") = " << this->corner(i) << "\n"); - UG_LOG( - "---> m_vRadialAtCo[" << i << "] = " << m_vRadialAtCo[i] << "\n"); - } } // set 'm_vRadialAtIP' @@ -1397,12 +404,10 @@ update_inner_boundary_radial_StdFV(const MathVector* vCornerCoords) for (size_t i = 0; i < this->numCo(); ++i) VecSubtract(m_vRadialAtIP[i], RadialIPRef, center); - - } } // end namespace ug -#endif /* INTERFACE_HANDLER_FLAT_TOP_TOOLS_H_ */ +#endif /* INTERFACE_HANDLER_LOCAL_PARTICLE_TOOLS_H_ */ diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/Info File b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/Info File index d9bd5e37f..f080184fa 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/Info File +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/Info File @@ -1,4 +1,22 @@ /* Info File for 'InterfaceHandlerDiffusion' class: */ -ATTENTION: only tested for 2d case! \ No newline at end of file +ATTENTION: only implemented and tested for 2d case! + +For the simulation of elliptic problems with discontinuous coefficients, the domain on BOTH sides of the interface in part of the physical domain. Therefore, DOUBLE data needs to be provided locally for each cut element, for each cut part of either domain. + +=> All data structure, which stores local indices (like m_vInterfaceID, m_vRealCornerID) get the distinction via _tri, _quad (for 2d case only!). + +=> For the assembling within the local-to-global mapper, the usual local stiffnes matrix and defect can not be used. Specific data storage is provided by the 'InterfaceHandlerDiffusion' (see new members below). + + +==> Most important new members: + +- LocalMatrix m_locJ_tri; +- LocalMatrix m_locJ_quad; +- LocalVector m_locD_tri; +- LocalVector m_locD_quad; +- LocalVector m_locU_tri; +- LocalVector m_locU_quad; + +---> Local assembling data which gets forwarded to the local-to-global mapper. \ No newline at end of file diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h index b74d74d92..813ad5b5d 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion.h @@ -1,5 +1,5 @@ /* - * interface_handler_local.h + * interface_handler_diffusion.h * * Created on: 15.01.2015 * Author: suze @@ -49,293 +49,313 @@ class InterfaceHandlerLocalDiffusion : public InterfaceHandlerLocalBase > interfaceProvider, - SmartPtr > cutElementHandler); + SmartPtr > cutElementHandler); + virtual ~InterfaceHandlerLocalDiffusion() {} - - - ////////////////////////////////////////////////////////// - /// getter methods - ////////////////////////////////////////////////////////// - - - /// access to single entry of 'm_vRealCornerOfigID' (in loc to glob for diffusion) - const size_t real_index(size_t i) const { return m_vRealCornerID[i]; } - const size_t real_index_size(size_t i, const size_t size) const - { if ( size == 3 ) return m_vRealCornerID_tri[i]; - if ( size == 4 ) return m_vRealCornerID_quad[i]; - UG_THROW("in 'real_index_size()': wrong size (should be 3 or 4!): " << size << "n"); - } - const size_t real_index_tri(size_t i) const { return m_vRealCornerID_tri[i]; } - const size_t real_index_quad(size_t i) const { return m_vRealCornerID_quad[i]; } - - size_t get_index_for_global_index_Nitsche(const size_t i); - size_t get_global_index_Nitsche(const size_t i) { return m_verticesGlobalIndex[i]; } - const size_t get_num_NitscheDoFs() { return m_MapInserted_Nitsche.size(); } - - void set_Nitsche(bool bNitsche){ m_bNitsche = bNitsche;} - bool get_Nitsche(){ return m_bNitsche;} - - number get_LSvalue_byPosition(MathVector vrtPos){}; - number get_LSvalue(Vertex* vrt, const int prtIndex){}; - - // ToDo: needed method? - // used for method 'InterfaceHandlerLocal::get_intersection_point()': - bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc) - { - const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; - const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; - - if ( this->m_orientationInterface == 1 ) - return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, 0); - // inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' - // to avoid error for alpha < 0: - else if ( this->m_orientationInterface == -1 ) - return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, 0); - else - UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); - } - - bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc, std::vector& alphaOut) - { - const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; - const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; - - if ( this->m_orientationInterface == 1 ) - return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, 0, alphaOut); - // inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' - // to avoid error for alpha < 0: - else if ( this->m_orientationInterface == -1 ) - return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, 0, alphaOut); - else - UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); - } - - /////////////////////////////////////////////////////////////// - /// base class methods: adjusted! - /////////////////////////////////////////////////////////////// - - int CollectCorners_FlatTop_2d(GridObject* elem); - void Collect_Data_Nitsche(GridObject* elem); - - /// updates all std::vectors-data and especially derives 'm_roid' - void compute_flat_top_data(GridObject* elem); - - /////////////////////////////////////////////////////////////// - /// new methods - /////////////////////////////////////////////////////////////// - - // calls base class method, BUT: also clears m_vBF! --> m_vBF NOT a member of base class! - bool update_elem(GridObject* elem, const MathVector* vCornerCoords); - - /// called by 'InterfaceHandlerLocalParticle::update()' - ElementModus compute_element_modus(GridObject* elem, const int interfaceOrientation) - { return m_spCutElementHandler->compute_element_modus(elem, interfaceOrientation); } - - /// called by 'InterfaceHandlerLocalParticle::update()' - ElementModus get_element_modus(GridObject* elem) - { return m_spCutElementHandler->get_element_modus(elem); } + ////////////////////////////////////////////////////////////////// + /// virtual methods in 'IInterfaceHandlerLocal' + ////////////////////////////////////////////////////////////////// + + // simple forwarding to the associated 'CutElementHandler' class: - bool is_FTVertex(Vertex* vrt, size_t vrtIndex) - { return m_spCutElementHandler->is_FTVertex(vrt, vrtIndex);} + bool is_onInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { return m_spCutElementHandler->is_onInterfaceVertex(vrt, vrtIndex);} + + bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) + { return m_spCutElementHandler->is_OutsideVertex(vrt, vrtIndex);} + + bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) + { return m_spCutElementHandler->is_nearInterfaceVertex(vrt, vrtIndex);} + + bool is_nearInterface(Vertex* vrt) + { return m_spCutElementHandler->is_nearInterface(vrt);} + + ////////////////////////////////////////////////////////////////// + /// virtual methods of 'InterfaceHandlerLocalBase' + ////////////////////////////////////////////////////////////////// + + // forwarding to m_spCutElementHandler: + number get_LSvalue_byPosition(MathVector vrtPos) + { return m_spCutElementHandler->get_LSvalue_byPosition(vrtPos); } + + bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, + Vertex* vrtInsideCirc); + bool get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, + Vertex* vrtInsideCirc, std::vector& alphaOut); - bool is_OutsideVertex(Vertex* vrt, size_t vrtIndex) - { return m_spCutElementHandler->is_OutsideVertex(vrt, vrtIndex);} + + /// recomputes the 'vCornerCoords' of the cut element and derives 'm_roid' + void compute_cut_element_data(GridObject* elem); - bool is_nearInterfaceVertex(Vertex* vrt, size_t vrtIndex) - { return m_spCutElementHandler->is_nearInterfaceVertex(vrt, vrtIndex);} + void compute_and_set_prtIndex(GridObject* elem) + { m_spCutElementHandler->compute_and_set_prtIndex(elem); } + + /// central method called by 'compute_cut_element_data()' to compute 'vCornerCoords' + int CollectCorners_FlatTop_2d(GridObject* elem); + + /// helper method within 'CollectCorners_FlatTop_2d' to bring the newly computed + // 'vCornerCoords' in correct order (counter clockwise) + void Resort_RealCornerID(); + + void Collect_Data_Nitsche(GridObject* elem); + - bool is_nearInterface(Vertex* vrt) - { return m_spCutElementHandler->is_nearInterface(vrt);} + ////////////////////////////////////////////////////////////////////////////// + /// initialize interface boundary conditions via lua-call + ////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////// + void set_source_data_lua(const number interfaceSourceValue) + { m_interfaceSource = interfaceSourceValue; m_luaSource_isSet = true; } + void set_jump_data_lua(const number interfaceJumpValue) + { m_interfaceJump = interfaceJumpValue; m_luaJump_isSet = true; } + void set_jump_grad_data_lua(const MathVector<2>& interfaceJumpGradValue) + { m_interfaceJumpGrad[0] = interfaceJumpGradValue[0]; + m_interfaceJumpGrad[1] = interfaceJumpGradValue[1]; m_luaJumpGrad_isSet = true; } + void set_diffusion_coeff_data_lua(const MathVector<2>& diffusionCoeffs) + { m_diffusionCoeff[0] = diffusionCoeffs[0]; m_diffusionCoeff[1] = diffusionCoeffs[1]; + m_luaDiffusion_isSet = true; } - bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex) - { return m_spCutElementHandler->check_vertex_modus(vrtModus, vrtIndex);} - bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex, const int interfaceOrientation) - { return m_spCutElementHandler->check_vertex_modus(vrtModus, vrtIndex, interfaceOrientation);} + ////////////////////////////////////////////////////////// + /// getter methods + ////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////// + /// access to m_vBF (needed during 'FV1CutGeom::update_inner_boundary_faces()') + std::vector& get_boundary_faces() { return m_vBF; } + /// called during 'update()'-method of Fv1CutGeom + void clear_boundary_faces() { m_vBF.clear(); } + + const LocalIndices& get_local_indices() const { return m_ind; } - // used for diffusion - size_t get_or_insert_vertex(const MathVector& vrtPos); + MathVector get_center(int prtIndex){ return m_spCutElementHandler->get_center(prtIndex);} + + // methods for writing and getting GLOBAL data of interface nodes + size_t get_or_insert_vertex(const MathVector& vrtPos); size_t get_or_insert_vertex(Vertex* vrt); bool find_vrtPos(const MathVector& vrtPos); - // used for Nitsche + size_t get_index_for_global_index_Nitsche(const size_t i); + size_t get_global_index_Nitsche(const size_t i) { return m_verticesGlobalIndex[i]; } + const size_t get_num_NitscheDoFs() { return m_MapInserted_Nitsche.size(); } + + // used for Nitsche + void set_Nitsche(bool bNitsche){ m_bNitsche = bNitsche;} + bool get_Nitsche(){ return m_bNitsche;} + // ---> used during 'diffusion_interface/diffusion_interface.h:initialize_interface_Nitsche()': size_t get_or_insert_indexPair_Nitsche(const size_t global_index); - void Resort_RealCornerID(); - - bool lies_onInterface_tri(const size_t newID); - bool lies_onInterface_quad(const size_t newID); - bool lies_onInterface_size(const size_t newID, size_t size); - - /// access to m_vBF (needed during 'FV1CutGeom::update_inner_boundary_faces()') - const interfaceBF* boundary_faces() const { return &m_vBF[0]; } - std::vector& get_boundary_faces() { return m_vBF; } - - const LocalIndices& get_local_indices() const { return m_ind; } - - void set_jac_bool(bool bJac) { m_jac_tag = bJac; } - bool get_jac_bool() { return m_jac_tag; } - - void set_bScaleDoFs(bool bScaleDoF) { m_scaleDoFs = bScaleDoF; } - bool get_bScaleDoFs() { return m_scaleDoFs; } - - const size_t get_numVerticesPos() const { return m_verticesPos.size(); } - const MathVector get_VerticesPos(size_t index) const { return m_verticesPos[index]; } - const double get_sol(size_t index) const { return m_verticesValue[index]; } - const double get_sol(size_t index, size_t fct) const { return m_verticesValue[index]; } - - void add_to_integral(const number value) { m_integral += value; } - void init_integral(){ m_integral = 0.0;} - number get_integral(){ return m_integral;} - - void print_Nitsche_Data(); - void print_InterfaceIDdata(); - - number vAlpha(size_t i, size_t j) { return m_vAlpha[i][j]; } - MathVector vIntersectionPnts(size_t i) { return m_vIntersectionPnts[i]; } - MathMatrix vShapeValues() { return m_vShapeValues; } - MathVector NormalToFace() { return m_NormalToFace; } - number Gamma() { return m_Gamma; } - number Area() { return m_Area; } - number AreaOrig() { return m_AreaOrig; } - number AreaScale() { return m_AreaScale; } - number IntegralGamma(size_t i) { return m_vIntegralGamma[i]; } - - ////////////////////////////////////////////////////////////////////////////// - /// methods called during 'convection_diffusion_fv1.cpp' -> 'geo.___()' : - ////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////// + /// methods called by the Elem Disc 'ConvectionDiffusionFV1_cutElem' + //////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////// + // (A) 'integral'-methods: for the computation of the l2-error within + // 'ConvectionDiffusionFV1_cutElem::add_l2error_A_elem()' + + void L2Error_add(const number value) { m_L2Error += value; } + void L2Error_init(){ m_L2Error = 0.0;} + number get_L2Error(){ return m_L2Error;} + + ///////////////////////////////////////////////////////////////////////////////////////////// + /// (B) further methods + void resize_local_data(LocalVector locU); - void set_DoF_tag_tri(const bool bFactor2_for_DoFIndex) - { m_shift_DoFIndex_tri = bFactor2_for_DoFIndex; return; } - void set_DoF_tag_quad(const bool bFactor2_for_DoFIndex) - { m_shift_DoFIndex_quad = bFactor2_for_DoFIndex; return; } + const bool get_boolian_for_diffusion(); - bool get_vertex_modus_tri(size_t dof, const int orientation) - { return m_spCutElementHandler->get_vertex_modus_orient(dof, 1); } - bool get_vertex_modus_quad(size_t dof, const int orientation) - { return m_spCutElementHandler->get_vertex_modus_orient(dof, -1); } - + void set_DoF_tag(const bool bFactor2_for_DoFIndex, const ReferenceObjectID roid) + { if ( roid == ROID_TRIANGLE ) {m_shift_DoFIndex_tri = bFactor2_for_DoFIndex; return;} + else if ( roid == ROID_QUADRILATERAL ) {m_shift_DoFIndex_quad = bFactor2_for_DoFIndex; return;} + else {UG_THROW("in InterfaceHandlerLocalDiffusion::set_DoF_tag_tri(): invalid roid!\n");} + } - void reset_defect_on_interface(LocalVector& locD, const size_t size); - void reset_jacobian_on_interface(LocalMatrix& locJ, const size_t size); + void set_bScaleDoFs(bool bScaleDoF) { m_scaleDoFs = bScaleDoF; } + bool get_bScaleDoFs() { return m_scaleDoFs; } - void set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, const int orientation); + const bool get_bNearInterface() const {return m_bNearInterface;} + void set_bNearInterface(bool bNearInterface) { m_bNearInterface = bNearInterface;} + + ///////////////////////////////////////////////////////////////////////////////////////////// + // (C) access methods for assemgling of the local defect and jacobian for + // the elem Disc 'ConvectionDiffusionFV1_cutElem': + // --> during call of 'add_jac_A_elem()' and 'add_def_A_elem()' + + void reset_defect_on_interface(LocalVector& locD, const size_t size); + void reset_jacobian_on_interface(LocalMatrix& locJ, const size_t size); + + void set_jacobian(const LocalMatrix locJ, const ReferenceObjectID roid) + { if ( roid == ROID_TRIANGLE ) m_locJ_tri = locJ; + else if ( roid == ROID_QUADRILATERAL ) m_locJ_quad = locJ; + else {UG_THROW("in InterfaceHandlerLocalDiffusion::set_jacobian(): invalid roid!\n");} + } + + void set_defect(const LocalVector locD, const ReferenceObjectID roid) + { if ( roid == ROID_TRIANGLE ) m_locD_tri = locD; + else if ( roid == ROID_QUADRILATERAL ) m_locD_quad = locD; + else {UG_THROW("in InterfaceHandlerLocalDiffusion::set_defect(): invalid roid!\n");} + } + + + const size_t get_numVerticesPos() const { return m_verticesPos.size(); } + const MathVector get_VerticesPos(size_t index) const { return m_verticesPos[index]; } + const double get_sol(size_t index) const { return m_verticesValue[index]; } + const double get_sol(size_t index, size_t fct) const { return m_verticesValue[index]; } + + // also called by class 'DiffusionInterfaceMapper' + LocalMatrix& get_local_jacobian(const ReferenceObjectID roid) + { if ( roid == ROID_TRIANGLE ) return m_locJ_tri; + else if ( roid == ROID_QUADRILATERAL ) return m_locJ_quad; + else {UG_THROW("in InterfaceHandlerLocalDiffusion::get_local_jacobian(): invalid roid!\n");} + } + + LocalVector& get_local_defect(const ReferenceObjectID roid) + { if ( roid == ROID_TRIANGLE ) return m_locD_tri; + else if ( roid == ROID_QUADRILATERAL ) return m_locD_quad; + else {UG_THROW("in InterfaceHandlerLocalDiffusion::get_local_defect(): invalid roid!\n");} + } + + LocalVector& get_local_solution(const ReferenceObjectID roid) + { if ( roid == ROID_TRIANGLE ) return m_locU_tri; + else if ( roid == ROID_QUADRILATERAL ) return m_locU_quad; + else {UG_THROW("in InterfaceHandlerLocalDiffusion::get_local_solution(): invalid roid!\n");} + } + + + ///////////////////////////////////////////////////////////////////////////////////////////// + // (D) access methods for local assembling of the boundary conditions on the + // immersed interface into the defect and jacobian for the elem Disc + // 'ConvectionDiffusionFV1_cutElem' + // --> during call of 'add_jac_A_elem()' and 'add_def_A_elem()' // diffusion can only be set as values, with constant diff coefficient at each side of the interface. // no _impl() methods provided for analytic lua-functions number get_diffusion(); number get_diffusion(const bool bElementIsOutside); - // interface data (source, jump, jump_grad) can be defined as values or lua functions - LocalVector set_jump_values(LocalIndices ind, const size_t size); - LocalVector set_jump_grad_values(LocalIndices ind, const size_t size); - LocalVector set_source(const std::vector sourceIm, LocalIndices ind, const size_t size, const bool bElementIsCut); - // 'set_source' instance used for navier stokes elem disc - LocalVector set_source(LocalIndices ind, const size_t size, const bool bElementIsCut) - {LocalVector dummy; return dummy;} - - - void set_jacobian_tri(const LocalMatrix locJ) { m_locJ_tri = locJ; } - void set_jacobian_quad(const LocalMatrix locJ){ m_locJ_quad = locJ; } - - void set_defect_tri(const LocalVector locD) { m_locD_tri = locD; } - void set_defect_quad(const LocalVector locD){ m_locD_quad = locD; } - - LocalVector& get_local_solution_tri() { return m_locU_tri; } - LocalVector& get_local_solution_quad() { return m_locU_quad; } - - // also called in mapper - LocalMatrix& get_local_jacobian_tri() { return m_locJ_tri; } - LocalMatrix& get_local_jacobian_quad() { return m_locJ_quad; } + double get_jump(const MathVector position); + double get_jump_impl(const MathVector position); + + double get_jump_grad(const MathVector position); + double get_jump_grad_impl(const MathVector position); + + double get_source(const MathVector position); + double get_source_impl(const MathVector position); - LocalVector& get_local_defect_tri() { return m_locD_tri; } - LocalVector& get_local_defect_quad() { return m_locD_quad; } + // setter methods (called by ConvectionDiffusionFV1_cutElem::get_local_data() ) + void set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, + const int orientation); - const bool get_bNearInterface() const {return m_bNearInterface;} - void set_bNearInterface(bool bNearInterface) { m_bNearInterface = bNearInterface;} + void set_jump_values (LocalVector& jumpOut, LocalIndices ind, const size_t size); + void set_jump_grad_values(LocalVector& jumpGradOut, LocalIndices ind, const size_t size); + void set_source(const std::vector sourceIm, LocalVector& sourceOut, LocalIndices ind, + const size_t size, const bool bElementIsCut); - const bool get_boolian_for_diffusion(); + bool lies_onInterface_tri(const size_t newID); + bool lies_onInterface_quad(const size_t newID); + bool lies_onInterface_size(const size_t newID, size_t size); + ////////////////////////////////////////////////////////////////////////////// - /// methods called during mapper + /// methods called by class 'DiffusionInterfaceMapper' ////////////////////////////////////////////////////////////////////////////// const size_t get_index_shift_tri() const { return m_shift_DoFIndex_tri; } const size_t get_index_shift_quad() const { return m_shift_DoFIndex_quad; } + + // LOCAL access to 'VertexModus' via 'm_vvVertexMode' data in 'CutElementHandler' class + bool check_vertex_modus(VertexModus vrtModus, size_t vrtIndex, const int interfaceOrientation) + { return m_spCutElementHandler->check_vertex_modus(vrtModus, vrtIndex, interfaceOrientation);} - ////////////////////////////////////////////////////////////////////////////// - /// methods called ONLY in '_impl.cpp': + // writes solution of the interface nodes (i.e. of the new DoFs) from + // the global vector 'vec' into this->m_verticesValue-array: + void set_interface_values(const std::vector verticesValues); + + ////////////////////////////////////////////////////////////////////////////// + /// access to entries of the GLOBAL index of interface nodes 'm_vRealCornerID' + ////////////////////////////////////////////////////////////////////////////// + + // get the 'real index': + // case1: node lies on interface => returns the entry location within + // 'InterfaceHandlerDiffusion::m_MapNearVertices' + // case2: node lies on an original mesh node: => returns the usual, + // local index of vertex + + /// called by own class 'InterfaceHandlerLocalDiffusion' + const size_t real_index(size_t i) const { return m_vRealCornerID[i]; } + const size_t real_index_size(size_t i, const size_t size) const + { if ( size == 3 ) return m_vRealCornerID_tri[i]; + else if ( size == 4 ) return m_vRealCornerID_quad[i]; + else UG_THROW("in 'real_index_size()': wrong size (should be 3 or 4!): " << size << "n"); + } + + // called by class 'DiffusionInterfaceMapper': + const size_t real_index_tri(size_t i) const { return m_vRealCornerID_tri[i]; } + const size_t real_index_quad(size_t i) const { return m_vRealCornerID_quad[i]; } - void set_source_lua(const number interfaceSourceValue) { m_interfaceSource = interfaceSourceValue; } - void set_jump_lua(const number interfaceJumpValue) { m_interfaceJump = interfaceJumpValue; } - void set_jump_grad_lua(const MathVector<2>& interfaceJumpGradValue) - { m_interfaceJumpGrad[0] = interfaceJumpGradValue[0]; m_interfaceJumpGrad[1] = interfaceJumpGradValue[1];} - void set_diffusion_coeff_lua(const MathVector<2>& diffusionCoeffs) - { m_diffusionCoeff[0] = diffusionCoeffs[0]; m_diffusionCoeff[1] = diffusionCoeffs[1];} - - bool check_interface_data(const bool bBndFct); - - double get_jump(const MathVector position); - double get_jump_impl(const MathVector position); - - - double get_jump_grad(const MathVector position); - double get_jump_grad_impl(const MathVector position); - - double get_source(const MathVector position); - double get_source_impl(const MathVector position); - - // writes solution of global vector vec into this->m_verticesValue-array: - void write_solution(const std::vector verticesValues); - - MathVector get_center(int prtIndex){ return m_spCutElementHandler->get_center(prtIndex);} + ////////////////////////////////////////////////////////// + /// output + ////////////////////////////////////////////////////////// + + void print_Nitsche_Data(); + void print_CutElementData(); + + ////////////////////////////////////////////////////////// + /// acces methods for Nitsche + ////////////////////////////////////////////////////////// + + number vAlpha(size_t i, size_t j) { return m_vAlpha[i][j]; } + MathVector vIntersectionPnts(size_t i) { return m_vIntersectionPnts[i]; } + MathMatrix vShapeValues() { return m_vShapeValues; } + MathVector NormalToFace() { return m_NormalToFace; } + number Gamma() { return m_Gamma; } + number Area() { return m_Area; } + number AreaOrig() { return m_AreaOrig; } + number AreaScale() { return m_AreaScale; } + number IntegralGamma(size_t i) { return m_vIntegralGamma[i]; } + ////////////////////////////////////////////////////////////////////////////// - /// members: + /// class member ////////////////////////////////////////////////////////////////////////////// - std::vector m_vBF; // updated during FV1CutGeom::update_inner_boundary_faces() - - std::map, size_t> m_MapInserted; + // m_vBF stores the boundary faces of the immersed boundary; + // --> updated during FV1CutGeom::update_inner_boundary_faces() + std::vector m_vBF; + // storage of new vertices at the immersed interface + std::map, size_t> m_MapInserted; // std::vector > m_verticesPos; std::vector m_verticesValue; - // the REalCornerID can also be an index > 3 and > 4, since it is then the index - // of the InterfaceVertex; see 'm_verticesPos' and 'm_verticesValue' + // RealCornerID: for access do solution via DoFRef + // 2 cases: (1) corner lies on interface or (2) corner lies on original grid node + // case1: contains the entry counter of the node within + // 'InterfaceHandlerDiffusion::m_MapNearVertices' (usually > 4) + // case2:contains the usual, 'local' index of vertex std::vector m_vRealCornerID; std::vector m_vRealCornerID_tri; std::vector m_vRealCornerID_quad; + // m_vInterfaceID_tri/_quad := LOCAL index of interface nodes (< 4) std::vector m_vInterfaceID_tri; std::vector m_vInterfaceID_quad; - bool m_scaleDoFs; - number m_integral; - bool m_jac_tag; - - - /// size of local algebra for flat top element: 'm_numFct' x 'm_numCo' + /// size of local algebra for cut element: 'm_numFct' x 'm_numCo' size_t m_numFct; - /// number of corners of flat top element + /// number of corners of cut element size_t m_numCo; - /// new local algebra for resized flat top element + /// new local algebra for resized cut element LocalIndices m_ind; - // local data for assembling: + // local data for assembling on element being cut into triangle and quadrilateral: LocalMatrix m_locJ_tri; LocalMatrix m_locJ_quad; LocalVector m_locD_tri; @@ -343,22 +363,40 @@ class InterfaceHandlerLocalDiffusion : public InterfaceHandlerLocalBase for call during 'add_local_def/jac_to_global_interface()': bool m_shift_DoFIndex_tri; bool m_shift_DoFIndex_quad; + + /////////////////////////////////////////////////////////////// + /// data for assembling interface boundary condition + + // boolians for boundary condition data: + // if true: constant values are given via lua-call + // if false: position-dependent values are given via inline-function + bool m_luaSource_isSet; + bool m_luaJump_isSet; + bool m_luaJumpGrad_isSet; + bool m_luaDiffusion_isSet; + + // if boolians above are true: constant values are given via lua-call and stored here + number m_interfaceSource; + number m_interfaceJump; + MathVector<2> m_interfaceJumpGrad; + MathVector<2> m_diffusionCoeff; - /////////////////////////////////////////////////////////////// - /// data for Nitsche -> 'Collect_Data_Nitsche()': - /////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////// + /// data for Nitsche -> 'Collect_Data_Nitsche()': bool m_bNitsche; std::map m_MapInserted_Nitsche; std::vector > m_vAlpha; std::vector > m_vIntersectionPnts; - MathMatrix m_vShapeValues; // dim+1 = number of vertices for simplicial mesh! + MathMatrix m_vShapeValues; // dim+1 = number of vertices for simplicial mesh! MathVector m_NormalToFace; number m_Gamma; MathVector m_insidePnt; @@ -367,23 +405,19 @@ class InterfaceHandlerLocalDiffusion : public InterfaceHandlerLocalBase m_vIntegralGamma; - // filled during 'moving_interface/interface_handler_local_base_tools.h: get_or_insert_indexPair_Nitsche()' - // AND get_or_insert_indexPair_Nitsche() called during 'diffusion_interface/diffusion_interface.h:initialize_interface_Nitsche()' - // and used for local-to-global mapper + // filled during 'immersed_interface/interface_handler_local_base_tools.h: get_or_insert_indexPair_Nitsche()' + // AND get_or_insert_indexPair_Nitsche() called during 'diffusion_interface/diffusion_interface.h:initialize_interface_Nitsche()' + // and used for local-to-global mapper std::vector m_verticesGlobalIndex; - - // boolians for boundary data - bool m_bBndFct; - number m_interfaceSource; - number m_interfaceJump; - MathVector<2> m_interfaceJumpGrad; - MathVector<2> m_diffusionCoeff; - + /////////////////////////////////////////////////////////////// + /// essential members for further acces - /// contains radius, center and density of all given particles + /// contains radius, center and orientation of all given particles SmartPtr > m_spInterfaceProvider; - SmartPtr > m_spCutElementHandler; + + /// computes and contains 'ElementModus', 'VertexModus' and handles access + SmartPtr > m_spCutElementHandler; }; diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_impl.h index 4fa9f8eee..b2caf409c 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_impl.h @@ -31,23 +31,95 @@ namespace ug{ template InterfaceHandlerLocalDiffusion:: InterfaceHandlerLocalDiffusion(SmartPtr > interfaceProvider, - SmartPtr > cutElementHandler) : + SmartPtr > cutElementHandler) : InterfaceHandlerLocalBase(cutElementHandler), - m_spInterfaceProvider(interfaceProvider), - m_spCutElementHandler(cutElementHandler), - m_bNitsche(false), m_numFct(0), m_numCo(0), + m_scaleDoFs(false), + m_L2Error(0.0), + m_bNearInterface(false), m_shift_DoFIndex_tri(false), m_shift_DoFIndex_quad(false), - m_interfaceSource(1100.13), - m_interfaceJump(1100.13), - m_interfaceJumpGrad(1100.13,1100.13), - m_diffusionCoeff(1100.13, 1100.13) + m_luaSource_isSet(false), + m_luaJump_isSet(false), + m_luaJumpGrad_isSet(false), + m_luaDiffusion_isSet(false), + m_interfaceSource(0.0), + m_interfaceJump(0.0), + m_interfaceJumpGrad(0.0, 0.0), + m_diffusionCoeff(0.0, 0.0), + m_bNitsche(false), + m_Gamma(0.0), + m_insidePnt(0.0), + m_Area(0.0), + m_AreaOrig(0.0), + m_AreaScale(0.0), + m_spInterfaceProvider(interfaceProvider), + m_spCutElementHandler(cutElementHandler) { + m_vBF.clear(); + m_MapInserted.clear(); m_verticesPos.clear(); + m_verticesValue.clear(); + m_vRealCornerID.clear(); + m_vRealCornerID_tri.clear(); + m_vRealCornerID_quad.clear(); + m_vInterfaceID_tri.clear(); + m_vInterfaceID_quad.clear(); + + m_MapInserted_Nitsche.clear(); + m_vAlpha.clear(); + m_vIntersectionPnts.clear(); + m_verticesGlobalIndex.clear(); } +////////////////////////////////////////////////////////////////// +/// virtual methods in 'InterfaceHandlerLocalBase' +////////////////////////////////////////////////////////////////// + +template +bool InterfaceHandlerLocalDiffusion:: +get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc) +{ + const int orientation = this->get_orientation(); + const int prtIndex = m_spCutElementHandler->get_prtIndex(); + if ( prtIndex == -1 ) UG_THROW("'get_intersection_point()': value of prtIndex not valid!\n"); + + const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; + const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; + + if ( orientation == 1 ) + return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, prtIndex); +// inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' +// to avoid error for alpha < 0: + else if ( orientation == -1 ) + return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, prtIndex); + else + UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); +} + +template +bool InterfaceHandlerLocalDiffusion:: +get_intersection_point(MathVector& Intersect, Vertex* vrtOutsideCirc, Vertex* vrtInsideCirc, std::vector& alphaOut) +{ + const int orientation = this->get_orientation(); + const int prtIndex = m_spCutElementHandler->get_prtIndex(); + + if ( prtIndex == -1 ) UG_THROW("'get_intersection_point()': value of prtIndex not valid!\n"); + + const MathVector& vrtPosOut = this->m_aaPos[vrtOutsideCirc]; + const MathVector& vrtPosIn = this->m_aaPos[vrtInsideCirc]; + + if ( orientation == 1 ) + return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosOut, vrtPosIn, prtIndex, alphaOut); +// inverse order of 'vrtPosOut' and 'vrtPosIn' for call of 'get_intersection_point()' +// to avoid error for alpha < 0: + else if ( orientation == -1 ) + return this->m_spInterfaceProvider->get_intersection_point(Intersect, vrtPosIn, vrtPosOut, prtIndex, alphaOut); + else + UG_THROW("in InterfaceHandlerLocalDiffusion::get_intersection_point(): m_orientationInterface not set!\n"); +} + /////////////////////////////////////////////////////////////// // new methods for Diffusion /////////////////////////////////////////////////////////////// @@ -81,7 +153,7 @@ resize_local_data(LocalVector locU) template void InterfaceHandlerLocalDiffusion:: -write_solution(const std::vector verticesValues) +set_interface_values(const std::vector verticesValues) { this->m_verticesValue.clear(); @@ -94,7 +166,7 @@ write_solution(const std::vector verticesValues) { UG_LOG("m_verticesValue.size(): " << this->m_verticesValue.size() << "\n"); UG_LOG("verticesValues.size(): " << verticesValues.size() << "\n"); - UG_THROW("in InterfaceHandlerLocalDiffusion::write_solution: wrong size of m_verticesValue!\n"); + UG_THROW("in InterfaceHandlerLocalDiffusion::set_interface_values: wrong size of m_verticesValue!\n"); } } @@ -169,66 +241,63 @@ get_boolian_for_diffusion() /////////////////////////////////////////////////////////////// /// hard coded boundary conditions /////////////////////////////////////////////////////////////// - - - template - inline double get_jump_value_ex5(const MathVector position, const MathVector center, const int orientation) - { +template +inline double get_jump_value_ex6(const MathVector position, const int orientation) +{ + if ( orientation == 1) return 0.0; - } - template - inline double get_jump_grad_value_ex3(const MathVector position, const MathVector center, const int orientation) - { + return exp(position[0])*cos(position[1]); +} + +template +inline double get_jump_grad_value_ex6(const MathVector position, const int orientation) +{ + if ( orientation == -1) return 0.0; - - if ( orientation == -1) - return 0.0; - - double absValue = position[0]*position[0] + position[1]* position[1]; - double sum = position[0] + position[1]; - - double returnValue = 8*(2*absValue - sum)*exp(-absValue); - - return returnValue; - } - template - inline double get_source_kappa(const MathVector position, const MathVector center, const int orientation) - { + double x = position[0]; + double y = position[1]; + + return 2.0*exp(x)*(y*sin(y)-x*cos(y)); +} + + +template +inline double get_source_kappa(const MathVector position, const MathVector center, const int orientation) +{ - if ( orientation == 1) - { - return 16.0*16.0; - } - else - { - if ( orientation != -1) - UG_THROW("wrong orientation!\n"); - - double dist_x = position[0] - center[0]; - double dist_y = position[1] - center[1]; - double dist = sqrt(dist_x*dist_x+dist_y*dist_y); - - return 200*16*dist*dist; + if ( orientation == 1) + return 16.0*16.0; + + if ( orientation != -1) + UG_THROW("wrong orientation!\n"); + + double dist_x = position[0] - center[0]; + double dist_y = position[1] - center[1]; + double dist = sqrt(dist_x*dist_x+dist_y*dist_y); - } + return 200*16*dist*dist; - } +} + +/////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////// +// _impl()-methods used by user to specify the function +// depending on position template double InterfaceHandlerLocalDiffusion:: get_jump_impl(const MathVector position) { // provide class member data - const MathVector center = get_center(0); const int orientation = this->get_orientation(); // call inline function: - return get_jump_value_ex5(position, center, orientation); + return get_jump_value_ex6(position, orientation); } @@ -237,13 +306,11 @@ double InterfaceHandlerLocalDiffusion:: get_jump_grad_impl(const MathVector position) { // provide class member data - const MathVector center = get_center(0); const int orientation = this->get_orientation(); // call inline function: - return get_jump_grad_value_ex3(position, center, orientation); - -} + return get_jump_grad_value_ex6(position, orientation); + } template double InterfaceHandlerLocalDiffusion:: @@ -255,11 +322,11 @@ get_source_impl(const MathVector position) // call inline function: return get_source_kappa(position, center, orientation); - } - +// methods calling the flag to decide whether constant lua user data is +// appplied of position-dependent inline c++ funtion _impl() (see above) template double InterfaceHandlerLocalDiffusion:: @@ -267,13 +334,13 @@ get_jump(const MathVector position) { number jump_value = 0.0; - if (m_bBndFct) + if (m_luaJump_isSet) { - // if the boundary conditions are given ... - jump_value = get_jump_impl(position); + jump_value = m_interfaceJump; } else - jump_value = m_interfaceJump; + // if the boundary conditions are NOT given by lua call, an own 'inline' implementation is needed: + jump_value = get_jump_impl(position); return jump_value; } @@ -285,18 +352,19 @@ get_jump_grad(const MathVector position) { number jump_grad_value = 0.0; - if (m_bBndFct) - { - // if the boundary conditions are given ... - jump_grad_value = get_jump_grad_impl(position); - } - else + if (m_luaJumpGrad_isSet) { if ( this->get_orientation() == 1 ) jump_grad_value = m_interfaceJumpGrad[0]; else jump_grad_value = m_interfaceJumpGrad[1]; } + else + { + // if the boundary conditions are NOT given by lua call, an own 'inline' implementation is needed: + jump_grad_value = get_jump_grad_impl(position); + } + return jump_grad_value; } @@ -308,146 +376,138 @@ get_source(const MathVector position) { number source_value = 0.0; - if (m_bBndFct) + if ( m_luaSource_isSet) + source_value = m_interfaceSource; + else { - // if the boundary conditions are given ... + // if the boundary conditions are NOT given by lua call, an own 'inline' implementation is needed: source_value = get_source_impl(position); } - else - source_value = m_interfaceSource; return source_value; } +// the diffusion only has the option for constant values -/////////////////////////////////////////////////////////////// -/// setter functions called during elem disc to set bndCond -/////////////////////////////////////////////////////////////// - template number InterfaceHandlerLocalDiffusion:: get_diffusion() { const int orientation = this->get_orientation(); - - // orientation == 1 corresponds to outside circle, if interface is a circle - if ( orientation == 1 ) return m_diffusionCoeff[0]; - else return m_diffusionCoeff[1]; - + +// orientation == 1 corresponds to OUTSIDE of the circle (if the interface is a circle) + if ( orientation == 1 ) + return m_diffusionCoeff[0]; + + return m_diffusionCoeff[1]; + } - + template number InterfaceHandlerLocalDiffusion:: get_diffusion(const bool bElementIsOutside) -{ -// m_diffusionCoeff[1] corresponds to inside circle, bElementIsOutside corresponds to outside circle - if ( bElementIsOutside ) return m_diffusionCoeff[1]; - else return m_diffusionCoeff[0]; +{ +// bElementIsOutside corresponds to INSIDE of the circle ( if the interface is a circle) + if ( bElementIsOutside ) + return m_diffusionCoeff[1]; + + return m_diffusionCoeff[0]; } +/////////////////////////////////////////////////////////////// +/// setter functions called during elem disc +/// 'ConvectionDiffusionFV1_cutElem' to set bndCond +/////////////////////////////////////////////////////////////// + template -LocalVector InterfaceHandlerLocalDiffusion:: -set_source(const std::vector sourceIm, LocalIndices ind, const size_t size, const bool bElementIsCut) +void InterfaceHandlerLocalDiffusion:: +set_source(const std::vector sourceIm, LocalVector& sourceOut, LocalIndices ind, + const size_t size, const bool bElementIsCut) { - LocalVector source; - ind.resize_dof(0, size); - source.resize(ind); - -// loop and set solution in 'solU_tri': - for (size_t dof = 0; dof < source.num_all_dof(0); ++dof) - { -/* if ( dof > 2 ) - source.value(0, dof) = sourceIm[2]; // done during 'add_def_elem_local()' - else - source.value(0, dof) = sourceIm[dof]; // done during 'add_def_elem_local()' -*/ - - // if dof_real is index of m_vertex: get solution from class: - if ( !bElementIsCut ) - { - source.value(0, dof) = sourceIm[dof]; // done during 'add_def_elem_local()' - } - else if ( this->lies_onInterface_size(dof, size) ) - { - size_t dof_real = this->real_index_size(dof, size); - source.value(0, dof) = get_source(this->get_VerticesPos(dof_real)); -// source.value(0, dof) = get_source_Fedkiw_ex5(this->get_VerticesPos(dof_real)); - } - else - { - size_t dof_orig = this->corner_orig(dof); - // careful: this->corner() returns corner coords of new corners => use dof-Index, NOT dof_orig-Index?! - // source.value(0, dof) = get_source_kappa(this->corner(dof)); - - source.value(0, dof) = sourceIm[dof_orig]; // done during 'add_def_elem_local()' - } - - } - - return source; + ind.resize_dof(0, size); + sourceOut.resize(ind); + +// loop and write solution to 'sourceOut': + for (size_t dof = 0; dof < sourceOut.num_all_dof(0); ++dof) + { + if ( !bElementIsCut ) + { + sourceOut.value(0, dof) = sourceIm[dof]; + } + // if dof_real is index of m_vertex: get values from InterfaceHandler: + else if ( this->lies_onInterface_size(dof, size) ) + { + size_t dof_real = this->real_index_size(dof, size); + sourceOut.value(0, dof) = get_source(this->get_VerticesPos(dof_real)); + } + else + { + size_t dof_orig = this->corner_orig(dof); + sourceOut.value(0, dof) = sourceIm[dof_orig]; + } + + } + + return; } - + template -LocalVector InterfaceHandlerLocalDiffusion:: -set_jump_values(LocalIndices ind, const size_t size) +void InterfaceHandlerLocalDiffusion:: +set_jump_values(LocalVector& jumpOut, LocalIndices ind, const size_t size) { - LocalVector jump; - ind.resize_dof(0, size); - jump.resize(ind); - -// loop and set solution in 'solU_tri': - for (size_t dof = 0; dof < jump.num_all_dof(0); ++dof) - { - - // if dof_real is index of m_vertex: get solution from class: - if ( this->lies_onInterface_size(dof, size) ) - { - size_t dof_real = this->real_index_size(dof, size); - jump.value(0, dof) = get_jump(this->get_VerticesPos(dof_real)); - } - else - { - jump.value(0, dof) = 0.0; - } - } - - return jump; + ind.resize_dof(0, size); + jumpOut.resize(ind); + +// loop and write values to 'jumpOut': + for (size_t dof = 0; dof < jumpOut.num_all_dof(0); ++dof) + { + + // if dof_real is index of m_vertex: get solution from class: + if ( this->lies_onInterface_size(dof, size) ) + { + size_t dof_real = this->real_index_size(dof, size); + jumpOut.value(0, dof) = get_jump(this->get_VerticesPos(dof_real)); + } + else + { + jumpOut.value(0, dof) = 0.0; + } + } + + return; } + template -LocalVector InterfaceHandlerLocalDiffusion:: -set_jump_grad_values(LocalIndices ind, const size_t size) +void InterfaceHandlerLocalDiffusion:: +set_jump_grad_values(LocalVector& jumpGradOut, LocalIndices ind, const size_t size) { - LocalVector jump_grad; - ind.resize_dof(0, size); - jump_grad.resize(ind); - -// loop and set solution in 'solU_tri': - for (size_t dof = 0; dof < jump_grad.num_all_dof(0); ++dof) - { - - // if dof_real is index of m_vertex: get solution from class: - if ( this->lies_onInterface_size(dof, size) ) - { - size_t dof_real = this->real_index_size(dof, size); - jump_grad.value(0, dof) = get_jump_grad(this->get_VerticesPos(dof_real)); -// jump_grad.value(0, dof) = get_jump_grad_value_ex5(this->get_VerticesPos(dof_real)); -// jump_grad.value(0, dof) = get_jump_grad_value_kappa_Frei(this->get_VerticesPos(dof_real)); - } - else - { - jump_grad.value(0, dof) = 0.0; - } - } - - return jump_grad; - + ind.resize_dof(0, size); + jumpGradOut.resize(ind); + + // loop and set solution in 'solU_tri': + for (size_t dof = 0; dof < jumpGradOut.num_all_dof(0); ++dof) + { + + // if dof_real is index of m_vertex: get solution from class: + if ( this->lies_onInterface_size(dof, size) ) + { + size_t dof_real = this->real_index_size(dof, size); + jumpGradOut.value(0, dof) = get_jump_grad(this->get_VerticesPos(dof_real)); + } + else + { + jumpGradOut.value(0, dof) = 0.0; + } + } + + return; + } - - + template void InterfaceHandlerLocalDiffusion:: set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, const int orientation) @@ -457,13 +517,12 @@ set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, con UG_LOG("in 'set_local_sol()': size = " << size << ", solU.size = " << solU.num_all_dof(0) << "\n"); UG_THROW("in 'set_local_sol()': size = " << size << ", solU.size = " << solU.num_all_dof(0) << " => claimed size is NOT equal to size of solution vector!\n"); } -// loop and set solution in 'solU_tri': +// loop and set solution in 'solU': for (size_t dof = 0; dof < solU.num_all_dof(0); ++dof) { - size_t dof_real = this->real_index_size(dof, size); - // if dof_real is index of m_vertex: get solution from class: + // if dof_real is index of m_vertex: get solution from the 'm_verticesValue'-array: if ( this->lies_onInterface_size(dof, size) ) { solU.value(0, dof) = this->get_sol(dof_real); @@ -474,233 +533,12 @@ set_local_sol(LocalVector& solU, const size_t size, const LocalVector& lvec, con } else { - // UG_LOG("tri: *value = " << lvec.value(0,dof_real) << "\n"); solU.value(0, dof) = lvec.value(0,dof_real); } } } - -template -bool InterfaceHandlerLocalDiffusion:: -check_interface_data(const bool bBndFct) -{ - // check value 1100.13 is set as default during constructor: - if ( m_interfaceSource == 1100.13 || m_interfaceJump == 1100.13 || m_interfaceJumpGrad[0] == 1100.13 || m_interfaceJumpGrad[1] == 1100.13 || m_diffusionCoeff[0] == 1100.13 || m_diffusionCoeff[1] == 1100.13) - UG_THROW("interface data not completely specified! call setter functions to define diffusion coefficients, source, jump and jump of the gradient at the interface.\n"); - - // if the boundary data is given by C++ functions, the values need to be set to zero: - if ( bBndFct ) - { - if ( fabs(m_interfaceSource) > 0.000001 || fabs(m_interfaceJump) > 0.000001 || fabs(m_interfaceJumpGrad[0]) > 0.000001|| fabs(m_interfaceJumpGrad[0]) > 0.000001 ) - UG_THROW("if the boundary data is given by C++ functions, the values need to be set to zero\n"); - } - - m_bBndFct = bBndFct; -} - -/* -template -int InterfaceHandlerLocalDiffusion:: -CollectCorners_FlatTop_2d(GridObject* elem) -{ - ////////////////////////////////////////////// - // 1) fill vector with fluid corners: - ////////////////////////////////////////////// - - this->m_vCornerCoords.clear(); - this->m_vInterfaceID.clear(); - this->m_vOriginalCornerID.clear(); - -// buffer vectors for (cornerCoords, cornerIndex) - std::vector, size_t > > vOutsideCorners; - std::vector, size_t > > vInsideCorners; - std::vector, size_t > > vNearIntCorners; - -// collect all vertices of the element - std::vector vVertex; - CollectVertices(vVertex, *this->m_spMG, elem); - - bool isFTVertex = false; - for(size_t i = 0; i < vVertex.size(); ++i) - { - // remember boolian for check, weather there existe at least one vertex, which is FT! - isFTVertex = this->is_FTVertex(vVertex[i], i); - if ( isFTVertex ) - break; - } - - if ( !isFTVertex ) - UG_THROW("Error in 'CollectCorners_FlatTop_2d': no vertex is FTVertex: should be true for at least 1 vertex!\n"); - - // collect all edges of the element - std::vector vEdges; - CollectEdgesSorted(vEdges, *this->m_spMG, elem); - - // loop vertices - ////////////////////////////////////////////// - // REMARK: - // order is the same as in 'vCornerCoords', therefore we can be sure, that the - // order of the new 'vCornerIBCoords' will be consistent with the grid standard - ////////////////////////////////////////////// - - bool bNearInterface = false; - for(size_t i = 0; i < vVertex.size(); ++i) - { - Vertex* vrtRoot = vVertex[i]; - - ////////////////////////////////////////////// - // case 1: - // vertex insideDomain - if ( !this->is_FTVertex(vrtRoot, i) ) - { - if ( this->is_nearInterfaceVertex(vrtRoot, i) ) - UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); - - this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); - this->m_vOriginalCornerID.push_back(i); - - vInsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); - } - ////////////////////////////////////////////// - // case 2: - // vertex = FT + ON interface - // => KEINE Berechnung von 'intersectionPoint' notwendig! -> pushen und alten index pushen - - // REMARK: is_nearInterfaceVerx = false per default, if m_vThresholdOnLevel = 0.0 - else if ( this->is_nearInterfaceVertex(vrtRoot, i) ) - { - bNearInterface = true; - this->m_vCornerCoords.push_back(this->m_aaPos[vrtRoot]); - this->m_vOriginalCornerID.push_back(i); - this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! - - vOutsideCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); - vNearIntCorners.push_back(std::make_pair(this->m_aaPos[vrtRoot], i)); - - } - ////////////////////////////////////////////// - // case 3: - // vertex 'outsideFluid' - // => NEUE Position berechen+pushen und alten index pushen - else - { - ////////////////////////////////////////////////////////////////////////////////////////// - // loop alle edges, die interface schneiden und damit einen neuen intersectionPnt - // beitragen zum damit assoziierten alten index - for(size_t e = 0; e < vEdges.size(); ++e) - { - Edge* edge = vEdges[e]; - std::vector vVertexEdge; - CollectVertices(vVertexEdge, *this->m_spMG, edge); - if ( vVertexEdge.size() != 2 ) - UG_THROW("error in collecting vertices associated to an edge!....EXIT!...\n"); - - Vertex* vrt1 = vVertexEdge[0]; - Vertex* vrt2 = vVertexEdge[1]; - size_t vrtInd1 = get_vertex_index(vrt1, elem); - size_t vrtInd2 = get_vertex_index(vrt2, elem); - - MathVector intersectionPnt; - - /////////////////////////////////////////////////////////////////// - // lies vrtRoot on a cutted edge? - /////////////////////////////////////////////////////////////////// - // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! - if ( this->is_nearInterfaceVertex(vrt2, vrtInd2) || this->is_nearInterfaceVertex(vrt1, vrtInd1) ) - { bNearInterface = true; continue; } - // case2: vert2 = outsideParticle && vrt1 = insideParticle: - else if ( vrtRoot == vrt1 && !this->is_FTVertex(vrt2, vrtInd2) ){ - this->get_intersection_point(intersectionPnt, vrt2, vrt1); - } - // case3: vrt1 = outsideParticle && vrt2 = insideParticle: - else if ( vrtRoot == vrt2 && !this->is_FTVertex(vrt1, vrtInd1) ) - this->get_intersection_point(intersectionPnt, vrt1, vrt2); - else - continue; - - // check for correct inersectionPnt - if ( fabs(this->get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) - UG_THROW("in 'CollectIBCorners2d()': Error in computation of 'intersectionPnt':\n " - " intersectionPnt = " << intersectionPnt << "\n distance from interace = " << fabs(get_LSvalue_byPosition(intersectionPnt)) << "\n"); - - /////////////////////////////////////////////////////////////////// - // only push_back, if not included yet! - // -> can be ONLY the case, if the intersectionPoint is a node - if ( ! this->isIncluded(this->m_vCornerCoords, intersectionPnt) ) - { - - this->m_vCornerCoords.push_back(intersectionPnt); - this->m_vOriginalCornerID.push_back(i); - this->m_vInterfaceID.push_back(this->m_vCornerCoords.size()-1); // attention: push AFTER 'm_vCornerCoords.push_back()'!! - - vOutsideCorners.push_back(std::make_pair(intersectionPnt, i)); - } - - - } // end edge-loop - - } // end else-case - - } // end vrt-loop - -//////////////////////////////////////////////////////////////////////////////////////////// -// Postprecessing for quadrilaterals ( <=> vOutsideCorners == 2 ) -// (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface -// => no Quadrilateral, but Triangle!! -//////////////////////////////////////////////////////////////////////////////////////////// - MathVector normalDir(0.0); - if ( (this->m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) - this->ResortQuadrilateral(vInsideCorners, vOutsideCorners, normalDir); - else if ( bNearInterface ) - { - // Quadrilateral -> Triangle - if ( vInsideCorners.size() == 1 ) // case 1 - { - // do nothing, since re-sorting not necessary...??? - } - // skip whole element, since only FT points are included - else if ( vInsideCorners.size() == 0 ) - UG_THROW("in 'CollectCorners_FlatTop_2d()': vInsideCorners.size() " - "= " << vInsideCorners.size() << "not possible!\n"); - } - - return this->m_vCornerCoords.size(); -} - - -// called by geo.update()!! -template -bool InterfaceHandlerLocalDiffusion:: -update_elem(GridObject* elem, const MathVector* vCornerCoords, int interfaceOrientation) -{ - bool do_update_local = false; - this->m_vBF.clear(); - -// computing flat top modus - this->m_elemModus = compute_element_modus(elem, interfaceOrientation); - - switch(this->m_elemModus) - { - case INSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); - if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); - break; // usual assembling - case OUTSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); - if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); - break; // usual assembling - case CUT_BY_INTERFACE: this->compute_flat_top_data(elem); - //if ( m_roid == ROID_PYRAMID )UG_THROW("PYRAMID\n"); - do_update_local = true; - break; // flat top assembling - default: - throw(UGError("Error in InterfaceHandlerLocalDiffusion::update(): switch(m_elemModus)!")); - } - - return do_update_local; - -} -*/ /////////////////////////////////////////////////////////////// // new methods from base class @@ -709,7 +547,7 @@ update_elem(GridObject* elem, const MathVector* vCornerCoords, int in // see mod_elem_flat_top() of flat_top.h template void InterfaceHandlerLocalDiffusion:: -compute_flat_top_data(GridObject* elem) +compute_cut_element_data(GridObject* elem) { // get new element corners and according element type if ( this->StdFV_assembling() ) // Version an Stelle von 'm_bUsualAss = true' @@ -744,76 +582,14 @@ compute_flat_top_data(GridObject* elem) if ( elem->reference_object_id() != ROID_TETRAHEDRON ) UG_THROW("Discretisation only coded for tetrahedral elements!\n"); +// output computed data to file + if ( this->print_cutElment_data() ) + print_CutElementData(); - this->m_elemModus = this->get_element_modus(elem); // computed via 'compute_element_modus()' during 'update_marker()' - - if ( 0 ){ - if( this->m_elemModus == CUT_BY_INTERFACE) - { - UG_LOG("_________________ compute_flat_top_data()_________________\n"); - - for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) - UG_LOG("m_vCornerCoords = " < m_vCornerCoords[i] << "\n"); - for ( size_t i = 0; i < this->m_vOriginalCornerID.size(); ++i ) - UG_LOG("Original: id = " << this->m_vOriginalCornerID[i] << "\n"); - UG_LOG("\n"); - for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i ) - UG_LOG("Interface: id = " << this->m_vInterfaceID[i] << "\n"); - UG_LOG("\n"); - if ( this->m_roid == ROID_TRIANGLE ) - { - for ( size_t i = 0; i < this->m_vRealCornerID_tri.size(); ++i ) - UG_LOG("m_vRealCornerID_tri: id = " << m_vRealCornerID_tri[i] << "\n"); - UG_LOG("\n"); - for ( size_t i = 0; i < m_vInterfaceID_tri.size(); ++i ) - UG_LOG("Interface tri: id = " << m_vInterfaceID_tri[i] << "\n"); - UG_LOG("\n"); - } - if ( this->m_roid == ROID_QUADRILATERAL ) - { - for ( size_t i = 0; i < m_vRealCornerID_quad.size(); ++i ) - UG_LOG("m_vRealCornerID_quad: id = " << m_vRealCornerID_quad[i] << "\n"); - UG_LOG("\n"); - for ( size_t i = 0; i < m_vInterfaceID_quad.size(); ++i ) - UG_LOG("Interface quad: id = " << m_vInterfaceID_quad[i] << "\n"); - UG_LOG("\n"); - } - } - } - -} - -template -bool InterfaceHandlerLocalDiffusion:: -update_elem(GridObject* elem, const MathVector* vCornerCoords) -{ - bool do_update_local = false; - m_vBF.clear(); - -// computing flat top modus - this->m_elemModus = this->compute_element_modus(elem, this->m_orientationInterface); - - switch(this->m_elemModus) - { - case INSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); - if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); - break; // usual assembling - case OUTSIDE_DOM: if ( dim == 2 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TRIANGLE); - if ( dim == 3 ) this->set_flat_top_data(elem, vCornerCoords, ROID_TETRAHEDRON); - break; // usual assembling - case CUT_BY_INTERFACE: compute_flat_top_data(elem); - //if ( m_roid == ROID_PYRAMID )UG_THROW("PYRAMID\n"); - do_update_local = true; - break; // flat top assembling - default: - throw(UGError("Error in InterfaceHandlerLocalBase::update(): switch(m_elemModus)!")); - } - return do_update_local; } - } // end namespace ug diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_tools.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_tools.h index 42d9629c6..59305e685 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_tools.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_tools.h @@ -50,128 +50,6 @@ lies_onInterface_size(const size_t newID, size_t size) } -/* -// compare implementation of 'DimFV1Geometry::update_boundary_faces()' -template -void InterfaceHandlerLocalDiffusion:: -update_inner_boundary_faces() -{ - - ///////////////////////////////////////////////////////////////////////////// - // get general data - ///////////////////////////////////////////////////////////////////////////// - const DimReferenceElement& rRefElem - = ReferenceElementProvider::get(this->m_roid); - - DimReferenceMapping& rMapping = ReferenceMappingProvider::get(this->m_roid); - rMapping.update(this->m_vCornerCoords); - - const LocalShapeFunctionSet& TrialSpace = - LocalFiniteElementProvider::get(this->m_roid, LFEID(LFEID::LAGRANGE, dim, 1)); - - ///////////////////////////////////////////////////////////////////////////// - // compute local and global geom object midpoints for each dimension - ///////////////////////////////////////////////////////////////////////////// - - MathVector vvLocMid[dim+1][maxMid]; - MathVector vvGloMid[dim+1][maxMid]; - - // set corners of element as local centers of nodes - for(size_t i = 0; i < rRefElem.num(0); ++i) - vvLocMid[0][i] = rRefElem.corner(i); - - // compute local midpoints - interfaceComputeMidPoints, maxMid>(rRefElem, vvLocMid[0], vvLocMid); - - // remember global position of nodes - for(size_t i = 0; i < rRefElem.num(0); ++i) - vvGloMid[0][i] = this->m_vCornerCoords[i]; - // compute local midpoints - interfaceComputeMidPoints, maxMid>(rRefElem, vvGloMid[0], vvGloMid); - - ///////////////////////////////////////////////////////////////////////////// - // collect boudary faces - ///////////////////////////////////////////////////////////////////////////// - - // get number of sides of element - size_t numSides = 0; - numSides = rRefElem.num(dim-1); - - // current number of bf - size_t curr_bf = 0; - - m_vBF.clear(); - // loop sides of element - for(size_t side = 0; side < numSides; ++side) - { - // side is no boundary face => continue - if ( !is_boundary_face(side) ) - continue; - - // number of corners of side (special case bottom side pyramid) - const int coOfSide = (this->m_roid != ROID_PYRAMID || side != 0) - ? rRefElem.num(dim-1, side, 0) : rRefElem.num(dim-1, side, 0) + 2; - - // resize vector - m_vBF.resize(curr_bf + coOfSide); - - // loop corners - for(int co = 0; co < coOfSide; ++co) - { - // get current bf - interfaceBF& bf = m_vBF[curr_bf]; - - // set node id == scv this bf belongs to - if (this->m_roid != ROID_PYRAMID || side != 0) - bf.nodeId = rRefElem.id(dim-1, side, 0, co); - else - { - // map according to order defined in ComputeBFMidID - bf.nodeId = rRefElem.id(dim-1, side, 0, (co % 3) + (co>3 ? 1 : 0)); - } - - // Compute MidID for BF - interfaceComputeBFMidID(rRefElem, side, bf.vMidID, co); - - // copy corners of bf - interfaceCopyCornerByMidID(bf.vLocPos, bf.vMidID, vvLocMid, interfaceBF::numCo); - interfaceCopyCornerByMidID(bf.vGloPos, bf.vMidID, vvGloMid, interfaceBF::numCo); - - // integration point - AveragePositions(bf.localIP, bf.vLocPos, interfaceBF::numCo); - AveragePositions(bf.globalIP, bf.vGloPos, interfaceBF::numCo); - - // normal on scvf - traits::NormalOnSCVF(bf.Normal, bf.vGloPos, vvGloMid[0]); - - // compute volume - bf.Vol = VecTwoNorm(bf.Normal); - - // compute shapes and grads - bf.numSH = TrialSpace.num_sh(); - TrialSpace.shapes(&(bf.vShape[0]), bf.localIP); - TrialSpace.grads(&(bf.vLocalGrad[0]), bf.localIP); - - // get reference mapping - rMapping.jacobian_transposed_inverse(bf.JtInv, bf.localIP); - bf.detj = rMapping.sqrt_gram_det(bf.localIP); - - // compute global gradients - for(size_t sh = 0 ; sh < bf.num_sh(); ++sh) - MatVecMult(bf.vGlobalGrad[sh], bf.JtInv, bf.vLocalGrad[sh]); - - // increase curr_bf - ++curr_bf; - - } // end loop of corners of side - - } // end loop sides of element - - -} -*/ - - // used during 'diffusion_interface/diffusion_interface.h:initialize_interface_Nitsche()': template @@ -251,29 +129,6 @@ get_or_insert_vertex(const MathVector& vrtPos) m_verticesPos.push_back(vrtPos); } - if ( vrtPos[0] == 0.5 ) - { - UG_LOG("m_verticesPos.size(): " << m_verticesPos.size() << "\n"); - // m_verticesValue.size() == numNewDoFs due to setting solution in 'modify_GlobalSol()'! - UG_LOG("m_verticesValue.size(): " << m_verticesValue.size() << "\n"); - - for ( size_t i = 0; i < m_verticesPos.size(); ++i) - UG_LOG("m_verticesPos: " << m_verticesPos[i][0] << " , " << m_verticesPos[i][1] << "\n"); - - if ( m_verticesValue[ret.first->second] != 0.0 ) - { - UG_LOG("vrtPos[0]: " << vrtPos[0] << "\n"); - UG_LOG("vrtPos[1]: " << vrtPos[1] << "\n"); - UG_LOG("ret.first->second: " << ret.first->second << "\n"); - UG_LOG("m_verticesValue: " << m_verticesValue[ret.first->second] << "\n"); - - } - - for ( size_t i = 0; i < m_verticesValue.size(); ++i) - UG_LOG("m_verticesValue: " << m_verticesValue[i] << "\n"); - - } - return ret.first->second; } @@ -305,20 +160,16 @@ Collect_Data_Nitsche(GridObject* elem) std::vector vVertex; CollectVertices(vVertex, *this->m_spMG, elem); -// FIRST: set m_vCornerCoords as usual coords for usage of corners(i) in fv1Cut_geom_impl.h:2336: -// m_vvGloMid[0][i] = m_spInterfaceHandler->corner(i); - this->m_vCornerCoords.clear(); + this->m_vCornerCoords.clear(); for(size_t i = 0; i < vVertex.size(); ++i) this->m_vCornerCoords.push_back(this->m_aaPos[vVertex[i]]); int numFTVertex = 0; for(size_t i = 0; i < vVertex.size(); ++i) { - if ( this->m_aaPos[vVertex[i]][0] == 1.0 && this->m_aaPos[vVertex[i]][1] == 0.0 ) - UG_LOG("stop here...\n"); // remember boolian for check, weather there existe at least one vertex, which is FT! - if ( this->is_FTVertex(vVertex[i], i) ) + if ( this->is_onInterfaceVertex(vVertex[i], i) ) numFTVertex++; } @@ -359,7 +210,7 @@ Collect_Data_Nitsche(GridObject* elem) if ( this->is_nearInterfaceVertex(vrt2, vrtInd2) || this->is_nearInterfaceVertex(vrt1, vrtInd1) ) { bNearInterface = true; continue; } // case2: vert2 = outsideParticle && vrt1 = insideParticle: - else if ( this->is_FTVertex(vrt1, vrtInd1) && !this->is_FTVertex(vrt2, vrtInd2) ) + else if ( this->is_onInterfaceVertex(vrt1, vrtInd1) && !this->is_onInterfaceVertex(vrt2, vrtInd2) ) { get_intersection_point(intersectionPnt, vrt2, vrt1, alphaOut); UG_LOG("* alphaOut[0] = " << alphaOut[0] << ", alphaOut[1] = " << alphaOut[1] << "\n"); @@ -381,7 +232,7 @@ Collect_Data_Nitsche(GridObject* elem) this->m_vInterfaceID.push_back(vrtInd2); } // case3: vrt1 = outsideParticle && vrt2 = insideParticle: - else if ( this->is_FTVertex(vrt2, vrtInd2) && !this->is_FTVertex(vrt1, vrtInd1) ) + else if ( this->is_onInterfaceVertex(vrt2, vrtInd2) && !this->is_onInterfaceVertex(vrt1, vrtInd1) ) { get_intersection_point(intersectionPnt, vrt1, vrt2, alphaOut); UG_LOG("# alphaOut[0] = " << alphaOut[0] << ", alphaOut[1] = " << alphaOut[1] << "\n"); @@ -548,7 +399,7 @@ CollectCorners_FlatTop_2d(GridObject* elem) for(size_t i = 0; i < vVertex.size(); ++i) { // remember boolian for check, weather there existe at least one vertex, which is FT! - isFTVertex = this->is_FTVertex(vVertex[i], i); + isFTVertex = this->is_onInterfaceVertex(vVertex[i], i); if ( isFTVertex ) break; } @@ -575,7 +426,7 @@ CollectCorners_FlatTop_2d(GridObject* elem) ////////////////////////////////////////////// // case 1: // vertex insideDomain - if ( !this->is_FTVertex(vrtRoot, i) ) + if ( !this->is_onInterfaceVertex(vrtRoot, i) ) { if ( this->is_nearInterfaceVertex(vrtRoot, i) ) UG_THROW("NearInterface BUT !is_FT => neuerdings Fehler!!....\n"); @@ -633,17 +484,17 @@ CollectCorners_FlatTop_2d(GridObject* elem) MathVector intersectionPnt; /////////////////////////////////////////////////////////////////// - // lies vrtRoot on a cutted edge? + // does vrtRoot lie on a cutted edge? /////////////////////////////////////////////////////////////////// // case1: vrtRoot is intersectionPnt with insideCorner = near_interface_corner => remove! if ( this->is_nearInterfaceVertex(vrt2, vrtInd2) || this->is_nearInterfaceVertex(vrt1, vrtInd1) ) { bNearInterface = true; this->set_bNearInterface(true); continue; } // case2: vert2 = outsideParticle && vrt1 = insideParticle: - else if ( vrtRoot == vrt1 && !this->is_FTVertex(vrt2, vrtInd2) ){ + else if ( vrtRoot == vrt1 && !this->is_onInterfaceVertex(vrt2, vrtInd2) ){ get_intersection_point(intersectionPnt, vrt2, vrt1); } // case3: vrt1 = outsideParticle && vrt2 = insideParticle: - else if ( vrtRoot == vrt2 && !this->is_FTVertex(vrt1, vrtInd1) ) + else if ( vrtRoot == vrt2 && !this->is_onInterfaceVertex(vrt1, vrtInd1) ) get_intersection_point(intersectionPnt, vrt1, vrt2); else continue; @@ -682,7 +533,6 @@ CollectCorners_FlatTop_2d(GridObject* elem) // (vInsideCorners.size() == 2) && (bNearInterface) => ALL nodes insideFluid, BUT one ON surface // => no Quadrilateral, but Triangle!! //////////////////////////////////////////////////////////////////////////////////////////// - const size_t orientation = this->m_orientationInterface; MathVector normalDir(0.0); if ( (this->m_vCornerCoords.size() == 4) && (!bNearInterface) && (dim == 2) ) @@ -695,7 +545,7 @@ CollectCorners_FlatTop_2d(GridObject* elem) for ( size_t i = 0; i < this->m_vInterfaceID.size(); ++i) m_vInterfaceID_quad.push_back(this->m_vInterfaceID[i]); } - else if ( bNearInterface && this->m_orientationInterface == -1 ) + else if ( bNearInterface && this->get_orientation() == -1 ) { // m_vRealCornerID_quad was not written and needs to be called: // and copy data to m_vInterfaceID_tri: @@ -727,6 +577,8 @@ CollectCorners_FlatTop_2d(GridObject* elem) m_vRealCornerID_tri.push_back(vRealCornerID_tri[i]); } + if ( this->m_vCornerCoords.size() == 0 ) + UG_THROW("m_vCornerCoords.size() = " << this->m_vCornerCoords.size() << "not possible!\n"); return this->m_vCornerCoords.size(); @@ -734,32 +586,53 @@ CollectCorners_FlatTop_2d(GridObject* elem) template void InterfaceHandlerLocalDiffusion:: -print_InterfaceIDdata() +print_CutElementData() { - this->print_InterfaceDdata(); - + const char* filename = "CutElementData."; + std::string name(filename); + char ext[50]; sprintf(ext, "txt"); + name.append(ext); + FILE* printFile = fopen(name.c_str(), "a"); + if ( dim == 3 ) + fprintf(printFile, "--------- New cut element --------\n\n"); + else if ( this->m_roid == ROID_QUADRILATERAL ) + fprintf(printFile, "--------- ROID_QUADRILATERAL --------\n\n"); + else if ( this->m_roid == ROID_TRIANGLE ) + fprintf(printFile, "------------ ROID_TRIANGLE ----------\n\n"); + + for ( size_t i = 0; i < this->m_vCornerCoords.size(); ++i ) + fprintf(printFile,"Cut element corner %lu: %e, %e \n", i, this->m_vCornerCoords[i][0], this->m_vCornerCoords[i][1]); + fprintf(printFile,"\n"); + + for(size_t i = 0; i < this->m_vOriginalCornerID.size(); ++i) + fprintf(printFile,"Original corner ID: %lu\n", this->m_vOriginalCornerID[i]); + fprintf(printFile,"\n"); + + for(size_t i = 0; i < this->m_vInterfaceID.size(); ++i) + fprintf(printFile,"Interface corner ID: %lu\n", this->m_vInterfaceID[i]); + fprintf(printFile,"\n"); + + if ( InterfaceHandlerLocalBase::m_roid == ROID_TRIANGLE ) { for ( size_t i = 0; i < m_vInterfaceID_tri.size(); ++i ) - UG_LOG("Interface tri: id = " << m_vInterfaceID_tri[i] << "\n"); - UG_LOG("\n"); + fprintf(printFile,"Interface corner ID - tri: %lu\n", m_vInterfaceID_tri[i]); for ( size_t i = 0; i < m_vRealCornerID_tri.size(); ++i ) - UG_LOG("m_vRealCornerID_tri: id = " << m_vRealCornerID_tri[i] << "\n"); - UG_LOG("\n"); - } + fprintf(printFile,"Real corner ID - tri: %lu\n", m_vRealCornerID_tri[i]); + } if ( InterfaceHandlerLocalBase::m_roid == ROID_QUADRILATERAL ) { for ( size_t i = 0; i < m_vInterfaceID_quad.size(); ++i ) - UG_LOG("Interface quad: id = " << m_vInterfaceID_quad[i] << "\n"); - UG_LOG("\n"); - + fprintf(printFile,"Interface corner ID - quad: %lu\n", m_vInterfaceID_quad[i]); + for ( size_t i = 0; i < m_vRealCornerID_quad.size(); ++i ) - UG_LOG("m_vRealCornerID_quad: id = " << m_vRealCornerID_quad[i] << "\n"); - UG_LOG("\n"); - } + fprintf(printFile,"Real corner ID - quad: %lu\n", m_vRealCornerID_quad[i]); + } + + fclose(printFile); } diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_user_data.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_user_data.h index 7553abb81..39ac24107 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_user_data.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_handler/interface_handler_two_sided_cut/interface_handler_diffusion_user_data.h @@ -39,17 +39,7 @@ inline double get_jump_value_ex3(const MathVector position, const MathVecto -template -inline double get_jump_value_ex6(const MathVector position, const MathVector center, const int orientation) -{ - - if ( orientation == 1) - return 0.0; - - double returnValue = exp(position[0])*cos(position[1]); - return returnValue; -} template inline double get_jump_value_const(const MathVector position, const MathVector center, const int orientation) @@ -69,19 +59,7 @@ inline double get_jump_value_const(const MathVector position, const MathVec } -template -inline double get_jump_grad_value_ex6(const MathVector position, const MathVector center, const int orientation) -{ - if ( orientation == -1) - return 0.0; - - double x = position[0]; - double y = position[1]; - double returnValue = 2.0*exp(x)*(y*sin(y)-x*cos(y)); - - return returnValue; -} template inline double get_jump_grad_value_kappa_Frei(const MathVector position, const MathVector center, const int orientation) @@ -105,15 +83,7 @@ inline double get_jump_grad_value_kappa_Frei_inverse(const MathVector posit } -template -inline double get_jump_grad_value_ex5(const MathVector position, const MathVector center, const int orientation) -{ - if ( orientation == 1) - return 2.0; - else - return 0.0; -} template @@ -121,7 +91,6 @@ inline double get_source_kappa_konform(const MathVector position, const Mat { double center_x = 0.0; double center_y = -0.0244; - double radius = 0.2625; if ( orientation == 1) { @@ -196,32 +165,10 @@ inline double get_source_kappa_Frei_inverse(const MathVector position, cons } } -template -inline double get_source_Fedkiw_ex5(const MathVector position, const MathVector center, const int orientation) -{ - return 0.0; -} -template -inline double get_source_Fedkiw_ex3(const MathVector position, const MathVector center, const int orientation) -{ -// outside the circle line: - if ( orientation == 1) - { - UG_LOG("set to zero...\n"); - return 0.0; - } - double dist_x = position[0] - 0.5; - double dist_y = position[1] - 0.5; - double distSq = dist_x*dist_x+dist_y*dist_y; - double dist = sqrt(dist_x*dist_x+dist_y*dist_y); - - double absValue = position[0]*position[0] + position[1]*position[1]; - return -8*(absValue-1.0)*exp(-absValue); -} } // end namespace ug diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_base.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_base.h index fa1695f0a..ddac7f033 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_base.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_base.h @@ -10,56 +10,29 @@ namespace ug{ - -class IInterfaceProvider -{ - public: - -/// default constructor: - IInterfaceProvider(){}; - -/// destructor - - ~IInterfaceProvider() {} - -}; - +template class IInterfaceProvider { - public: - + public: +/// world Dimension + static const int dim = TWorldDim; + /// default constructor: IInterfaceProvider(){}; /// destructor - ~IInterfaceProvider() {} - -}; - - -template -class InterfaceProviderBase : public IInterfaceProvider -{ - - public: -/// world Dimension - static const int dim = TWorldDim; + virtual ~IInterfaceProvider() {} -/// default constructor: - InterfaceProviderBase() - { - clear(); - UG_LOG("InterfaceProviderBase constructor\n"); - }; - -/// destructor - ~InterfaceProviderBase() {} + virtual number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) = 0; + virtual const int get_orientation() const= 0; + virtual void set_orientation(const int orientation) = 0; }; + }// end namespace ug diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_diffusion.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_diffusion.h index 9a5b24c4c..8bb7c9f6b 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_diffusion.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_diffusion.h @@ -23,55 +23,28 @@ class DiffusionInterfaceProvider : public ParticleProviderSphere static const int dim = TWorldDim; /// default constructor: - DiffusionInterfaceProvider() + DiffusionInterfaceProvider() { this->clear(); UG_LOG("DiffusionInterfaceProvider constructor\n"); }; /// destructor - ~DiffusionInterfaceProvider() {} + virtual ~DiffusionInterfaceProvider() {} // setter methods - void add_with_solution(number radius, const MathVector& center, number density, number solution) + void add(number radius, const MathVector& center) { - // A. set given values: - this->m_vCenter.push_back(center); - this->m_vRadius.push_back(radius); - this->m_vDensity.push_back(density); - - // B. prepare data for free particle velocities, to be computed - // B1: resize velocity vectors for TimeSeries-Data - const size_t numTimePoints = 2; - m_vvSolution.resize(numTimePoints); - - // B2: set default values if velocity of particle is free within fluid - for ( size_t i = 0; i < numTimePoints; ++i ) - m_vvSolution[i].push_back(solution); - } - - void add(number radius, const MathVector& center, number density) - { - // A. set given values: + // set given values: this->m_vCenter.push_back(center); this->m_vRadius.push_back(radius); - this->m_vDensity.push_back(density); - - // B. prepare data to set particle velocities - // B1: resize velocity vectors for TimeSeries-Data - const size_t numTimePoints = 2; - m_vvSolution.resize(numTimePoints); - - // B2: set particle velocities - for ( size_t i = 0; i < numTimePoints; ++i ) - m_vvSolution[i].push_back(0.0); - + this->m_vDensity.push_back(1.0); } +// getter methods number get_radius(int prtIndex) { if ( (int)this->num_particles() > 1 ) UG_THROW("DiffusionInterfaceProvider::num_particles(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); - return this->m_vRadius[prtIndex]; } number get_density(int prtIndex) @@ -84,37 +57,21 @@ class DiffusionInterfaceProvider : public ParticleProviderSphere UG_THROW("DiffusionInterfaceProvider::num_particles(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); return this->m_vCenter[prtIndex]; } -// called during ParticleMapper::modify_GlobalSol(): - void set_solution(number solution, size_t prtIndex, int timeSeriesInd) - { m_vvSolution[timeSeriesInd][prtIndex] = solution; } - -/// get solution values - number get_solution(size_t prtIndex, size_t timeSeriesInd) - { return m_vvSolution[timeSeriesInd][prtIndex]; } - +// output methods void print() { - UG_LOG(" +++++++++++++++++++++++++ Particle Info ++++++++++++++++++++++++++++++ \n"); - UG_LOG("+++ num_particles = " << this->num_particles() << "\n"); + UG_LOG(" +++++++++++++++++++++++++ Interface Info ++++++++++++++++++++++++++++++ \n"); + UG_LOG("+++ num_circles = " << this->num_particles() << "\n"); for (size_t p = 0; p < this->num_particles(); ++p) { UG_LOG("+++ center = " << this->get_center(p) << "\n"); UG_LOG("+++ radius = " << this->get_radius(p) << "\n"); UG_LOG("+++ density = " << this->get_density(p) << "\n"); - - UG_LOG("+++ solution set to: " << get_solution(p, 0) << "\n\n"); } UG_LOG(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); } - protected: - -// m_vvSolution[i][j]: i := timeSeries-index; j := particle-index - // ToDo switch indexing: [prtIndex][TimeSeriesIndes] !! - std::vector > m_vvSolution; - - }; diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle.h index 3ef863330..99d5eea97 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle.h @@ -16,21 +16,10 @@ namespace ug{ -class IInterfaceProvider -{ - public: - -/// default constructor: - IInterfaceProvider(){}; - -/// destructor - - ~IInterfaceProvider() {} - -}; +#include "interface_provider_base.h" template -class ParticleProvider : public IInterfaceProvider +class ParticleProvider : public IInterfaceProvider { public: @@ -39,14 +28,72 @@ class ParticleProvider : public IInterfaceProvider /// default constructor: ParticleProvider() + : m_prtIndex(-1), m_orientationInterface(1) { clear(); UG_LOG("ParticleProvider constructor\n"); }; /// destructor - ~ParticleProvider() {} + virtual ~ParticleProvider() {} + +////////////////////////////////////////////////////////// +/// virtual base class methods, which need to be +/// implemented by derived class +////////////////////////////////////////////////////////// + +/// methods called by CutElementHandler: + virtual number get_LSvalue_byPosition(MathVector vrtPos) + { UG_THROW("in 'ParticleProvider::get_LSvalue_byPosition(vrtPos)': needs to be implemented by derived class!\n");} + + virtual number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) + { UG_THROW("in 'ParticleProvider::get_LSvalue_byPosition(vrtPos, prtIndex)': needs to be implemented by derived class!\n");} + + virtual bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int PrtIndex) + { UG_THROW("in 'ParticleProvider::get_intersection_point()': needs to be implemented by derived class!\n");} + + virtual bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int PrtIndex, std::vector& alphaOut) + { UG_THROW("in 'ParticleProvider::get_intersection_point()': needs to be implemented by derived class!\n");} + +// updates the location of the interface for the next time step + virtual void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) + { UG_THROW("in 'ParticleProvider::update()': needs to be implemented by derived class!\n");} + + + virtual number get_radius(int prtIndex) + { UG_THROW("in 'ParticleProvider::get_radius()': needs to be implemented by derived class!\n");} + + number get_theta(int prtIndex) + { UG_THROW("in 'ParticleProvider::get_theta()': needs to be implemented by derived class!\n");} + number set_theta(number theta, int prtIndex) + { UG_THROW("in 'ParticleProvider::get_theta()': needs to be implemented by derived class!\n");} + + virtual void print() + { UG_THROW("in 'ParticleProvider::print()': needs to be implemented by derived class!\n");} + +/// methods called by LocalToGlobalMapper: + virtual number Volume(int levIndex, size_t prtIndex) + { UG_THROW("in 'ParticleProvider::Volume()': needs to be implemented by derived class!\n");} + virtual number Mass(const int levIndex, const int prtIndex, const number fluidDensity) + { UG_THROW("in 'ParticleProvider::Mass()': needs to be implemented by derived class!\n");} + virtual number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) + { UG_THROW("in 'ParticleProvider::Mass()': needs to be implemented by derived class!\n");} + virtual number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) + { UG_THROW("in 'ParticleProvider::MomOfInertia()': needs to be implemented by derived class!\n");} + virtual number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) + { UG_THROW("in 'ParticleProvider::MomOfInertia()': needs to be implemented by derived class!\n");} + + + virtual void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) + { UG_THROW("in 'ParticleProvider::print_velocity()': needs to be implemented by derived class!\n");} + +////////////////////////////////////////////////////////// +/// setter methods +////////////////////////////////////////////////////////// + void set_density(number density, int prtIndex) { if ( (int)num_particles() < prtIndex ) @@ -65,13 +112,15 @@ class ParticleProvider : public IInterfaceProvider void clear() { - UG_LOG("clear particles!\n"); - m_vCenter.clear(); m_vDensity.clear(); m_vGivenVelocity.clear(); - m_vvLinearVelocity.clear(); m_vvAngularVelocity.clear(); + m_vDensity.clear(); m_vCenter.clear(); + m_vvLinearVelocity.clear(); m_vvAngularVelocity.clear(); + m_vGivenVelocity.clear(); } +////////////////////////////////////////////////////////// +/// setter methods +////////////////////////////////////////////////////////// -// getter methods size_t num_particles() const{ return m_vCenter.size(); } number get_density(int prtIndex){ return m_vDensity[prtIndex]; } @@ -79,73 +128,46 @@ class ParticleProvider : public IInterfaceProvider bool get_DoF_modus_linear(int prtIndex) { return m_vGivenVelocity[prtIndex][0]; } bool get_DoF_modus_angular(int prtIndex) { return m_vGivenVelocity[prtIndex][1]; } -// called during PartcleMapper::modify_GlobalSol(): +// getter and setter for orientation of the interface + const int get_prtIndex() const{ return m_prtIndex; } + void set_prtIndex(const int prtIndex) { m_prtIndex = prtIndex; } + + +// getter and setter for orientation of the interface + void set_orientation(const int orientation) { m_orientationInterface = orientation; } + const int get_orientation() const{ return m_orientationInterface; } + +// getter and setter for the velocity of the interface +// --> called during PartcleMapper::modify_GlobalSol(): void set_linear_velocity(number solution, size_t prtIndex, int timeSeriesInd, int cmp) - { m_vvLinearVelocity[timeSeriesInd][prtIndex][cmp] = solution; } + { m_vvLinearVelocity[timeSeriesInd][prtIndex][cmp] = solution; } void set_linear_velocity(MathVector solution, size_t prtIndex, int timeSeriesInd) - { m_vvLinearVelocity[timeSeriesInd][prtIndex] = solution; } - void set_angular_velocity(number solution, size_t prtIndex, int timeSeriesInd, int cmp) - { m_vvAngularVelocity[timeSeriesInd][prtIndex][cmp] = solution; } + { m_vvLinearVelocity[timeSeriesInd][prtIndex] = solution; } + void set_angular_velocity(number solution, size_t prtIndex, int timeSeriesInd, int cmp) + { m_vvAngularVelocity[timeSeriesInd][prtIndex][cmp] = solution; } void set_angular_velocity(MathVector solution, size_t prtIndex, int timeSeriesInd) - { m_vvAngularVelocity[timeSeriesInd][prtIndex] = solution; } + { m_vvAngularVelocity[timeSeriesInd][prtIndex] = solution; } -/// get solution values MathVector get_linear_velocity(size_t prtIndex, size_t timeSeriesInd) { return m_vvLinearVelocity[timeSeriesInd][prtIndex]; } MathVector get_angular_velocity(size_t prtIndex, size_t timeSeriesInd) { return m_vvAngularVelocity[timeSeriesInd][prtIndex]; } - virtual number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) - { UG_THROW("in 'ParticleProvider::get_LSvalue_byPosition()': needs to be implemented by derived class!\n");} - - virtual bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex) - { UG_THROW("in 'ParticleProvider::get_intersection_point()': needs to be implemented by derived class!\n");} - - virtual bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) - { UG_THROW("in 'ParticleProvider::get_intersection_point()': needs to be implemented by derived class!\n");} - - -// careful! --> only dummy implementation, sice some methods in MovingParticle-class use it; in these cases it will be overwritten by -// the ParticleProviderSphere-class (hopefully) ;) - virtual number get_radius(int prtIndex) - { UG_THROW("in 'ParticleProvider::get_radius()': needs to be implemented by derived class!\n");} - - number get_theta(int prtIndex) - { UG_THROW("in 'ParticleProvider::get_theta()': needs to be implemented by derived class!\n");} - number set_theta(number theta, int prtIndex) - { UG_THROW("in 'ParticleProvider::get_theta()': needs to be implemented by derived class!\n");} - - void print() - { UG_THROW("in 'ParticleProvider::print()': needs to be implemented by derived class!\n");} - - /// methods called by local_to_global_mappe: - virtual number Volume(int levIndex, size_t prtIndex) - { UG_THROW("in 'ParticleProvider::Volume()': needs to be implemented by derived class!\n");} - virtual number Mass(const int levIndex, const int prtIndex, const number fluidDensity) - { UG_THROW("in 'ParticleProvider::Mass()': needs to be implemented by derived class!\n");} - virtual number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) - { UG_THROW("in 'ParticleProvider::Mass()': needs to be implemented by derived class!\n");} - virtual number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) - { UG_THROW("in 'ParticleProvider::MomOfInertia()': needs to be implemented by derived class!\n");} - virtual number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) - { UG_THROW("in 'ParticleProvider::MomOfInertia()': needs to be implemented by derived class!\n");} - - virtual void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) - { UG_THROW("in 'ParticleProvider::print_velocity()': needs to be implemented by derived class!\n");} - - virtual void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) - { UG_THROW("in 'ParticleProvider::update()': needs to be implemented by derived class!\n");} protected: std::vector m_vDensity; std::vector > m_vCenter; - // m_vLinearVelocity[i][j]: i := timeSeries-index; j := particle-index - // ToDo switch indexing: [prtIndex][TimeSeriesIndes] !! + +// indexing: [TimeSeriesIndes][prtIndex]: std::vector > > m_vvLinearVelocity; std::vector > > m_vvAngularVelocity; - // [prtIndex][linear/angular] - std::vector > m_vGivenVelocity; +// indexing: [prtIndex][linear/angular] + std::vector > m_vGivenVelocity; + + int m_prtIndex; + int m_orientationInterface; + }; @@ -154,320 +176,72 @@ class ParticleProviderSphere : public ParticleProvider { public: - /// world Dimension +/// world Dimension static const int dim = TWorldDim; - /// default constructor: +/// default constructor: ParticleProviderSphere() : ParticleProvider() { UG_LOG("ParticleProviderSphere constructor\n") }; - /// destructor - ~ParticleProviderSphere() {} - - // setter methods - void add(number radius, const MathVector& center, number density) - { - // A. set given values: - this->m_vCenter.push_back(center); - m_vRadius.push_back(radius); - this->m_vDensity.push_back(density); - std::vector bDummy(2,false); - this->m_vGivenVelocity.push_back(bDummy); - - // B. prepare data for free particle velocities, to be computed - // B1: resize velocity vectors for TimeSeries-Data - const size_t numTimePoints = 2; - this->m_vvLinearVelocity.resize(numTimePoints); - this->m_vvAngularVelocity.resize(numTimePoints); - - // B2: set dummy values if velocity of particle is free within fluid - const MathVector vDummy(0.0); - - for ( size_t i = 0; i < numTimePoints; ++i ) - { - this->m_vvLinearVelocity[i].push_back(vDummy); - this->m_vvAngularVelocity[i].push_back(vDummy); - } - - } - +/// destructor + virtual ~ParticleProviderSphere() {} + + +// initializing methods + void add (number radius, const MathVector& center, number density); void add_moving(number radius, const MathVector& center, number density, - const MathVector& linearVel, const MathVector& angularVel) - { - // A. set given values: - this->m_vCenter.push_back(center); - m_vRadius.push_back(radius); - this->m_vDensity.push_back(density); - std::vector dummy(2,true); - this->m_vGivenVelocity.push_back(dummy); - - // B. prepare data to set particle velocities - // B1: resize velocity vectors for TimeSeries-Data - const size_t numTimePoints = 2; - this->m_vvLinearVelocity.resize(numTimePoints); - this->m_vvAngularVelocity.resize(numTimePoints); - - // B2: set particle velocities - for ( size_t i = 0; i < numTimePoints; ++i ) - { - this->m_vvLinearVelocity[i].push_back(linearVel); - this->m_vvAngularVelocity[i].push_back(angularVel); - } - } - - void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) - { - // update center of particle - MathVector centerNew = this->get_center(prtIndex); - VecScaleAdd(centerNew, 1.0, centerNew, deltaT, transSol); - this->set_center(centerNew, prtIndex); - } + const MathVector& linearVel, const MathVector& angularVel); + /////////////////////////////////////////////////////////////////////////////////////// -// new setter methods +// virtual base class methods (necessary to be implemented!) /////////////////////////////////////////////////////////////////////////////////////// + + number get_LSvalue_byPosition(MathVector vrtPos); + number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex); + + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int prtIndex) + { return get_LineCircle_Intersection(Intersect, vrtPosOut, vrtPosIn, prtIndex);} + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int prtIndex, std::vector& alphaOut) + { return get_LineCircle_Intersection(Intersect, vrtPosOut, vrtPosIn, prtIndex, alphaOut);} + + bool get_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int prtIndex); + bool get_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int prtIndex, std::vector& alphaOut); + +// updates the center of particle + void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex); + void set_radius(number radius, int prtIndex) { if ( (int)this->num_particles() < prtIndex ) UG_THROW("ParticleProviderSphere::set_radius(): number of given particles = " - << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); + << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); m_vRadius[prtIndex] = radius; } -/////////////////////////////////////////////////////////////////////////////////////// -// new getter methods -/////////////////////////////////////////////////////////////////////////////////////// - number get_radius(int prtIndex){ return m_vRadius[prtIndex]; } - -/////////////////////////////////////////////////////////////////////////////////////// -// methods from base class (necessary to be implemented!) -/////////////////////////////////////////////////////////////////////////////////////// - - - /// methods called by local_to_global_mappe: +/// methods called by class 'LocalToGlobalMapper': number Volume(int levIndex, size_t prtIndex); number Mass(const int levIndex, const int prtIndex, const number fluidDensity); number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity); number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity); number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity); - void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename); - - number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) - { - // if ( prtIndex == 1 ) - // UG_LOG("jihaa!...\n"); - - const number radius = get_radius(prtIndex); - const MathVector& center = this->get_center(prtIndex); - - MathVector localCoords; - VecSubtract(localCoords, vrtPos, center); - - number dist = VecDot(localCoords, localCoords); - dist = sqrt(dist); - - return radius - dist; - } - - bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex) - { return get_LineCircle_Intersection(Intersect, vrtPosOut, vrtPosIn, PrtIndex);} - - bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) - { return get_LineCircle_Intersection(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut);} - - - bool get_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, - const MathVector& vrtPosIn, int PrtIndex) - { - // if ( dim == 3 ) UG_THROW("in 'get_LineCircle_Intersection()': not implemented for 3d case!\n"); - - /////////////////////////////////////////////////////////////////////////////////////// - // - // 'vrtPosOut':= the starting point of the ray, - // 'vrtPosIn' := the end point of the ray, - // 'center' := the center of sphere you're testing against - // 'radius' := the radius of that sphere - // 'lineDir' := direction vector of ray from start to end - // 'rayDir' := direction vector of ray from center to start - // - // Ansatz: - // (1) Intersect = vrtPosOut + alpha*lineDir - // (2) Intersect - center = radius - // - // => (1) Intersect[0] = vrtPosOut[0] + alpha*lineDir[0] - // Intersect[1] = vrtPosOut[1] + alpha*lineDir[1] - // => (2) (Intersect[0] - center[0])^2 + (Intersect[1] - center[1])^2 = radius^2 - // - // Plug (1) into (2) => ... => quadratic equation for alpha: - // - // alpha^2 * + alpha * 2* + ( -radius^2 ) = 0 - // - // -> a = , b = , c = - radius^2 - // - // - // => from (1): Intersect = vrtPosOut + alpha*(vrtPosIn - vrtPosOut) - /////////////////////////////////////////////////////////////////////////////////////// - - number alpha; - - const number radius = get_radius(PrtIndex); - const MathVector& center = this->get_center(PrtIndex); - - MathVector lineDir; - MathVector rayDir; - - // lineDir = vrtPosIn - vrtPosOut; - VecSubtract(lineDir, vrtPosIn, vrtPosOut); - // rayDir = vrtPosOut - center; - VecSubtract(rayDir, vrtPosOut, center); - - const number a = VecDot(lineDir, lineDir); - const number b = 2.0 * VecDot(lineDir, rayDir); - const number c = VecDot(vrtPosOut, vrtPosOut) + VecDot(center, center) - - 2 * VecDot(vrtPosOut, center) - radius * radius; - - const number discriminant = b * b - 4 * a * c; - - // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: - if (discriminant < -1e-8) - UG_THROW("Value of discriminant = " << discriminant << "\n"); - - - // discriminant = 0! - const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); - const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); - - if (alpha1 <= alpha2) - alpha = alpha1; - else - alpha = alpha2; - - if (alpha < 0 || (alpha - 1.0) > 1e-8) - UG_THROW( - "Error in 'get_LineCircle_Intersection()': alpha not valid; should lie between 0 and 1: " << alpha << "\n"); - - for (size_t d = 0; d < dim; ++d) - Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; - - return true; - } - - bool get_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, - const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) - { - if ( (int)this->num_particles() > 1 ) - UG_THROW("get_LineCircle_Intersection(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); - - //if ( dim == 3 ) UG_THROW("in 'get_LineCircle_Intersection()': not implemented for 3d case!\n"); - - /////////////////////////////////////////////////////////////////////////////////////// - // - // 'vrtPosOut':= the starting point of the ray, - // 'vrtPosIn' := the end point of the ray, - // 'center' := the center of sphere you're testing against - // 'radius' := the radius of that sphere - // 'lineDir' := direction vector of ray from start to end - // 'rayDir' := direction vector of ray from center to start - // - // Ansatz: - // (1) Intersect = vrtPosOut + alpha*lineDir - // (2) Intersect - center = radius - // - // => (1) Intersect[0] = vrtPosOut[0] + alpha*lineDir[0] - // Intersect[1] = vrtPosOut[1] + alpha*lineDir[1] - // => (2) (Intersect[0] - center[0])^2 + (Intersect[1] - center[1])^2 = radius^2 - // - // Plug (1) into (2) => ... => quadratic equation for alpha: - // - // alpha^2 * + alpha * 2* + ( -radius^2 ) = 0 - // - // -> a = , b = , c = - radius^2 - // - // - // => from (1): Intersect = vrtPosOut + alpha*(vrtPosIn - vrtPosOut) - /////////////////////////////////////////////////////////////////////////////////////// - - number alpha; - - const number radius = get_radius(PrtIndex); - const MathVector& center = this->get_center(PrtIndex); - - MathVector lineDir; - MathVector rayDir; - - // lineDir = vrtPosIn - vrtPosOut; - VecSubtract(lineDir, vrtPosIn, vrtPosOut); - // rayDir = vrtPosOut - center; - VecSubtract(rayDir, vrtPosOut, center); - - const number a = VecDot(lineDir, lineDir); - const number b = 2.0 * VecDot(lineDir, rayDir); - const number c = VecDot(vrtPosOut, vrtPosOut) + VecDot(center, center) - - 2 * VecDot(vrtPosOut, center) - radius * radius; - - const number discriminant = b * b - 4 * a * c; - - // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: - if (discriminant < -1e-8) - UG_THROW("Value of discriminant = " << discriminant << "\n"); - - // discriminant = 0! - const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); - const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); - - if (alpha1 <= alpha2) - alpha = alpha1; - else - alpha = alpha2; - - if (alpha < 0 || (alpha - 1.0) > 1e-8) - UG_THROW( - "Error in 'get_LineCircle_Intersection()': alpha not valid; should lie between 0 and 1: " << alpha << "\n"); - - for (size_t d = 0; d < dim; ++d) - Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; - - alphaOut.clear(); - alphaOut.push_back(alpha); - alphaOut.push_back(1.0 - alpha); - - UG_LOG("alphaOut 0 = " << alphaOut[0] << "\n"); - UG_LOG("alphaOut 1 = " << alphaOut[1] << "\n"); - - return true; - } - + void print(); + void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, + const bool isTimedep, const number time, const char* filename); + /////////////////////////////////////////////////////////////////////////////////////// +/// class member /////////////////////////////////////////////////////////////////////////////////////// - void print() - { - UG_LOG(" +++++++++++++++++++++++++ ParticleProviderSphere Info ++++++++++++++++++++++++++++++ \n"); - UG_LOG("+++ num_particles = " << this->num_particles() << "\n"); - for (size_t p = 0; p < this->num_particles(); ++p) - { - UG_LOG("+++ center = " << this->get_center(p) << "\n"); - UG_LOG("+++ density = " << this->get_density(p) << "\n"); - UG_LOG("+++ radius = " << get_radius(p) << "\n"); - - if ( this->get_DoF_modus_linear(p) ) - {UG_LOG("+++ linear velocity set to: " << this->get_linear_velocity(p, 0) << "\n\n");} - else - {UG_LOG("+++ linear velocity FREE and set to: " << this->get_linear_velocity(p, 0) << "\n\n");} - if ( this->get_DoF_modus_angular(p) ) - {UG_LOG("+++ angular velocity set to: " << this->get_angular_velocity(p, 0) << "\n\n");} - else - {UG_LOG("+++ lineangularar velocity FREE and set to: " << this->get_angular_velocity(p, 0) << "\n\n");} - - } - UG_LOG(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); - } - protected: std::vector m_vRadius; @@ -479,640 +253,106 @@ class ParticleProviderEllipse : public ParticleProvider { public: - /// world Dimension +/// world Dimension static const int dim = TWorldDim; - /// default constructor: +/// default constructor: ParticleProviderEllipse() : ParticleProvider() { this->clear(); + m_vEllipticAxis.clear(); + m_vTheta.clear(); UG_LOG("ParticleProviderEllipse constructor\n"); - }; - /// destructor - ~ParticleProviderEllipse() {} - - // setter methods - void add(const MathVector& ellipticAxis, const MathVector& center, const number theta, number density) - { - // A. set given values: - this->m_vCenter.push_back(center); - m_vEllipticAxis.push_back(ellipticAxis); - m_vTheta.push_back(theta); +/// destructor + virtual ~ParticleProviderEllipse() {} - this->m_vDensity.push_back(density); - std::vector bDummy(2,false); - this->m_vGivenVelocity.push_back(bDummy); - - // B. prepare data for free ellipse velocities, to be computed - // B1: resize velocity vectors for TimeSeries-Data - const size_t numTimePoints = 2; - this->m_vvLinearVelocity.resize(numTimePoints); - this->m_vvAngularVelocity.resize(numTimePoints); - - // B2: set dummy values if velocity of ellipse is free within fluid - const MathVector vDummy(0.0); - - for ( size_t i = 0; i < numTimePoints; ++i ) - { - this->m_vvLinearVelocity[i].push_back(vDummy); - this->m_vvAngularVelocity[i].push_back(vDummy); - } - - } - +// initializing methods + void add (const MathVector& ellipticAxis, const MathVector& center, const number theta, number density); void add_moving(const MathVector& ellipticAxis, const MathVector& center, const number theta, number density, - const MathVector& linearVel, const MathVector& angularVel) - { - // A. set given values: - this->m_vCenter.push_back(center); - m_vEllipticAxis.push_back(ellipticAxis); - m_vTheta.push_back(theta); - - this->m_vDensity.push_back(density); - std::vector dummy(2,true); - this->m_vGivenVelocity.push_back(dummy); - - // B. prepare data to set ellipse velocities - // B1: resize velocity vectors for TimeSeries-Data - const size_t numTimePoints = 2; - this->m_vvLinearVelocity.resize(numTimePoints); - this->m_vvAngularVelocity.resize(numTimePoints); - - // B2: set ellipse velocities - for ( size_t i = 0; i < numTimePoints; ++i ) - { - this->m_vvLinearVelocity[i].push_back(linearVel); - this->m_vvAngularVelocity[i].push_back(angularVel); - } - } + const MathVector& linearVel, const MathVector& angularVel); - void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) - { - // update center of particle - MathVector centerNew = this->get_center(prtIndex); - VecScaleAdd(centerNew, 1.0, centerNew, deltaT, transSol); - this->set_center(centerNew, prtIndex); - - UG_LOG("in update: theta vorher: " << get_theta(prtIndex) << "\n"); - - // update theta of particle - UG_LOG("in update: thetaOld: " << get_theta(prtIndex) << "\n"); - UG_LOG("in update: radianOld: " << get_theta(prtIndex)* PI / 180.0 << "\n"); - - number radianNew = get_theta(prtIndex)* PI / 180.0 + deltaT*rotSol[0]; - number thetaNew = radianNew * 180.0 / PI; - set_theta(thetaNew, prtIndex); - - UG_LOG("in update: thetaNew: " << thetaNew << "\n"); - UG_LOG("in update: radianNew: " << radianNew << "\n"); - - UG_LOG("in update: theta nachher: " << get_theta(prtIndex) << "\n"); - - } /////////////////////////////////////////////////////////////////////////////////////// -// new setter methods +// virtual base class methods (necessary to be implemented!) /////////////////////////////////////////////////////////////////////////////////////// - - void set_elliptic_axis(MathVector ellitpicAxis, int prtIndex) - { - if ( (int)this->num_particles() < prtIndex ) - UG_THROW("EllipseProvider::set_center(): number of given particles = " - << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); - for ( size_t d = 0; d < dim; ++d ) - m_vEllipticAxis[prtIndex][d] = ellitpicAxis[d]; - } - void set_theta(number theta, int prtIndex) - { - if ( (int)this->num_particles() < prtIndex ) - UG_THROW("EllipseProvider::set_theta(): number of given particles = " - << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); - m_vTheta[prtIndex] = theta; - } - - void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename); - -/////////////////////////////////////////////////////////////////////////////////////// -// new getter methods -/////////////////////////////////////////////////////////////////////////////////////// + number get_LSvalue_byPosition(MathVector vrtPos); + number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex); + + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int PrtIndex); + bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int PrtIndex, std::vector& alphaOut); - MathVector get_elliptic_axis(int prtIndex){ return m_vEllipticAxis[prtIndex]; } - number get_elliptic_axis_x(int prtIndex){ return m_vEllipticAxis[prtIndex][0]; } - number get_elliptic_axis_y(int prtIndex){ return m_vEllipticAxis[prtIndex][1]; } - number get_theta(int prtIndex){ return m_vTheta[prtIndex]; } + bool get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex); + // Old version of 'get_LineEllipse_Intersection': + bool get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut); -/////////////////////////////////////////////////////////////////////////////////////// -// methods from base class (necessary to be implemented!) -/////////////////////////////////////////////////////////////////////////////////////// +// returns a value, which substitutes the computation of an LSvalue, i.e.: +// return value > 0, if vrtPosOut on same side as vrtPosIn (= discriminant < 0) +// return value < 0, if vrtPosOut on other side as vrtPosIn (= discriminant > 0) + number IFF_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut); - /// methods called by local_to_global_mappe: +/// methods called by class 'DiffusionInterfaceMapper': number Volume(int levIndex, size_t prtIndex); number Mass(const int levIndex, const int prtIndex, const number fluidDensity); number Mass(const int levIndex, const int prtIndex, const number volume, const number fluidDensity); number MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity); number MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity); - - // set vrtPos to origin and rotate by -theta - void rotate_vector(MathVector& vrtPos, const int prtIndex) - { - const number theta = -1.0 * get_theta(prtIndex); - const number radians = theta * PI / 180.0; - const MathVector center = this->get_center(prtIndex); - - // first move vtPos to origin: - MathVector vrtPos_move; - VecSubtract(vrtPos_move, vrtPos, center); - // buffer values in order to overwrite them: - number vrtPos_x = vrtPos_move[0]; - number vrtPos_y = vrtPos_move[1]; - - - // Rotate vrtPos by angle -theta: - vrtPos_move[0] = vrtPos_x * cos(radians) - vrtPos_y * sin(radians); - vrtPos_move[1] = vrtPos_x * sin(radians) + vrtPos_y * cos(radians); - - // now move vtPos back to center: - VecAdd(vrtPos, vrtPos_move, center); - } - // set vrtPos to center and rotate by theta - void rotate_vector_inverse(MathVector& vrtPos, const int prtIndex) - { - const number theta = 1.0 * get_theta(prtIndex); - const number radians = theta * PI / 180.0; - const MathVector center = this->get_center(prtIndex); - - // first move vtPos to origin: - MathVector vrtPos_move; - VecSubtract(vrtPos_move, vrtPos, center); - // buffer values in order to overwrite them: - number vrtPos_x = vrtPos_move[0]; - number vrtPos_y = vrtPos_move[1]; - - // Rotate vrtPos by angle theta: - vrtPos_move[0] = vrtPos_x * cos(radians) - vrtPos_y * sin(radians); - vrtPos_move[1] = vrtPos_x * sin(radians) + vrtPos_y * cos(radians); - - // now move vtPos to center: - VecAdd(vrtPos, vrtPos_move, center); - - } + void print(); + void print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, + const bool isTimedep, const number time, const char* filename); - number get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) - { - // A) get center of ellipse as reference point - const MathVector vrtPosIn = this->get_center(prtIndex); - MathVector intersectionPnt; - std::vector alphaOut; - alphaOut.resize(2,0.5); - - // B) Rotate vrtPos by angle -theta and set center of ellipse to origin: - rotate_vector(vrtPos, prtIndex); - - // C) Compute LS_value for rotated vrtPos: - number fake_LSvalue = IFF_LineEllipse_Intersection(intersectionPnt, vrtPos, vrtPosIn, prtIndex, alphaOut); - - return fake_LSvalue; - - } - - bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex) - { - // first rotate input points: - MathVector vrtPosOut_rotated = vrtPosOut; - MathVector vrtPosIn_rotated = vrtPosIn; - - rotate_vector(vrtPosOut_rotated, PrtIndex); - rotate_vector(vrtPosIn_rotated, PrtIndex); - - // returns intersection point already shifted back to real center!! - get_LineEllipse_Intersection(Intersect, vrtPosOut_rotated, vrtPosIn_rotated, PrtIndex); - - // NOW: rotate the intersection point BACK again!! - // ---> (in 'get_LineEllipse_Intersection()' Intersect mit Ellipse through origin! - rotate_vector_inverse(Intersect, PrtIndex); - - return true; - } + void update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex); - bool get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) - { - // first rotate input points: - MathVector vrtPosOut_rotated = vrtPosOut; - MathVector vrtPosIn_rotated = vrtPosIn; - - rotate_vector(vrtPosOut_rotated, PrtIndex); - rotate_vector(vrtPosIn_rotated, PrtIndex); - - // returns intersection point already shifted back to real center!! - get_LineEllipse_Intersection(Intersect, vrtPosOut_rotated, vrtPosIn_rotated, PrtIndex, alphaOut); - - // NOW: rotate the intersection point BACK again!! - // ---> (in 'get_LineEllipse_Intersection()' Intersect mit Ellipse through origin! - rotate_vector_inverse(Intersect, PrtIndex); - - return true; - } - - bool get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, - const MathVector& vrtPosIn, int PrtIndex) - { - std::vector alphaOut; alphaOut.clear(); - get_LineEllipse_Intersection(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut); - } - -// Old version of 'get_LineEllipse_Intersection': - bool get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, - const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) - { - /////////////////////////////////////////////////////////////////////////////////////// - // The parameterized equation for a line segment through the points (x1, y1) and (x2, y2) is: - // x(t) = x1 + (x2-x1)t - // y(t) = y1 + (y2-y1)t - // The following is the equation for an ellipse centered at the origin: - // (x/a)^2 + (y/b)^2 - 1 = 0 - // with a,b = elliptic axis - - // If you plug the equations for the line into the equation for the ellipse - // AND after some computations, we get a quadratic equation of the form: - // At^2 + Bt + C = 0 - // with A = ..., B = ..., C = ... ---> see below in the code;) - /////////////////////////////////////////////////////////////////////////////////////// - - number alpha; - - const number axis_x = get_elliptic_axis_x(PrtIndex); - const number axis_y = get_elliptic_axis_y(PrtIndex); - const MathVector& center = this->get_center(PrtIndex); - - // first move line by 'center'-vector, so that we can do the computations based on an ellipse with origin - MathVector vrtPosIn_move; - MathVector vrtPosOut_move; - VecSubtract(vrtPosIn_move, vrtPosIn, center); - VecSubtract(vrtPosOut_move, vrtPosOut, center); - - // lineDir = vrtPosIn_move - vrtPosOut_move; - MathVector lineDir; - VecSubtract(lineDir, vrtPosIn_move, vrtPosOut_move); - - const number a = (lineDir[0]*lineDir[0])/(axis_x*axis_x) + (lineDir[1]*lineDir[1])/(axis_y*axis_y); - const number b = 2*vrtPosOut_move[0]*lineDir[0]/(axis_x*axis_x) + 2*vrtPosOut_move[1]*lineDir[1]/(axis_y*axis_y); - const number c = (vrtPosOut_move[0]*vrtPosOut_move[0])/(axis_x*axis_x) + (vrtPosOut_move[1]*vrtPosOut_move[1])/(axis_y*axis_y) - 1.0; - - const number discriminant = b * b - 4 * a * c; - - // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: - if (discriminant < -1e-8) - UG_THROW("Value of discriminant = " << discriminant << "\n"); - - // discriminant = 0! - const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); - const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); - - if (alpha1 <= alpha2) - alpha = alpha1; - else - alpha = alpha2; - - if (alpha < 0 || (alpha - 1.0) > 1e-8) - UG_THROW( - "Error in 'get_LineCircle_Intersection()': alpha not valid; should lie between 0 and 1: " << alpha << "\n"); - - for (size_t d = 0; d < dim; ++d) - Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; - - alphaOut.clear(); - alphaOut.push_back(alpha); - alphaOut.push_back(1.0 - alpha); - - // UG_LOG("alphaOut 0 = " << alphaOut[0] << "\n"); - // UG_LOG("alphaOut 1 = " << alphaOut[1] << "\n"); - - return true; - - } - - - /* bool get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, - const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + void set_theta(number theta, int prtIndex) { - /////////////////////////////////////////////////////////////////////////////////////// - // The parameterized equation for a line segment through the points (x1, y1) and (x2, y2) is: - // x(t) = x1 + (x2-x1)t - // y(t) = y1 + (y2-y1)t - // The following is the equation for an ellipse centered at the origin: - // (x/axis_x)^2 + (y/axis_y)^2 - 1 = 0 - // with axis_x,axis_y = elliptic axis - - // If you plug the equations for the line into the equation for the ellipse - // AND after some computations, we get a quadratic equation of the form: - // at^2 + bt + c = 0 - // with a = ..., b = ..., c = ... ---> see below in the code;) - /////////////////////////////////////////////////////////////////////////////////////// - - const number axis_x = get_elliptic_axis_x(PrtIndex); - const number axis_y = get_elliptic_axis_y(PrtIndex); - const MathVector& center = this->get_center(PrtIndex); - - MathVector lineDir; - VecSubtract(lineDir, vrtPosIn, vrtPosOut); - - /////////////////////////////////////////////////////////////////////////////////////// - // Trick necessary, in order to apply computation of Intersect by unsing the above formular: - // The center needs to lie on the connecting line of vrtPosOut, vrtPosIn and Intersect! - // ==> projection of center onto lineDir necessary - /////////////////////////////////////////////////////////////////////////////////////// - - // project center onto 'lineDir' - MathVector center_project = this->get_center(PrtIndex); - number alpha_project; - - // default: project in x-direction: - size_t projCoord = 0; - size_t keepCoord = 1; - - // BUT: check the following, in order to avoid, that projected center lies 'between' vrtPosOut and vrtPosIn: - if ( vrtPosIn[keepCoord] < center_project[keepCoord] < vrtPosOut[keepCoord] ) - { - projCoord = 1; - keepCoord = 0; - } - else if ( vrtPosOut[keepCoord] < center_project[keepCoord] < vrtPosIn[keepCoord] ) - { - projCoord = 1; - keepCoord = 0; - } - - // derive alpha_project and compute center_project: - alpha_project = (vrtPosIn[keepCoord] - vrtPosOut[keepCoord])/lineDir[keepCoord]; - center_project[projCoord] = vrtPosOut[projCoord] + alpha_project * lineDir[projCoord]; - - // tag: 'equationProj': == center_project[projCoord] = center[projCoord] + deltaCoord: - number deltaCoord = center_project[projCoord] - center[projCoord]; - - // apply deltaCoord-move to vrtPosIn and vrtPosOut: - // see: 'equationProj' - MathVector vrtPosIn_move; - vrtPosIn_move[projCoord] = vrtPosIn[projCoord] + deltaCoord; - vrtPosIn_move[keepCoord] = vrtPosIn[keepCoord]; - - MathVector vrtPosOut_move; - vrtPosOut_move[projCoord] = vrtPosOut[projCoord] + deltaCoord; - vrtPosOut_move[keepCoord] = vrtPosOut[keepCoord]; - - /////////////////////////////////////////////////////////////////////////////////////// - // finally, the usual computations can start, - // using 'vrtPosOut_move', 'vrtPosIn_move' and 'center_project': - /////////////////////////////////////////////////////////////////////////////////////// - - number factor1 = axis_x*axis_y; - number factor2 = sqrt(axis_x*axis_x*vrtPosOut_move[1]*vrtPosOut_move[1] + axis_y*axis_y*vrtPosOut_move[0]*vrtPosOut_move[0]); - number factor = factor1/factor2; - - Intersect[0] = factor * vrtPosOut_move[0]; - Intersect[1] = factor * vrtPosOut_move[1]; - - // compute distances to center for all 3 points: - number dist_vrtPosOut = VecDistance(vrtPosOut_move, center_project); - number dist_Intersect = VecDistance(Intersect, center_project); - - UG_LOG("dist_Intersect = " << dist_Intersect << "\n"); - UG_LOG("dist_vrtPosOut = " << dist_vrtPosOut << "\n"); - - // if both distances of intersection points (Intersect1, Intersect2) are bigger than the distance of vrtPosOut, - // then vrtPos is inside circle: - if ( dist_Intersect > dist_vrtPosOut) - UG_THROW("get_Line_Ellipse_Intersection: should not be the case!\n"); - - for (size_t d = 0; d < dim; ++d) - alphaOut.push_back((Intersect[d] - vrtPosOut_move[d])/lineDir[d]); - - - // re-map Intersect: - for (size_t d = 0; d < dim; ++d) - Intersect[d] += center[d]; - - - // check: - if ( fabs(alphaOut[0] - alphaOut[1]) > 0.0000001) - { - UG_LOG("alphaOut[0] = " << alphaOut[0] << "\n"); - UG_LOG("alphaOut[1] = " << alphaOut[1] << "\n"); - - } - - number dist_vrtPosIn = VecDistance(vrtPosIn_move, center_project); - number dist_vrtPos_move = VecDistance(vrtPosIn_move, vrtPosOut_move); - number dist_vrtPos = VecDistance(vrtPosIn, vrtPosOut); - number lineDir_length = sqrt(VecDot(lineDir, lineDir)); - - UG_LOG("dist_vrtPosIn = " << dist_vrtPosIn << "\n"); - - - number alpha = alphaOut[0]; - - alphaOut.clear(); - alphaOut.push_back(alpha); - alphaOut.push_back(1.0 - alpha); - - UG_LOG("alphaOut 0 = " << alphaOut[0] << "\n"); - UG_LOG("alphaOut 1 = " << alphaOut[1] << "\n"); - - return true; - + if ( (int)this->num_particles() < prtIndex ) + UG_THROW("EllipseProvider::set_theta(): number of given particles = " + << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); + m_vTheta[prtIndex] = theta; } - */ - // returns a number which substitues the computation of an LSvalue, i.e.: - // return value > 0, if vrtPosOut on same side as vrtPosIn (= discriminant < 0) - // return value < 0, if vrtPosOut on other side as vrtPosIn (= discriminant > 0) - number IFF_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, - const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) - { - /////////////////////////////////////////////////////////////////////////////////////// - // The parameterized equation for a line segment through the points (x1, y1) and (x2, y2) is: - // x(t) = x1 + (x2-x1)t - // y(t) = y1 + (y2-y1)t - // The following is the equation for an ellipse centered at the origin: - // (x/axis_x)^2 + (y/axis_y)^2 - 1 = 0 - // with axis_x,axis_y = elliptic axis - - // If you plug the equations for the line into the equation for the ellipse - // AND after some computations, we get a quadratic equation of the form: - // at^2 + bt + c = 0 - // with a = ..., b = ..., c = ... ---> see below in the code;) - /////////////////////////////////////////////////////////////////////////////////////// - - const number axis_x = get_elliptic_axis_x(PrtIndex); - const number axis_y = get_elliptic_axis_y(PrtIndex); - const MathVector& center = this->get_center(PrtIndex); - - // first move line by 'center'-vector, so that we can do the computations based on an ellipse with origin - MathVector vrtPosIn_move; - MathVector vrtPosOut_move; - MathVector center_move; - VecSubtract(vrtPosIn_move, vrtPosIn, center); - VecSubtract(vrtPosOut_move, vrtPosOut, center); - VecSubtract(center_move, center, center); - number factor1 = axis_x*axis_y; - number factor2 = sqrt(axis_x*axis_x*vrtPosOut_move[1]*vrtPosOut_move[1] + axis_y*axis_y*vrtPosOut_move[0]*vrtPosOut_move[0]); - number factor = factor1/factor2; - - Intersect[0] = factor * vrtPosOut_move[0]; - Intersect[1] = factor * vrtPosOut_move[1]; - - // compute distances to center for all 3 points: - number dist_vrtPosOut = VecDistance(vrtPosOut_move, center_move); - number dist_Intersect = VecDistance(Intersect, center_move); - - // first check, that 'Intersect' does not lie ON the interface - // ---> case relevant for check in 'CollectCorners_FlatTop_2d() - // ---> see 'interface_handler_particle_tools.h:CollectCorners_FlatTop_2d(): - /* - // check for correct inersectionPnt - if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) - */ - - if ( fabs(dist_Intersect - dist_vrtPosOut) < 1e-6) - return 0.0; + number get_theta(int prtIndex){ return m_vTheta[prtIndex]; } - // if both distances of intersection points (Intersect1, Intersect2) are bigger than the distance of vrtPosOut, - // then vrtPos is inside circle: - if ( dist_Intersect > dist_vrtPosOut) - { - return 0.001; - } +/////////////////////////////////////////////////////////////////////////////////////// +// new getter methods +/////////////////////////////////////////////////////////////////////////////////////// - return -0.001; - - } + MathVector get_elliptic_axis(int prtIndex){ return m_vEllipticAxis[prtIndex]; } + number get_elliptic_axis_x(int prtIndex){ return m_vEllipticAxis[prtIndex][0]; } + number get_elliptic_axis_y(int prtIndex){ return m_vEllipticAxis[prtIndex][1]; } - number IFF_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, - const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) + void set_elliptic_axis(MathVector ellitpicAxis, int prtIndex) { - if ( (int)this->num_particles() > 1 ) - UG_THROW("get_LineCircle_Intersection(): number of given particles = " << this->num_particles() << " more than 1! ... not supposed to be!\n"); - - //if ( dim == 3 ) UG_THROW("in 'get_LineCircle_Intersection()': not implemented for 3d case!\n"); - - /////////////////////////////////////////////////////////////////////////////////////// - // - // 'vrtPosOut':= the starting point of the ray, - // 'vrtPosIn' := the end point of the ray, - // 'center' := the center of sphere you're testing against - // 'radius' := the radius of that sphere - // 'lineDir' := direction vector of ray from start to end - // 'rayDir' := direction vector of ray from center to start - // - // Ansatz: - // (1) Intersect = vrtPosOut + alpha*lineDir - // (2) Intersect - center = radius - // - // => (1) Intersect[0] = vrtPosOut[0] + alpha*lineDir[0] - // Intersect[1] = vrtPosOut[1] + alpha*lineDir[1] - // => (2) (Intersect[0] - center[0])^2 + (Intersect[1] - center[1])^2 = radius^2 - // - // Plug (1) into (2) => ... => quadratic equation for alpha: - // - // alpha^2 * + alpha * 2* + ( -radius^2 ) = 0 - // - // -> a = , b = , c = - radius^2 - // - // - // => from (1): Intersect = vrtPosOut + alpha*(vrtPosIn - vrtPosOut) - /////////////////////////////////////////////////////////////////////////////////////// - - number alpha; - - const number radius = 0.125; - - UG_THROW("in ParticleProviderEllipse::IFF_LineCircle_Intersection: be careful! The radius here is HARD CODED, since an ellipse has no radius.\n"); - const MathVector& center = this->get_center(PrtIndex); - - MathVector lineDir; - MathVector rayDir; - - // lineDir = vrtPosIn - vrtPosOut; - VecSubtract(lineDir, vrtPosIn, vrtPosOut); - // rayDir = vrtPosOut - center; - VecSubtract(rayDir, vrtPosOut, center); - - const number a = VecDot(lineDir, lineDir); - const number b = 2.0 * VecDot(lineDir, rayDir); - const number c = VecDot(vrtPosOut, vrtPosOut) + VecDot(center, center) - - 2 * VecDot(vrtPosOut, center) - radius * radius; - - const number discriminant = b * b - 4 * a * c; - - // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: - if (discriminant < -1e-8) - { - UG_LOG("IFF_Line_Ellipse_Intersection: Value of discriminant = " << discriminant << "\n"); - return 0.001; - } - // discriminant = 0! - const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); - const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); - - if (alpha1 <= alpha2) - alpha = alpha1; - else - alpha = alpha2; - - // if alpha < 0, both vrt are inside: - if (alpha < 0 || (alpha - 1.0) > 1e-8) - { - UG_LOG("IFF_Line_Ellipse_Intersection: alpha < 0: " << alpha << "\n"); - return 0.001; - } - - for (size_t d = 0; d < dim; ++d) - Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; - - alphaOut.clear(); - alphaOut.push_back(alpha); - alphaOut.push_back(1.0 - alpha); - - // UG_LOG("alphaOut 0 = " << alphaOut[0] << "\n"); - // UG_LOG("alphaOut 1 = " << alphaOut[1] << "\n"); - - return -0.001; + if ( (int)this->num_particles() < prtIndex ) + UG_THROW("EllipseProvider::set_center(): number of given particles = " + << this->num_particles() << " smaller than given prtIndex = " << prtIndex << "\n"); + for ( size_t d = 0; d < dim; ++d ) + m_vEllipticAxis[prtIndex][d] = ellitpicAxis[d]; } + /////////////////////////////////////////////////////////////////////////////////////// +// new methods /////////////////////////////////////////////////////////////////////////////////////// +// set vrtPos to origin and rotate by -theta + void rotate_vector(MathVector& vrtPos, const int prtIndex); + void rotate_vector_inverse(MathVector& vrtPos, const int prtIndex); + +/////////////////////////////////////////////////////////////////////////////////////// +// class member +/////////////////////////////////////////////////////////////////////////////////////// - void print() - { - UG_LOG(" +++++++++++++++++++++++++ ParticleProviderEllipse Info ++++++++++++++++++++++++++++++ \n"); - UG_LOG("+++ num_particles = " << this->num_particles() << "\n"); - for (size_t p = 0; p < this->num_particles(); ++p) - { - UG_LOG("+++ center = " << this->get_center(p) << "\n"); - UG_LOG("+++ density = " << this->get_density(p) << "\n"); - UG_LOG("+++ theta = " << get_theta(p) << "\n"); - UG_LOG("+++ elliptic_axis_x = " << get_elliptic_axis_x(p) << "\n"); - UG_LOG("+++ elliptic_axis_y = " << get_elliptic_axis_y(p) << "\n"); - - if ( this->get_DoF_modus_linear(p) ) - {UG_LOG("+++ linear velocity set to: " << this->get_linear_velocity(p, 0) << "\n\n");} - else - {UG_LOG("+++ linear velocity FREE and set to: " << this->get_linear_velocity(p, 0) << "\n\n");} - if ( this->get_DoF_modus_angular(p) ) - {UG_LOG("+++ angular velocity set to: " << this->get_angular_velocity(p, 0) << "\n\n");} - else - {UG_LOG("+++ lineangularar velocity FREE and set to: " << this->get_angular_velocity(p, 0) << "\n\n");} - - } - UG_LOG(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); - } - protected: std::vector > m_vEllipticAxis; std::vector m_vTheta; diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_ellipse_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_ellipse_impl.h index 0da455669..b10d314a3 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_ellipse_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_ellipse_impl.h @@ -10,7 +10,405 @@ namespace ug{ - + +template +void ParticleProviderEllipse:: +add(const MathVector& ellipticAxis, const MathVector& center, const number theta, number density) +{ + // A. set given values: + this->m_vCenter.push_back(center); + m_vEllipticAxis.push_back(ellipticAxis); + m_vTheta.push_back(theta); + + this->m_vDensity.push_back(density); + std::vector bDummy(2,false); + this->m_vGivenVelocity.push_back(bDummy); + + // B. prepare data for free ellipse velocities, to be computed + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + this->m_vvLinearVelocity.resize(numTimePoints); + this->m_vvAngularVelocity.resize(numTimePoints); + + // B2: set dummy values if velocity of ellipse is free within fluid + const MathVector vDummy(0.0); + + for ( size_t i = 0; i < numTimePoints; ++i ) + { + this->m_vvLinearVelocity[i].push_back(vDummy); + this->m_vvAngularVelocity[i].push_back(vDummy); + } + +} + +template +void ParticleProviderEllipse:: +add_moving(const MathVector& ellipticAxis, const MathVector& center, const number theta, number density, + const MathVector& linearVel, const MathVector& angularVel) +{ + // A. set given values: + this->m_vCenter.push_back(center); + m_vEllipticAxis.push_back(ellipticAxis); + m_vTheta.push_back(theta); + + this->m_vDensity.push_back(density); + std::vector dummy(2,true); + this->m_vGivenVelocity.push_back(dummy); + + // B. prepare data to set ellipse velocities + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + this->m_vvLinearVelocity.resize(numTimePoints); + this->m_vvAngularVelocity.resize(numTimePoints); + + // B2: set ellipse velocities + for ( size_t i = 0; i < numTimePoints; ++i ) + { + this->m_vvLinearVelocity[i].push_back(linearVel); + this->m_vvAngularVelocity[i].push_back(angularVel); + } +} + + +// set vrtPos to origin and rotate by -theta +template +void ParticleProviderEllipse:: +rotate_vector(MathVector& vrtPos, const int prtIndex) +{ + const number theta = -1.0 * get_theta(prtIndex); + const number radians = theta * PI / 180.0; + const MathVector center = this->get_center(prtIndex); + +// first move vtPos to origin: + MathVector vrtPos_move; + VecSubtract(vrtPos_move, vrtPos, center); +// buffer values in order to overwrite them: + number vrtPos_x = vrtPos_move[0]; + number vrtPos_y = vrtPos_move[1]; + +// Rotate vrtPos by angle -theta: + vrtPos_move[0] = vrtPos_x * cos(radians) - vrtPos_y * sin(radians); + vrtPos_move[1] = vrtPos_x * sin(radians) + vrtPos_y * cos(radians); + +// now move vtPos back to center: + VecAdd(vrtPos, vrtPos_move, center); +} + +// set vrtPos to center and rotate by theta +template +void ParticleProviderEllipse:: +rotate_vector_inverse(MathVector& vrtPos, const int prtIndex) +{ + const number theta = 1.0 * get_theta(prtIndex); + const number radians = theta * PI / 180.0; + const MathVector center = this->get_center(prtIndex); + +// first move vtPos to origin: + MathVector vrtPos_move; + VecSubtract(vrtPos_move, vrtPos, center); +// buffer values in order to overwrite them: + number vrtPos_x = vrtPos_move[0]; + number vrtPos_y = vrtPos_move[1]; + +// Rotate vrtPos by angle theta: + vrtPos_move[0] = vrtPos_x * cos(radians) - vrtPos_y * sin(radians); + vrtPos_move[1] = vrtPos_x * sin(radians) + vrtPos_y * cos(radians); + +// now move vtPos to center: + VecAdd(vrtPos, vrtPos_move, center); + +} + + +template +void ParticleProviderEllipse:: +update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) +{ + // update center of particle + MathVector centerNew = this->get_center(prtIndex); + VecScaleAdd(centerNew, 1.0, centerNew, deltaT, transSol); + this->set_center(centerNew, prtIndex); + + // update theta of particle + number radianNew = get_theta(prtIndex)* PI / 180.0 + deltaT*rotSol[0]; + number thetaNew = radianNew * 180.0 / PI; + set_theta(thetaNew, prtIndex); + +} + +template +number ParticleProviderEllipse:: +get_LSvalue_byPosition(MathVector vrtPos) +{ + const int prtIndex = this->get_prtIndex(); + if ( prtIndex == -1 ) + UG_THROW("in 'ParticleProviderEllipse:get_LSvalue_byPosition(vrtPos)': call of get_LSvalue_byPosition() with prtIndex = " + << prtIndex << " not allowed!\n"); + + return get_LSvalue_byPosition(vrtPos, prtIndex); + +} + +template +number ParticleProviderEllipse:: +get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) +{ + if ( prtIndex == -1 ) + UG_THROW("in 'ParticleProviderEllipse:get_LSvalue_byPosition()': call of get_LSvalue_byPosition() with prtIndex = " + << prtIndex << " not allowed!\n"); +// A) get center of ellipse as reference point + const MathVector vrtPosIn = this->get_center(prtIndex); + MathVector intersectionPnt; + std::vector alphaOut; + alphaOut.resize(2,0.5); + +// B) Rotate vrtPos by angle -theta and set center of ellipse to origin: + rotate_vector(vrtPos, prtIndex); + +// C) Compute LS_value for rotated vrtPos: + number fake_LSvalue = IFF_LineEllipse_Intersection(intersectionPnt, vrtPos, vrtPosIn, prtIndex, alphaOut); + + return fake_LSvalue; + +} + +template +bool ParticleProviderEllipse:: +get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int PrtIndex) +{ +// first rotate input points: + MathVector vrtPosOut_rotated = vrtPosOut; + MathVector vrtPosIn_rotated = vrtPosIn; + + rotate_vector(vrtPosOut_rotated, PrtIndex); + rotate_vector(vrtPosIn_rotated, PrtIndex); + +// returns intersection point already shifted back to real center!! + get_LineEllipse_Intersection(Intersect, vrtPosOut_rotated, vrtPosIn_rotated, PrtIndex); + +// NOW: rotate the intersection point BACK again!! +// ---> (in 'get_LineEllipse_Intersection()' Intersect mit Ellipse through origin! + rotate_vector_inverse(Intersect, PrtIndex); + + return true; +} + + +template +bool ParticleProviderEllipse:: +get_intersection_point(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, const int PrtIndex, std::vector& alphaOut) +{ +// first rotate input points: + MathVector vrtPosOut_rotated = vrtPosOut; + MathVector vrtPosIn_rotated = vrtPosIn; + + rotate_vector(vrtPosOut_rotated, PrtIndex); + rotate_vector(vrtPosIn_rotated, PrtIndex); + + // returns intersection point already shifted back to real center!! + get_LineEllipse_Intersection(Intersect, vrtPosOut_rotated, vrtPosIn_rotated, PrtIndex, alphaOut); + + // NOW: rotate the intersection point BACK again!! + // ---> (in 'get_LineEllipse_Intersection()' Intersect mit Ellipse through origin! + rotate_vector_inverse(Intersect, PrtIndex); + + return true; +} + +template +bool ParticleProviderEllipse:: +get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex) +{ + std::vector alphaOut; + alphaOut.clear(); + + return get_LineEllipse_Intersection(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut); +} + +// Old version of 'get_LineEllipse_Intersection': +template +bool ParticleProviderEllipse:: +get_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) +{ + /////////////////////////////////////////////////////////////////////////////////////// + // The parameterized equation for a line segment through the points (x1, y1) and (x2, y2) is: + // x(t) = x1 + (x2-x1)t + // y(t) = y1 + (y2-y1)t + // The following is the equation for an ellipse centered at the origin: + // (x/a)^2 + (y/b)^2 - 1 = 0 + // with a,b = elliptic axis + + // If you plug the equations for the line into the equation for the ellipse + // AND after some computations, we get a quadratic equation of the form: + // At^2 + Bt + C = 0 + // with A = ..., B = ..., C = ... ---> see below in the code;) + /////////////////////////////////////////////////////////////////////////////////////// + + number alpha; + + const number axis_x = get_elliptic_axis_x(PrtIndex); + const number axis_y = get_elliptic_axis_y(PrtIndex); + const MathVector& center = this->get_center(PrtIndex); + + // first move line by 'center'-vector, so that we can do the computations based on an ellipse with origin + MathVector vrtPosIn_move; + MathVector vrtPosOut_move; + VecSubtract(vrtPosIn_move, vrtPosIn, center); + VecSubtract(vrtPosOut_move, vrtPosOut, center); + + // lineDir = vrtPosIn_move - vrtPosOut_move; + MathVector lineDir; + VecSubtract(lineDir, vrtPosIn_move, vrtPosOut_move); + + const number a = (lineDir[0]*lineDir[0])/(axis_x*axis_x) + (lineDir[1]*lineDir[1])/(axis_y*axis_y); + const number b = 2*vrtPosOut_move[0]*lineDir[0]/(axis_x*axis_x) + 2*vrtPosOut_move[1]*lineDir[1]/(axis_y*axis_y); + const number c = (vrtPosOut_move[0]*vrtPosOut_move[0])/(axis_x*axis_x) + (vrtPosOut_move[1]*vrtPosOut_move[1])/(axis_y*axis_y) - 1.0; + + const number discriminant = b * b - 4 * a * c; + + // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: + if (discriminant < -1e-8) + UG_THROW("Value of discriminant = " << discriminant << "\n"); + + // discriminant = 0! + const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); + const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); + + if (alpha1 <= alpha2) + alpha = alpha1; + else + alpha = alpha2; + + if (alpha < 0 || (alpha - 1.0) > 1e-8) + UG_THROW( + "Error in 'get_LineCircle_Intersection()': alpha not valid; should lie between 0 and 1: " << alpha << "\n"); + + for (size_t d = 0; d < dim; ++d) + Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; + + alphaOut.clear(); + alphaOut.push_back(alpha); + alphaOut.push_back(1.0 - alpha); + + return true; + +} + + + +// returns a value, which substitues the computation of an LSvalue, i.e.: +// return value > 0, if vrtPosOut on same side as vrtPosIn (= discriminant < 0) +// return value < 0, if vrtPosOut on other side as vrtPosIn (= discriminant > 0) +template +number ParticleProviderEllipse:: +IFF_LineEllipse_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex, std::vector& alphaOut) +{ + /////////////////////////////////////////////////////////////////////////////////////// + // The parameterized equation for a line segment through the points (x1, y1) and (x2, y2) is: + // x(t) = x1 + (x2-x1)t + // y(t) = y1 + (y2-y1)t + // The following is the equation for an ellipse centered at the origin: + // (x/axis_x)^2 + (y/axis_y)^2 - 1 = 0 + // with axis_x,axis_y = elliptic axis + + // If you plug the equations for the line into the equation for the ellipse + // AND after some computations, we get a quadratic equation of the form: + // at^2 + bt + c = 0 + // with a = ..., b = ..., c = ... ---> see below in the code;) + /////////////////////////////////////////////////////////////////////////////////////// + + const number axis_x = get_elliptic_axis_x(PrtIndex); + const number axis_y = get_elliptic_axis_y(PrtIndex); + const MathVector& center = this->get_center(PrtIndex); + + // first move line by 'center'-vector, so that we can do the computations based on an ellipse with origin + MathVector vrtPosIn_move; + MathVector vrtPosOut_move; + MathVector center_move; + VecSubtract(vrtPosIn_move, vrtPosIn, center); + VecSubtract(vrtPosOut_move, vrtPosOut, center); + VecSubtract(center_move, center, center); + + number factor1 = axis_x*axis_y; + number factor2 = sqrt(axis_x*axis_x*vrtPosOut_move[1]*vrtPosOut_move[1] + axis_y*axis_y*vrtPosOut_move[0]*vrtPosOut_move[0]); + number factor = factor1/factor2; + + Intersect[0] = factor * vrtPosOut_move[0]; + Intersect[1] = factor * vrtPosOut_move[1]; + + // compute distances to center for all 3 points: + number dist_vrtPosOut = VecDistance(vrtPosOut_move, center_move); + number dist_Intersect = VecDistance(Intersect, center_move); + + // first check, that 'Intersect' does not lie ON the interface + // ---> case relevant for check in 'CollectCorners_FlatTop_2d() + // ---> see 'interface_handler_particle_tools.h:CollectCorners_FlatTop_2d(): + /* + // check for correct inersectionPnt + if ( fabs(get_LSvalue_byPosition(intersectionPnt)) > 1e-6 ) + */ + + const number threshold_max = -1e+6; + if ( dist_Intersect < dist_vrtPosOut) + return -1e+6; + + + number dist1 = fabs(dist_Intersect - dist_vrtPosOut); + number dist__ = VecDistance(vrtPosOut_move, Intersect); + + if ( fabs(dist1 - dist__) > 1e-6) + UG_THROW("ohoh...in IFF_()\n"); + + if ( fabs(dist__ - 0.001) < 1e-6) + UG_LOG("stop! IFF_()\n"); + + return dist__; + + + + + + if ( fabs(dist_Intersect - dist_vrtPosOut) < 1e-6) + return 0.0; + + if ( dist_Intersect > dist_vrtPosOut) + { + return -threshold_max; + } + + return threshold_max; + +} + + +template +void ParticleProviderEllipse:: +print() +{ + UG_LOG(" +++++++++++++++++++++++++ ParticleProviderEllipse Info ++++++++++++++++++++++++++++++ \n"); + UG_LOG("+++ num_particles = " << this->num_particles() << "\n"); + for (size_t p = 0; p < this->num_particles(); ++p) + { + UG_LOG(" +++++++++++++++++++++++++ particle " << p << " ++++++++++++++++++++++++++++++ \n\n"); + + UG_LOG("+++ center = " << this->get_center(p) << "\n"); + UG_LOG("+++ density = " << this->get_density(p) << "\n"); + UG_LOG("+++ theta = " << get_theta(p) << "\n"); + UG_LOG("+++ elliptic_axis_x = " << get_elliptic_axis_x(p) << "\n"); + UG_LOG("+++ elliptic_axis_y = " << get_elliptic_axis_y(p) << "\n\n"); + + UG_LOG("+++ linear velocity: " << this->get_linear_velocity(p, 0) << "\n"); + UG_LOG("+++ angular velocity: " << this->get_angular_velocity(p, 0) << "\n\n"); + + } + UG_LOG(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); +} + template void ParticleProviderEllipse:: print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) @@ -59,8 +457,6 @@ Volume(int levIndex, size_t prtIndex) UG_THROW("in 'ParticleProviderEllipse::Volume()': 3d-case (i.e. axis_z) not implemented!\n"); //volume = 4.0/3.0*3.1415*axis_x*axis_y*axis_z; - UG_LOG("Volume: " << volume << "\n"); - return volume; } diff --git a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_sphere_impl.h b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_sphere_impl.h index b348866f3..b8996abc0 100644 --- a/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_sphere_impl.h +++ b/ugbase/lib_disc/spatial_disc/immersed_util/interface_provider/interface_provider_particle_sphere_impl.h @@ -13,63 +13,113 @@ namespace ug{ template void ParticleProviderSphere:: -print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, const bool isTimedep, const number time, const char* filename) +add(number radius, const MathVector& center, number density) { - MathVector center = this->get_center(prtIndex); + // A. set given values: + this->m_vCenter.push_back(center); + m_vRadius.push_back(radius); + this->m_vDensity.push_back(density); + std::vector bDummy(2,false); + this->m_vGivenVelocity.push_back(bDummy); + + // B. prepare data for free particle velocities, to be computed + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + this->m_vvLinearVelocity.resize(numTimePoints); + this->m_vvAngularVelocity.resize(numTimePoints); + + // B2: set dummy values if velocity of particle is free within fluid + const MathVector vDummy(0.0); + for ( size_t i = 0; i < numTimePoints; ++i ) + { + this->m_vvLinearVelocity[i].push_back(vDummy); + this->m_vvAngularVelocity[i].push_back(vDummy); + } + +} + +template +void ParticleProviderSphere:: +add_moving(number radius, const MathVector& center, number density, + const MathVector& linearVel, const MathVector& angularVel) +{ + // A. set given values: + this->m_vCenter.push_back(center); + m_vRadius.push_back(radius); + this->m_vDensity.push_back(density); + std::vector dummy(2,true); + this->m_vGivenVelocity.push_back(dummy); + + // B. prepare data to set particle velocities + // B1: resize velocity vectors for TimeSeries-Data + const size_t numTimePoints = 2; + this->m_vvLinearVelocity.resize(numTimePoints); + this->m_vvAngularVelocity.resize(numTimePoints); + + // B2: set particle velocities + for ( size_t i = 0; i < numTimePoints; ++i ) + { + this->m_vvLinearVelocity[i].push_back(linearVel); + this->m_vvAngularVelocity[i].push_back(angularVel); + } +} + +template +number ParticleProviderSphere:: +get_LSvalue_byPosition(MathVector vrtPos) +{ + const int prtIndex = this->get_prtIndex(); + if ( prtIndex == -1 ) + UG_THROW("in 'ParticleProviderSphere:get_LSvalue_byPosition(vrtPos)': call of get_LSvalue_byPosition() with prtIndex = " + << prtIndex << " not allowed!\n"); + + return get_LSvalue_byPosition(vrtPos, prtIndex); +} + +template +number ParticleProviderSphere:: +get_LSvalue_byPosition(MathVector vrtPos, const int prtIndex) +{ + if ( prtIndex == -1 ) + UG_THROW("in 'ParticleProviderSphere:get_LSvalue_byPosition(vrtPos, prtIndex)': call of get_LSvalue_byPosition() with prtIndex = " + << prtIndex << " not allowed!\n"); + const number radius = get_radius(prtIndex); + const MathVector& center = this->get_center(prtIndex); + + MathVector localCoords; + VecSubtract(localCoords, vrtPos, center); - number f1 = 0.0; - number gravity = -9.81; - if ( !isTimedep ) - f1 = transSol[0]*4.0/(radius*radius*gravity); - - std::string name(filename); - - char * cstr = new char [name.size()+1]; - strcpy (cstr, name.c_str()); - - if ( !isTimedep ) - { - FILE* print_velocity = fopen(name.c_str(), "a"); - fprintf(print_velocity,"%e \t %e \t ",radius, f1); - for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t %e \t ", transSol[d], rotSol[d]); - for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t ", center[d]); - fprintf(print_velocity," # radius, f1, transVel[0], rotVel[0], transVel[1], rotVel[1], center_coords, (m_bSharedIP = "); - fprintf(print_velocity, "0 ) \n "); - fclose(print_velocity); - } - else - { - FILE* print_velocity = fopen(name.c_str(), "a"); - fprintf(print_velocity,"%e \t ",time); - for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t %e \t ", transSol[d], rotSol[d]); - for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t ", center[d]); - fprintf(print_velocity," # time, transVel[0], rotVel[0], transVel[1], rotVel[1], center_coords[0], center[1]"); - fprintf(print_velocity, " \n "); - fclose(print_velocity); - } + number dist = VecDot(localCoords, localCoords); + dist = sqrt(dist); + return radius - dist; + +} + +template +void ParticleProviderSphere:: +update(number deltaT, const MathVector transSol, const MathVector rotSol, const int prtIndex) +{ + MathVector centerNew = this->get_center(prtIndex); + VecScaleAdd(centerNew, 1.0, centerNew, deltaT, transSol); + this->set_center(centerNew, prtIndex); } + + template number ParticleProviderSphere:: Volume(int levIndex, size_t prtIndex) { const number radius = get_radius(prtIndex); - number volume; - - /* if ( m_bVolNumeric ){ - volume = compute_volume(Index, prtIndex); - } - else - {*/ + number volume = 0.0; + if ( dim == 2 ) volume = 3.1415*radius*radius; if ( dim == 3 ) volume = 4.0/3.0*3.1415*radius*radius*radius; - // } - UG_LOG("Volume: " << volume << "\n"); - + return volume; } @@ -99,7 +149,7 @@ number ParticleProviderSphere:: MomOfInertia(const int levIndex, const int prtIndex, const number fluidDensity) { const number radius = get_radius(prtIndex); - number momOfInertia; + number momOfInertia = 0.0; if ( dim == 2 ) momOfInertia = 0.5*radius*radius*Mass(levIndex, prtIndex, fluidDensity); if ( dim == 3 ) momOfInertia = 0.4*radius*radius*Mass(levIndex, prtIndex, fluidDensity); @@ -112,7 +162,7 @@ number ParticleProviderSphere:: MomOfInertia(const int levIndex, const int prtIndex, const number volume, const number fluidDensity) { const number radius = get_radius(prtIndex); - number momOfInertia; + number momOfInertia = 0.0; if ( dim == 2 ) momOfInertia = 0.5*radius*radius*Mass(levIndex, prtIndex, volume, fluidDensity); if ( dim == 3 ) momOfInertia = 0.4*radius*radius*Mass(levIndex, prtIndex, volume, fluidDensity); @@ -120,7 +170,161 @@ MomOfInertia(const int levIndex, const int prtIndex, const number volume, const return momOfInertia; } + +template +bool ParticleProviderSphere:: +get_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int PrtIndex) +{ + std::vector alphaOut; + alphaOut.clear(); + + return get_LineCircle_Intersection(Intersect, vrtPosOut, vrtPosIn, PrtIndex, alphaOut); +} + +template +bool ParticleProviderSphere:: +get_LineCircle_Intersection(MathVector& Intersect, const MathVector& vrtPosOut, + const MathVector& vrtPosIn, int prtIndex, std::vector& alphaOut) +{ + + /////////////////////////////////////////////////////////////////////////////////////// + // + // 'vrtPosOut':= the starting point of the ray, + // 'vrtPosIn' := the end point of the ray, + // 'center' := the center of sphere you're testing against + // 'radius' := the radius of that sphere + // 'lineDir' := direction vector of ray from start to end + // 'rayDir' := direction vector of ray from center to start + // + // Ansatz: + // (1) Intersect = vrtPosOut + alpha*lineDir + // (2) Intersect - center = radius + // + // => (1) Intersect[0] = vrtPosOut[0] + alpha*lineDir[0] + // Intersect[1] = vrtPosOut[1] + alpha*lineDir[1] + // => (2) (Intersect[0] - center[0])^2 + (Intersect[1] - center[1])^2 = radius^2 + // + // Plug (1) into (2) => ... => quadratic equation for alpha: + // + // alpha^2 * + alpha * 2* + ( -radius^2 ) = 0 + // + // -> a = , b = , c = - radius^2 + // + // + // => from (1): Intersect = vrtPosOut + alpha*(vrtPosIn - vrtPosOut) + /////////////////////////////////////////////////////////////////////////////////////// + + number alpha; + + const number radius = get_radius(prtIndex); + const MathVector& center = this->get_center(prtIndex); + + MathVector lineDir; + MathVector rayDir; + + // lineDir = vrtPosIn - vrtPosOut; + VecSubtract(lineDir, vrtPosIn, vrtPosOut); + // rayDir = vrtPosOut - center; + VecSubtract(rayDir, vrtPosOut, center); + + const number a = VecDot(lineDir, lineDir); + const number b = 2.0 * VecDot(lineDir, rayDir); + const number c = VecDot(vrtPosOut, vrtPosOut) + VecDot(center, center) + - 2 * VecDot(vrtPosOut, center) - radius * radius; + + const number discriminant = b * b - 4 * a * c; + + // check that 'vrtPosOut' and 'vrtPosIn' really lie on different sides of the circle: + if (discriminant < -1e-8) + UG_THROW("Value of discriminant = " << discriminant << "\n"); + + // discriminant = 0! + const number alpha1 = (-b - sqrt(discriminant)) / (2.0 * a); + const number alpha2 = (-b + sqrt(discriminant)) / (2.0 * a); + + if (alpha1 <= alpha2) + alpha = alpha1; + else + alpha = alpha2; + + if (alpha < 0 || (alpha - 1.0) > 1e-8) + UG_THROW("Error in 'get_LineCircle_Intersection()': alpha not valid;" + "should lie between 0 and 1: " << alpha << "\n"); + + for (size_t d = 0; d < dim; ++d) + Intersect[d] = vrtPosOut[d] + alpha * lineDir[d]; + + alphaOut.clear(); + alphaOut.push_back(alpha); + alphaOut.push_back(1.0 - alpha); + + return true; +} + + +template +void ParticleProviderSphere:: +print() +{ + UG_LOG(" +++++++++++++++++++++++++ ParticleProviderSphere Info ++++++++++++++++++++++++++++++ \n"); + UG_LOG("+++ num_particles = " << this->num_particles() << "\n"); + for (size_t p = 0; p < this->num_particles(); ++p) + { + UG_LOG(" +++++++++++++++++++++++++ particle " << p << " ++++++++++++++++++++++++++++++ \n\n"); + UG_LOG("+++ center = " << this->get_center(p) << "\n"); + UG_LOG("+++ density = " << this->get_density(p) << "\n"); + UG_LOG("+++ radius = " << get_radius(p) << "\n\n"); + + UG_LOG("+++ linear velocity: " << this->get_linear_velocity(p, 0) << "\n"); + UG_LOG("+++ angular velocity: " << this->get_angular_velocity(p, 0) << "\n\n"); + + } + UG_LOG(" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); +} + +template +void ParticleProviderSphere:: +print_velocity(const MathVector& transSol, const MathVector& rotSol, const int prtIndex, + const bool isTimedep, const number time, const char* filename) +{ + MathVector center = this->get_center(prtIndex); + const number radius = get_radius(prtIndex); + + number f1 = 0.0; + number gravity = -9.81; + if ( !isTimedep ) + f1 = transSol[0]*4.0/(radius*radius*gravity); + + std::string name(filename); + + char * cstr = new char [name.size()+1]; + strcpy (cstr, name.c_str()); + + if ( !isTimedep ) + { + FILE* print_velocity = fopen(name.c_str(), "a"); + fprintf(print_velocity,"%e \t %e \t ",radius, f1); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t %e \t ", transSol[d], rotSol[d]); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t ", center[d]); + fprintf(print_velocity," # radius, f1, transVel[0], rotVel[0], transVel[1], rotVel[1], center_coords, (m_bSharedIP = "); + fprintf(print_velocity, "0 ) \n "); + fclose(print_velocity); + } + else + { + FILE* print_velocity = fopen(name.c_str(), "a"); + fprintf(print_velocity,"%e \t ",time); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t %e \t ", transSol[d], rotSol[d]); + for ( int d = 0; d < dim; ++d ) fprintf(print_velocity,"%e \t ", center[d]); + fprintf(print_velocity," # time, transVel[0], rotVel[0], transVel[1], rotVel[1], center_coords[0], center[1]"); + fprintf(print_velocity, " \n "); + fclose(print_velocity); + } + +} + } // end namespace ug

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 MrKYP|rfeDdf8JKXVgLXD literal 0 HcmV?d00001 diff --git a/scripts/shell/clusterdetect b/scripts/shell/clusterdetect index 562046e52..5b313db16 100755 --- a/scripts/shell/clusterdetect +++ b/scripts/shell/clusterdetect @@ -5,29 +5,33 @@ if [ -z "$UGSUBMIT_TYPE" ]; then - if [ $HOSTNAME == "cekon.gcsc.uni-frankfurt.de" ]; then + if [ "$HOSTNAME" = "cekon.gcsc.uni-frankfurt.de" ]; then UGSUBMIT_TYPE=cekon - elif [ $HOSTNAME == "cesari.gcsc.uni-frankfurt.de" ]; then + elif [ "$HOSTNAME" = "cesari.gcsc.uni-frankfurt.de" ]; then UGSUBMIT_TYPE=cesari - elif [[ "$HOSTNAME" == "juqueen"* ]]; then + elif [[ "$HOSTNAME" = "juqueen"* ]]; then UGSUBMIT_TYPE=Juqueen - elif [[ "$HOSTNAME" == "jrl"* ]]; then + elif [[ "$HOSTNAME" = "jrl"* ]]; then UGSUBMIT_TYPE=Jureca - elif [[ "$HOSTNAME" == "dora"* ]]; then + elif [[ "$HOSTNAME" = "juwels"* ]]; then + UGSUBMIT_TYPE=Juwels + elif [[ "$HOSTNAME" = "sdlogin"* ]]; then + UGSUBMIT_TYPE=SDCluster + elif [[ "$HOSTNAME" = "dora"* ]]; then UGSUBMIT_TYPE=DoraCSCS - elif [[ "$HOSTNAME" == "eslogin"* ]]; then - if [ "$SITE_PLATFORM_NAME" == "hornet" ]; then + elif [[ "$HOSTNAME" = "eslogin"* ]]; then + if [ "$SITE_PLATFORM_NAME" = "hornet" ]; then UGSUBMIT_TYPE=Hornet - elif [ "$SITE_PLATFORM_NAME" == "hazelhen" ]; then + elif [ "$SITE_PLATFORM_NAME" = "hazelhen" ]; then UGSUBMIT_TYPE=Hazelhen - elif [ "$SITE_PLATFORM_NAME" == "hermit" ]; then + elif [ "$SITE_PLATFORM_NAME" = "hermit" ]; then UGSUBMIT_TYPE=Hermit else echo "WARNING: couldn't detect cluster type!" fi else unamestr=`uname` - if [[ "$unamestr" == 'Darwin' ]]; then + if [[ "$unamestr" = 'Darwin' ]]; then UGSUBMIT_TYPE=mpi export UGSUBMIT_MORE=Apple else diff --git a/scripts/shell/clusters b/scripts/shell/clusters index 11cd9fbd3..98dcda2e0 100755 --- a/scripts/shell/clusters +++ b/scripts/shell/clusters @@ -29,6 +29,12 @@ elif [ $UGSUBMIT_TYPE == "Juqueen" ]; then elif [ $UGSUBMIT_TYPE == "Jureca" ]; then source $scriptpath/schedulers/jureca +elif [ $UGSUBMIT_TYPE == "Juwels" ]; then + source $scriptpath/schedulers/juwels + +elif [ $UGSUBMIT_TYPE == "SDCluster" ]; then + source $scriptpath/schedulers/sdcluster + elif [ $UGSUBMIT_TYPE == "mpi" ] || [ $UGSUBMIT_TYPE == "mpi-foreground" ]; then source $scriptpath/schedulers/mpi diff --git a/scripts/shell/install_scripts/SuperLU/make.inc_jureca b/scripts/shell/install_scripts/SuperLU/make.inc_juelich similarity index 60% rename from scripts/shell/install_scripts/SuperLU/make.inc_jureca rename to scripts/shell/install_scripts/SuperLU/make.inc_juelich index d11916b69..0c5ac945f 100644 --- a/scripts/shell/install_scripts/SuperLU/make.inc_jureca +++ b/scripts/shell/install_scripts/SuperLU/make.inc_juelich @@ -21,16 +21,25 @@ # PLAT = +stagePath= +system=$(shell cat /etc/FZJ/systemname) +ifeq ($(system),jureca) + stagePath=/usr/local/software/jureca/Stages/2018a +endif +ifeq ($(system),juwels) + stagePath=/gpfs/software/juwels/stages/2018b +endif + # # The name of the libraries to be created/linked to # SuperLUroot = $(UG4_LOCAL_INSTALL_DIR)/SuperLU/4.3 SUPERLULIB = $(SuperLUroot)/lib/libsuperlu_4.3.a -BLASLIB = /usr/local/software/jureca/Stages/2018a/software/imkl/2018.2.199-ipsmpi-2018a/mkl/lib/intel64/libmkl_intel_lp64.so \ - /usr/local/software/jureca/Stages/2018a/software/imkl/2018.2.199-ipsmpi-2018a/mkl/lib/intel64/libmkl_intel_thread.so \ - /usr/local/software/jureca/Stages/2018a/software/imkl/2018.2.199-ipsmpi-2018a/mkl/lib/intel64/libmkl_core.so \ - /usr/local/software/jureca/Stages/2018a/software/imkl/2018.2.199-ipsmpi-2018a/mkl/lib/intel64/libmkl_intel_thread.so \ - /usr/local/software/jureca/Stages/2018a/software/imkl/2018.2.199-ipsmpi-2018a/lib/intel64/libiomp5.so \ +BLASLIB = $(stagePath)/software/imkl/2019.0.117-ipsmpi-2018b/mkl/lib/intel64/libmkl_intel_lp64.so \ + $(stagePath)/software/imkl/2019.0.117-ipsmpi-2018b/mkl/lib/intel64/libmkl_intel_thread.so \ + $(stagePath)/software/imkl/2019.0.117-ipsmpi-2018b/mkl/lib/intel64/libmkl_core.so \ + $(stagePath)/software/imkl/2019.0.117-ipsmpi-2018b/mkl/lib/intel64/libmkl_intel_thread.so \ + $(stagePath)/software/imkl/2019.0.117-ipsmpi-2018b/lib/intel64/libiomp5.so \ /usr/lib64/libpthread.so TMGLIB = libtmglib.a LIBS = $(SUPERLULIB) $(BLASLIB) @@ -43,10 +52,10 @@ ARCH = ar ARCHFLAGS = cr RANLIB = ranlib -CC = /usr/local/software/jureca/Stages/2018a/software/psmpi/5.2.1-1-iccifort-2018.2.199-GCC-5.5.0/bin/mpicc +CC = $(stagePath)/software/impi/2019.0.117-iccifort-2019.0.117-GCC-7.3.0/bin/mpicc CFLAGS = -O3 -fPIC NOOPTS = -fPIC -FORTRAN = /usr/local/software/jureca/Stages/2018a/software/psmpi/5.2.1-1-iccifort-2018.2.199-GCC-5.5.0/bin/mpif90 +FORTRAN = $(stagePath)/software/impi/2019.0.117-iccifort-2019.0.117-GCC-7.3.0/bin/mpif90 FFLAGS = -O3 -cpu:g5 -YEXT_NAMES=LCS -s -YEXT_SFX=_ LOADER = $(CC) LOADOPTS = diff --git a/scripts/shell/schedulers/cekon b/scripts/shell/schedulers/cekon index 48801c871..fed31037e 100755 --- a/scripts/shell/schedulers/cekon +++ b/scripts/shell/schedulers/cekon @@ -8,24 +8,12 @@ function UJS_Submit { echo "Cluster: cekon. Scheduler: SLURM." - jobid=? - - # well hm this might be wrong - if [ $nppn -ne 1 ]; then - echo "cekon does not support nppn > 1. Aborting." - exit - fi - if [ $((npe%nppn)) -ne 0 ]; then - echo "npe=$npe is not dividable by nppn=$nppn" - exit - fi - local SlurmWalltime="" if [ $walltime != "unlimited" ]; then SlurmWalltime="--time=$walltime " fi - + local SlurmMail="" if [ $mail == true ]; then if [ -z "$UGSUBMIT_EMAIL" ]; then @@ -53,16 +41,16 @@ function UJS_Submit fi SlurmMail="--mail-user=$UGSUBMIT_EMAIL --mail-type=$SlurmNotification " fi - + local SlurmExclusive="" if [ $exclusive == true ]; then - SlurmExclusive="--exclusive" + SlurmExclusive="--exclusive " fi local additionalSlurm="$SlurmWalltime$SlurmMail$SlurmExclusive" - - commandline="salloc -n $npe $additionalSlurm --job-name=$jobname mpirun $executable $args" - echo " command: "$commandline >> info.txt + commandline="salloc -N $nnodes -n $npe $additionalSlurm --job-name=$jobname mpirun $executable $args" + echo " command: "$commandline >> info.txt + if [ $test == true ]; then echo "ONLY testing - NOT executing." echo "Submit/Start: $commandline" @@ -84,7 +72,7 @@ function UJS_Submit fi else echo "Submit: $commandline" - nohup $commandline > $outdir/job.output & + nohup $commandline > job.output & sleep 1 jobid=`cat job.output | sed -n 1p | sed 's/.* \([0-9]*\).*/\1/'` @@ -98,16 +86,15 @@ function UJS_Submit function UJS_GetOptions { - nppnmax=1 + nppnmax=4 pemax=92 } function UJS_Info { - echo "UGSUBMIT Info for CEKON:" - echo "Max Cores Total: 92 (23 Nodes with 4 Cores Per Node)" - echo "Memory on each node: 4 GB" - echo "Using SLURM on cekon" + echo "UGSUBMIT Info for cekon:" + echo "Max Cores Total: 92 (23 nodes with one 4-Core-CPU per node)" + echo "Using SLURM on cekon" if [ ! -z $1 ] && [ $1 == "all" ]; then echo "squeue -o \"%.7i %6C %6D %.50j %.10u %.8T %.10M %.10l %.6D %19R\"" squeue -o "%.7i %6C %6D %.50j %.10u %.8T %.10M %.10l %.6D %19R" @@ -134,4 +121,4 @@ function UJS_Cancel else scancel $1 fi -} \ No newline at end of file +} diff --git a/scripts/shell/schedulers/cesari b/scripts/shell/schedulers/cesari index 580c59893..254b49f0f 100755 --- a/scripts/shell/schedulers/cesari +++ b/scripts/shell/schedulers/cesari @@ -67,7 +67,7 @@ function UJS_Submit $commandline | tee $outdir/job.output return=$? if [ ! $return == 0 ]; then - echo "ERROR: srun returned $return. Job has NOT been started." + echo "ERROR: salloc returned $return. Job has NOT been started." exit fi else @@ -93,7 +93,7 @@ function UJS_GetOptions function UJS_Info { echo "UGSUBMIT Info for cesari:" - echo "Max Cores Total: 520 (26 Nodes with 10 Dualcores Per Node)" + echo "Max Cores Total: 520 (26 nodes with two 10-Core-CPUs per node)" echo "Using SLURM on cesari" if [ ! -z $1 ] && [ $1 == "all" ]; then echo "squeue -o \"%.7i %6C %6D %.50j %.10u %.8T %.10M %.10l %.6D %19R\"" @@ -121,4 +121,4 @@ function UJS_Cancel else scancel $1 fi -} \ No newline at end of file +} diff --git a/scripts/shell/schedulers/juwels b/scripts/shell/schedulers/juwels new file mode 100644 index 000000000..4042a1838 --- /dev/null +++ b/scripts/shell/schedulers/juwels @@ -0,0 +1,204 @@ +#!/bin/bash +###################################################################### +# JUWELS +#------------------------------------------------------------------- +# using SLURM +###################################################################### + +function UJS_Submit +{ + echo "Cluster: JUWELS. Scheduler: SLURM." + + # check consistency + if [ $((npe%nppn)) -ne 0 ]; then + echo "npe=$npe is not divisible by nppn=$nppn" + exit + fi + + if [ $nnodes -gt 512 ]; then + echo "Juwels does not provide more than 512 nodes for one batch job atm." + return + elif [ $nnodes -gt 64 ] && [ "$juwels_part" = "mem192" ]; then + echo "Juwels does not provide more than 64 nodes on the mem192 partition for one job atm." + return + fi + + ## interactive (devel) jobs (not tested) + # Once an allocation has been made, the salloc command will start a bash + # on the login node where the submission was done. After a successful + # allocation the users can execute srun from that shell and they can + # spawn interactively their applications. The interactive session is + # terminated by exiting the shell. + # In order to obtain a shell on the first allocated compute nodes + # (like command “msub -I“ from Moab), the users can start a remote shell + # from within the current session and connect it to a pseudo terminal + # (pty) using the srun command with a shell as an argument. For example: + # srun --cpu_bind=none --nodes=2 --pty /bin/bash + # After gaining access to the remote shell it is possible to run srun + # again from that remote shell in order to execute interactively + # applications without any delays (no scheduling delays since the + # allocation has already been granted). + # For more details, cf.: + # "JUWELS - User's Manual for the Batch System - Slurm" + if [ $interactive == true ]; then + + if [ $walltime == "unlimited" ]; then + walltime=00:30:00 + fi + + # todo: check walltime is <= 2h + + if [ $nnodes -gt 8 ]; then + echo "ERROR: The maximum number of nodes for interactive jobs is 8." + return + fi + + commandline="salloc -N $nnodes -n $npe --partition=devel --job-name=$jobname --time=$walltime" + echo " command: "$commandline >> info.txt + + echo "[[ current cluster allocation" + squeue + echo "]] current cluster allocation" + + if [ $test == true ]; then + echo "ONLY testing - NOT executing." + echo "Submit/Start: $commandline" + return + fi + + echo "Start: $commandline" + + $commandline | tee $outdir/job.output + return=$? + if [ ! $return == 0 ]; then + echo "ERROR: srun returned $return. Job has NOT been started." + exit + fi + + ## BATCH jobs + else + + # walltime handling + if [ $walltime == "unlimited" ]; then + walltime=01:00:00 + fi + + echo "Create: $outdir/job.sh" + + #MYLDLPATH=/bgsys/drivers/ppcfloor/comm/lib/ + + # mail notification handling + juwelsNotification="NONE" + if [ $mail = true ]; then + if [ -z "$UGSUBMIT_EMAIL" ]; then + echo "please set UGSUBMIT_EMAIL or specify email with -email. Aborting." + exit + fi + + if [ $mailStart = true ]; then + juwelsNotification="BEGIN" + fi + if [ $mailEnd = true ]; then + if [ $juwelsNotification == "NONE" ]; then + juwelsNotification="END" + else + juwelsNotification="ALL" + fi + fi + if [ $mailError = true ]; then + if [ $juwelsNotification == "NONE" ]; then + juwelsNotification="FAIL" + else + juwelsNotification="ALL" + fi + fi + fi + + # partition + if [ -z "$juwels_part" ]; then + juwels_part="batch" + elif [ ! "$juwels_part" = "batch" ] && [ ! "$juwels_part" = "mem192" ]; then + echo "Juwels-partition parameter not set correctly. Valid values are: batch, mem192." + return + fi + + # project for accounting + if [ -z "$juwels_project" ]; then + echo "Juwels-project parameter must be set (for accounting)." + return + fi + + + # write job script + cat > job.sh << EOF +#!/bin/bash +#SBATCH --account=$juwels_project +#SBATCH --job-name=$jobname +#SBATCH --nodes=$nnodes +#SBATCH --ntasks=$npe +#SBATCH --time=$walltime +#SBATCH --partition=$juwels_part +#SBATCH --error=job.error +#SBATCH --output=job.output +#SBATCH --mail-type=$juwelsNotification +#SBATCH --mail-user=$UGSUBMIT_EMAIL + +$profilePrefix +srun -N $nnodes -n $npe -p $juwels_part $executable $args +EOF + + # execute command (or only print it in test case) + commandline="sbatch -N $nnodes -n $npe job.sh" + echo " command: "$commandline >> info.txt + + if [ $test == true ]; then + echo "ONLY testing - NOT executing." + echo "Submit/Start: $commandline" + return + fi + + echo "Submit: $commandline" + commlineoutput=$($commandline) + echo "$commlineoutput" + jobid=$(echo $commlineoutput | sed 's/.*[^0-9]\([0-9]\+\)[^0-9]*$/\1/') + fi +} + + + +function UJS_GetOptions +{ + nppnmax=48 + pemax=109008 +} + +function UJS_Info +{ + echo "UGSUBMIT Info for JUWELS:" + if [ ! -z $1 ] && [ $1 == "all" ]; then + #echo "squeue -o \"%.7i %6C %6D %.20j %.10u %.8T %.10M %.10l %.6D %19R\"" + squeue -o "%.7i %6C %6D %.20j %.10u %.8T %.10M %.10l %.6D %19R" + else + #echo "squeue -u $USER -o \"%.7i %6C %6D %.20j %.10u %.8T %.10M %.10l %.6D %19R\"" + squeue -u $USER -o "%.7i %6C %6D %.20j %.10u %.8T %.10M %.10l %.6D %19R" + fi +} + +function UJS_Cancel +{ + echo "Using SLURM on JUWELS" + if [ ! -z $1 ] && [ $1 == "all" ]; then + echo "your jobs:" + squeue -u $USER -o "%.7i %6C %6D %.50j %.10u %.8T %.10M %.10l %.6D %19R" + echo " " + read -p "Are you sure you want to cancel all your jobs (yes=j,J,y or Y) ? " -n 1 -r + echo " " + if [[ $REPLY =~ ^[JjYy]$ ]] + then + scancel --user=$USER + fi + + else + scancel $1 + fi +} \ No newline at end of file diff --git a/scripts/shell/schedulers/sdcluster b/scripts/shell/schedulers/sdcluster new file mode 100644 index 000000000..20a1f8db0 --- /dev/null +++ b/scripts/shell/schedulers/sdcluster @@ -0,0 +1,209 @@ +#!/bin/bash +###################################################################### +# SDCluster +#------------------------------------------------------------------- +# using SLURM +###################################################################### + +function UJS_Submit +{ + echo "Cluster: SDCluster. Scheduler: SLURM." + + # check consistency + if [ $((npe%nppn)) -ne 0 ]; then + echo "npe=$npe is not divisible by nppn=$nppn" + exit + fi + + if [ $nnodes -gt 92 ]; then + echo "SDCluster does not provide more than 92 nodes for one job atm." + return + fi + + ## interactive (devel) jobs (not tested) + # Once an allocation has been made, the salloc command will start a bash + # on the login node where the submission was done. After a successful + # allocation the users can execute srun from that shell and they can + # spawn interactively their applications. The interactive session is + # terminated by exiting the shell. + # In order to obtain a shell on the first allocated compute nodes + # (like command “msub -I“ from Moab), the users can start a remote shell + # from within the current session and connect it to a pseudo terminal + # (pty) using the srun command with a shell as an argument. For example: + # srun --cpu_bind=none --nodes=2 --pty /bin/bash + # After gaining access to the remote shell it is possible to run srun + # again from that remote shell in order to execute interactively + # applications without any delays (no scheduling delays since the + # allocation has already been granted). + # For more details, cf.: + # "SDCluster - User's Manual for the Batch System - Slurm" + if [ $interactive == true ]; then + + if [ $walltime == "unlimited" ]; then + walltime=00:30:00 + fi + + # todo: check walltime is <= 2h + + if [ $nnodes -gt 8 ]; then + echo "ERROR: The maximum number of nodes for interactive jobs is 8." + return + fi + + commandline="salloc -N $nnodes -n $npe --partition=devel --job-name=$jobname --time=$walltime" + echo " command: "$commandline >> info.txt + + echo "[[ current cluster allocation" + squeue + echo "]] current cluster allocation" + + if [ $test == true ]; then + echo "ONLY testing - NOT executing." + echo "Submit/Start: $commandline" + return + fi + + echo "Start: $commandline" + + $commandline | tee $outdir/job.output + return=$? + if [ ! $return == 0 ]; then + echo "ERROR: srun returned $return. Job has NOT been started." + exit + fi + + ## BATCH jobs + else + + # walltime handling + if [ $walltime == "unlimited" ]; then + walltime=00:30:00 + fi + + echo "Create: $outdir/job.sh" + + #MYLDLPATH=/bgsys/drivers/ppcfloor/comm/lib/ + + # mail notification handling + SDclusterNotification="NONE" + if [ $mail = true ]; then + if [ -z "$UGSUBMIT_EMAIL" ]; then + echo "please set UGSUBMIT_EMAIL or specify email with -email. Aborting." + exit + fi + + if [ $mailStart = true ]; then + SDclusterNotification="BEGIN" + fi + if [ $mailEnd = true ]; then + if [ $SDclusterNotification == "NONE" ]; then + SDclusterNotification="END" + else + SDclusterNotification="ALL" + fi + fi + if [ $mailError = true ]; then + if [ $SDclusterNotification == "NONE" ]; then + SDclusterNotification="FAIL" + else + SDclusterNotification="ALL" + fi + fi + fi + + # partition + if [ -z "$partition" ]; then + partition="short" + elif [ ! "$partition" = "short" ] && [ ! "$partition" = "medium" ] && [ ! "$partition" = "long" ] && [ ! "$partition" = "fatnodes" ]; then + echo "partition parameter not set correctly. Valid values are: short, medium, long, fatnodes." + return + fi + + # project for accounting + if [ -z "$mem" ]; then + echo "mem parameter must be set." + return + fi + + # write job script + cat > job.sh << EOF +#!/bin/bash +#SBATCH --job-name=$jobname +#SBATCH --nodes=$nnodes +#SBATCH --ntasks=$npe +#SBATCH --time=$walltime +#SBATCH --error=slurm.%j.error +#SBATCH --output=slurm.%j.out +#SBATCH --mail-type=$SDclusterNotification +#SBATCH --mail-user=$UGSUBMIT_EMAIL +#SBATCH --partition=$partition +#SBATCH --mem=$mem +EOF + + if [ $exclusive == true ]; then + cat >> job.sh << EOF +#SBATCH --exclusive +EOF + fi + + + cat >> job.sh << EOF +$profilePrefix +mpirun -n \${SLURM_NTASKS} $executable $args +EOF + + # execute command (or only print it in test case) + commandline="sbatch -N $nnodes -n $npe job.sh" + echo " command: "$commandline >> info.txt + + if [ $test == true ]; then + echo "ONLY testing - NOT executing." + echo "Submit/Start: $commandline" + return + fi + + echo "Submit: $commandline" + commlineoutput=$($commandline) + echo "$commlineoutput" + jobid=$(echo $commlineoutput | sed 's/.*[^0-9]\([0-9]\+\)[^0-9]*$/\1/') + fi +} + + + +function UJS_GetOptions +{ + nppnmax=80 + pemax=7360 +} + +function UJS_Info +{ + echo "UGSUBMIT Info for SDCluster:" + if [ ! -z $1 ] && [ $1 == "all" ]; then + #echo "squeue -o \"%.7i %6C %6D %.20j %.10u %.8T %.10M %.10l %.6D %19R\"" + squeue -o "%.7i %6C %6D %.20j %.10u %.8T %.10M %.10l %.6D %19R" + else + #echo "squeue -u $USER -o \"%.7i %6C %6D %.20j %.10u %.8T %.10M %.10l %.6D %19R\"" + squeue -u $USER -o "%.7i %6C %6D %.20j %.10u %.8T %.10M %.10l %.6D %19R" + fi +} + +function UJS_Cancel +{ + echo "Using SLURM on SDCluster" + if [ ! -z $1 ] && [ $1 == "all" ]; then + echo "your jobs:" + squeue -u $USER -o "%.7i %6C %6D %.50j %.10u %.8T %.10M %.10l %.6D %19R" + echo " " + read -p "Are you sure you want to cancel all your jobs (yes=j,J,y or Y) ? " -n 1 -r + echo " " + if [[ $REPLY =~ ^[JjYy]$ ]] + then + scancel --user=$USER + fi + + else + scancel $1 + fi +} \ No newline at end of file diff --git a/scripts/shell/ugconfig b/scripts/shell/ugconfig index ead9e1c02..aae927945 100755 --- a/scripts/shell/ugconfig +++ b/scripts/shell/ugconfig @@ -10,7 +10,8 @@ # e.g. loading of lapack/blas/compiler modules. ###################################################################### -scriptpath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#scriptpath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +scriptpath=${UG4_ROOT}/ugcore/scripts/shell if [ -z "$UGSUBMIT_TYPE" ]; then source $scriptpath/clusterdetect @@ -21,7 +22,7 @@ fi -if [ $UGSUBMIT_TYPE == "Hermit" ] || [ $UGSUBMIT_TYPE == "Hazelhen" ] || [ $UGSUBMIT_TYPE == "Hornet" ]; then +if [ "$UGSUBMIT_TYPE" = "Hermit" ] || [ "$UGSUBMIT_TYPE" = "Hazelhen" ] || [ "$UGSUBMIT_TYPE" = "Hornet" ]; then echo "ugconfig: On Hermit/Hornet/Hazelhen, loading gnu compilers" module list 2>&1 | grep PrgEnv-gnu > /dev/null if [ $? == 1 ]; then @@ -31,32 +32,38 @@ if [ $UGSUBMIT_TYPE == "Hermit" ] || [ $UGSUBMIT_TYPE == "Hazelhen" ] || [ $UGSU echo PrgEnv-gnu already loaded. fi -elif [ $UGSUBMIT_TYPE == "cekon" ]; then +elif [ "$UGSUBMIT_TYPE" = "cekon" ]; then echo "ugconfig: Nothing to configure on cekon. Have a nice day." -elif [ $UGSUBMIT_TYPE == "cesari" ]; then +elif [ "$UGSUBMIT_TYPE" = "cesari" ]; then echo "ugconfig: Nothing to configure on cesari. Have a nice day." -elif [ $UGSUBMIT_TYPE == "mpi" ] && [ $UGSUBMIT_MORE == "Apple" ]; then +elif [ "$UGSUBMIT_TYPE" = "mpi" ] && [ "$UGSUBMIT_MORE" = "Apple" ]; then echo "ugconfig: Nothing to configure on Apple systems. Have a nice day." -elif [ $UGSUBMIT_TYPE == "mpi" ]; then +elif [ "$UGSUBMIT_TYPE" = "mpi" ]; then echo "ugconfig: Nothing to configure on $UGSUBMIT_TYPE. Have a nice day." -elif [[ $UGSUBMIT_TYPE == "Juqueen" ]]; then - echo "ugconfig: On Juqueen, loading cmake and lapack." +elif [ "$UGSUBMIT_TYPE" = "Juqueen" ]; then + echo "ugconfig: Loading cmake and lapack." module load cmake module load lapack -elif [[ $UGSUBMIT_TYPE == "Jureca" ]]; then - echo "ugconfig: On Jureca, loading toolchain with compilers and lapack as well as cmake." - module load intel-para - module load CMake/3.2.3 - echo "ugconfig: export library paths for LAPACk and BLAS" - export LAPACK_LIB_DIR=/usr/local/software/jureca/Stage3/software/Toolchain/ipsmpi/2015.07/imkl/11.2.3.187/mkl/lib/int$ - export BLAS_LIB_DIR=/usr/local/software/jureca/Stage3/software/Toolchain/ipsmpi/2015.07/imkl/11.2.3.187/mkl/lib/intel$ +elif [ "$UGSUBMIT_TYPE" = "Jureca" ]; then + echo "ugconfig: Loading toolchain with compilers and lapack as well as cmake." + module load Intel # compilers + module load ParaStationMPI # MPI wrappers + module load imkl # BLAS / LAPACK + module load CMake -elif [ "$UGSUBMIT_TYPE" == "unknown" ]; then +elif [ "$UGSUBMIT_TYPE" = "Juwels" ]; then + echo "ugconfig: Loading toolchain with compilers and BLAS / LAPACK as well as CMake." + module load Intel # compilers + module load ParaStationMPI # MPI wrappers + module load imkl # BLAS / LAPACK + module load CMake + +elif [ "$UGSUBMIT_TYPE" = "unknown" ]; then echo "Hello, this is ugconfig trying to config your cluster" echo "The UGSUBMIT_TYPE could not be set automatically." echo "please set UGSUBMIT_TYPE manually." diff --git a/scripts/shell/uginstall b/scripts/shell/uginstall index 2c430373e..714dd04d4 100755 --- a/scripts/shell/uginstall +++ b/scripts/shell/uginstall @@ -565,9 +565,9 @@ make_SuperLU() echo "UGINSTALL: On Juqueen, using make.inc_juqueen_xl" cp $scriptpath/install_scripts/SuperLU/make.inc_juqueen_xl make.inc make blaslib - elif [[ "$HOSTNAME" == "jrl"* ]]; then - echo "UGINSTALL: On Jureca, using make.inc_jureca" - cp $scriptpath/install_scripts/SuperLU/make.inc_jureca make.inc + elif [[ "$HOSTNAME" == "jrl"* || "$HOSTNAME" == "juwels"* ]]; then + echo "UGINSTALL: On Juelich supercomputer, using make.inc_juelich" + cp $scriptpath/install_scripts/SuperLU/make.inc_juelich make.inc else echo "UGINSTALL: Not yet supported cluster, using internal BLAS" cp $scriptpath/install_scripts/SuperLU/make.inc_default make.inc diff --git a/scripts/shell/ugsubmit b/scripts/shell/ugsubmit index d65f0597f..6955cbbe8 100755 --- a/scripts/shell/ugsubmit +++ b/scripts/shell/ugsubmit @@ -14,6 +14,8 @@ # - Jugene, Forschungszentrum Juelich (ll_submit) # - Juqueen, Forschungszentrum Juelich (ll_submit) # - Jureca, Forschungszentrum Juelich (SLURM) +# - Juwelsjureca, Forschungszentrum Juelich (SLURM) +# - SDCluster, Ruhr University Bochum (SLURM) # - Hermit, HLRS Stuttgart (qsub, aprun) # - NecNehalem, HLRS Stuttgart (qsub, mpirun) # - MOAB Workload Manager (msub, srun) @@ -46,6 +48,7 @@ runDir=$execPath execdate=`date`; # date of execution verbose=false; exclusive=false; +nosuffix=false; scriptpath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" mailStart=false @@ -99,7 +102,10 @@ function usage echo " -nppn : number of processes per node (optional, default "$nppn")" echo " -cluster : cluster to use. see below (or use env. variable UGSUBMIT_TYPE)" echo " -name : a jobname to be used (optional, default \""$jobname"\")" + echo " -nosuffix : do not add .npe.date suffix to jobname" echo " -walltime : max walltime for job to run (optional; default is "$walltime")" + echo " -partition : the partition to be used" + echo " -mem : max (overall) main memory for the job" echo " -email : emailadress. you can also use the environment variable UGSUBMIT_EMAIL." echo " -mail-start : mail when job starts" echo " -mail-end : mail when job ends" @@ -115,7 +121,7 @@ function usage echo " -queue : the queue to use" echo " -nosubdir : don't create job in a subdir, but in dir (default .) directly. (warning: might be dangerous)" echo " " - echo " Supported Cluster Types: NecNehalem, Hermit, Jugene, Juqueen, Jureca, mpi (mpi-foreground, mpi-background), cekon, cesari, moab." + echo " Supported Cluster Types: NecNehalem, Hermit, Jugene, Juqueen, Jureca, Juwels, SDCluster, mpi (mpi-foreground, mpi-background), cekon, cesari, moab." if [ -n "$UGSUBMIT_TYPE" ]; then echo " Only UGSUBMIT_TYPE=$UGSUBMIT_TYPE specific parameters are shown ! Set UGSUBMIT_TYPE=\"\" to see all." fi @@ -147,6 +153,16 @@ function usage echo " -Jureca-memory : Amount of memory to use (default is 128): 128, 256, 512." echo "" fi + if [ -z "$UGSUBMIT_TYPE" ] || [ $UGSUBMIT_TYPE == "Juwels" ]; then + echo "" + echo " Juwels Parameters" + echo " -Juwels-partition : Partition to use; default is batch:" + echo " batch (max. 24h walltime, 256 nodes, 96G memory/node)" + echo " mem192 (192G memory/node)" + echo " -Juwels-project : Project name under which the job is to be carried out," + echo " e.g., HFUxxx; needed for accounting." + echo "" + fi if [ -z "$UGSUBMIT_TYPE" ] || [ $UGSUBMIT_TYPE == "DoraCSCS" ]; then echo "" echo " Dora Parameters" @@ -215,6 +231,9 @@ do elif [ $1 == "-name" ]; then jobname=$2 shift 2 + elif [ $1 == "-nosuffix" ]; then + nosuffix=true + shift 1 elif [ $1 == "-so" ]; then scheduleroptions=$2 shift 2 @@ -312,6 +331,18 @@ do elif [ $1 == "-Jureca-memory" ]; then jureca_mem=$2 shift 2 + elif [ $1 == "-Juwels-partition" ]; then + juwels_part=$2 + shift 2 + elif [ $1 == "-Juwels-project" ]; then + juwels_project=$2 + shift 2 + elif [ $1 == "-partition" ]; then + partition=$2 + shift 2 + elif [ $1 == "-mem" ]; then + mem=$2 + shift 2 elif [ $1 == "---" ]; then shift break @@ -375,7 +406,10 @@ if [ ${executable:0:1} = "." ]; then fi dirdate=$(date "+%Yy%mm%dd-%Hh%Mm%Ss"); -jobname=$jobname.$npe.$dirdate; + +if [ $nosuffix == false ]; then + jobname=$jobname.$npe.$dirdate; +fi #create output directory if [ $nosubdir == true ]; then @@ -518,7 +552,7 @@ if [ $interactive == false ]; then sleep 1; tail -f job.output -c +0 fi - if [ $jobid != "?" ] && [ $nosubdir == false ]; then + if [ ! "$jobid" = "?" ] && [ $nosubdir = false ]; then cd $execpath ln -s $outdir jobid.$jobid fi diff --git a/scripts/util/checkpoint_util.lua b/scripts/util/checkpoint_util.lua index 6b0402413..eac66d9ae 100644 --- a/scripts/util/checkpoint_util.lua +++ b/scripts/util/checkpoint_util.lua @@ -123,12 +123,13 @@ end --! Can contain all LUA types (tables, arrays, strings, numbers etc.), but no userdata! --! Can also be nil. --! @param name name to use when writing the checkpoint. may be nil. -function util.WriteCheckpoint(u, id, myData, name) +--! @param verbose if verbose defined then print additional debug output to console +function util.WriteCheckpoint(u, id, myData, name, verbose) if name == nil then name = util.checkpoint.stdName end ug_assert(id ~= nil) -- create a filename - filename = name..id..".ug4vec" + local filename = name..id..".ug4vec" SaveToFile(u, filename) checkpoint = { @@ -148,7 +149,9 @@ function util.WriteCheckpoint(u, id, myData, name) LuaWrite(name..".lua", "checkpoint") end - print("\nWrote Checkpoint "..name..".lua. id = "..id..", filename = "..filename.."\n") + if verbose then + print("\nWrote Checkpoint "..name..".lua. id = "..id..", filename = "..filename.."\n") + end end @@ -175,7 +178,8 @@ end --! @param name name to use when writing the checkpoint. may be nil. --! @return the checkpoint data cp. (see util.WriteCheckpoint) --! myData will be saved cp.myData. -function util.ReadCheckpoint(u, name) +--! @param verbose if verbose defined then print additional debug output to console +function util.ReadCheckpoint(u, name, verbose) if name == nil then name = util.checkpoint.stdName end -- load the lua data @@ -184,13 +188,15 @@ function util.ReadCheckpoint(u, name) -- todo: use if file exists here, and return nil if not ug_load_script(name..".lua") - -- the script defines a function named "LoadTheCheckpoint" - -- call it + --! LoadTheCheckpoint is a function defined in the the lua binding: + --! @see ugcore/ugbase/bindings/lua/lua_serialization.cpp local cp = LoadTheCheckpoint() -- print the checkpoint - print("Loading Checkpoint "..name..".lua :") - print(cp) + if verbose then + print("Loading Checkpoint "..name..".lua :") + print(cp) + end -- check that the stdData is same in file and -- current run (see util.GetStdCheckpointData) diff --git a/scripts/util/conv_rates_static.lua b/scripts/util/conv_rates_immersed.lua similarity index 92% rename from scripts/util/conv_rates_static.lua rename to scripts/util/conv_rates_immersed.lua index a8dc2f469..5b077f9e8 100644 --- a/scripts/util/conv_rates_static.lua +++ b/scripts/util/conv_rates_immersed.lua @@ -1,33 +1,3 @@ --- Copyright (c) 2013-2014: G-CSC, Goethe University Frankfurt --- Author: Andreas Vogel --- --- This file is part of UG4. --- --- UG4 is free software: you can redistribute it and/or modify it under the --- terms of the GNU Lesser General Public License version 3 (as published by the --- Free Software Foundation) with the following additional attribution --- requirements (according to LGPL/GPL v3 §7): --- --- (1) The following notice must be displayed in the Appropriate Legal Notices --- of covered and combined works: "Based on UG4 (www.ug4.org/license)". --- --- (2) The following notice must be displayed at a prominent place in the --- terminal output of covered works: "Based on UG4 (www.ug4.org/license)". --- --- (3) The following bibliography is recommended for citation and must be --- preserved in all covered files: --- "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively --- parallel geometric multigrid solver on hierarchically distributed grids. --- Computing and visualization in science 16, 4 (2013), 151-164" --- "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel --- flexible software system for simulating pde based models on high performance --- computers. Computing and visualization in science 16, 4 (2013), 165-179" --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU Lesser General Public License for more details. - util = util or {} util.rates = util.rates or {} util.rates.static = util.rates.static or {} @@ -212,7 +182,7 @@ function util.rates.static.compute(ConvRateSetup) -- check for methods local PrepareInitialGuess = CRS.PrepareInitialGuess or util.rates.static.StdPrepareInitialGuess - local ComputeSolution = CRS.ComputeSolution or util.rates.static.StdComputeLinearSolution + local ComputeSolution = CRS.ComputeSolution or util.rates.static.StdComputeNonLinearSolution local CreateApproxSpace = CRS.CreateApproxSpace local CreateDomainDisc = CRS.CreateDomainDisc local CreateSolver = CRS.CreateSolver @@ -308,8 +278,7 @@ function util.rates.static.compute(ConvRateSetup) print(">> Create Domain Disc: "..disc..", "..p) local domainDisc = CreateDomainDisc(approxSpace, disc, p) - print(">> Create Solver") - local solver = CreateSolver(approxSpace, disc, p) + --local solver = CreateSolver(approxSpace, disc, p) -- get names in approx space local SpaceCmp = approxSpace:names() @@ -345,9 +314,12 @@ function util.rates.static.compute(ConvRateSetup) -------------------------------------------------------------------- -- Compute Solution on each level -------------------------------------------------------------------- - --local solver = nil if exact or maxlevel or prevlevel then for lev = minLev, maxLev do + print(">> Create Solver on lev "..lev) + + local solver = CreateSolver(approxSpace, disc, p, lev) + write("\n>> Computing Level "..lev..", "..disc..", "..p..".\n") write(">> Preparing inital guess on level "..lev..".\n") @@ -363,10 +335,12 @@ function util.rates.static.compute(ConvRateSetup) WriteGridFunctionToVTK(u[lev], solPath.."sol_"..disc..p.."_l"..lev) write(">> Solution written to: "..solPath.."sol_"..disc..p.."_l"..lev.."\n"); end + + solver = nil end end - approxSpace, domainDisc, solver = nil, nil, nil + approxSpace, domainDisc = nil, nil collectgarbage() -------------------------------------------------------------------- @@ -388,7 +362,7 @@ function util.rates.static.compute(ConvRateSetup) local quadOrder = p*p+3 write(">> #DoF on Level "..lev.." is "..err.DoFs[lev] .."\n"); - + -- compute for each component for f, Cmps in pairs(PlotCmps) do @@ -457,13 +431,15 @@ function util.rates.static.compute(ConvRateSetup) uExact = nil end - + + -- w.r.t max level solution if maxlevel and lev < maxLev then local value = createMeas(f, "l-lmax", "l2") value[lev] = 0.0 for _,cmp in pairs(Cmps) do - value[lev] = value[lev] + math.pow(L2Error(u[maxLev], cmp, u[lev], cmp, quadOrder), 2) + value[lev] = value[lev] + math.pow(L2ErrorInside(u[maxLev], cmp, u[lev], cmp, quadOrder), 2) + -- value[lev] = value[lev] + math.pow(L2Error(u[maxLev], cmp, u[lev], cmp, quadOrder), 2) end value[lev] = math.sqrt(value[lev]) write(">> L2 l-lmax for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); @@ -476,13 +452,15 @@ function util.rates.static.compute(ConvRateSetup) value[lev] = math.sqrt(value[lev]) write(">> H1 l-lmax for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); end - + + -- w.r.t previous level solution if prevlevel and lev < maxLev then local value = createMeas(f, "l-prev", "l2") value[lev] = 0.0 for _,cmp in pairs(Cmps) do - value[lev] = value[lev] + math.pow(L2Error(u[lev+1], cmp, u[lev], cmp, quadOrder), 2) + value[lev] = value[lev] + math.pow(L2ErrorInside(u[lev+1], cmp, u[lev], cmp, quadOrder), 2) + -- value[lev] = value[lev] + math.pow(L2Error(u[lev+1], cmp, u[lev], cmp, quadOrder), 2) end value[lev] = math.sqrt(value[lev]) write(">> L2 l-(l-1) for "..f.." on Level "..lev.." is "..string.format("%.3e", value[lev]) .."\n"); diff --git a/scripts/util/gnuplot.lua b/scripts/util/gnuplot.lua index 6b3ef2469..e68502c6b 100644 --- a/scripts/util/gnuplot.lua +++ b/scripts/util/gnuplot.lua @@ -505,7 +505,7 @@ function gnuplot.plot(filename, data, options) -- check valid term if not table.contains(supportedTerms, terminal) then - write("Gnuplot Error: unsupprted terminal: '"..terminal.."'\n") + write("Gnuplot Error: unsupported terminal: '"..terminal.."'\n") write("Gnuplot Error: supported are: "..table.concat(supportedTerms, ", ").."\n") return 2 end @@ -803,10 +803,12 @@ function gnuplot.plot(filename, data, options) for d, _ in ipairs(DimNames) do dataset.min[d] = math.huge dataset.max[d] = -math.huge - for _, val in ipairs(dataset.val[d]) do - dataset.min[d] = math.min(dataset.min[d], val) - dataset.max[d] = math.max(dataset.max[d], val) - end + if dataset.func == nil then + for _, val in ipairs(dataset.val[d]) do + dataset.min[d] = math.min(dataset.min[d], val) + dataset.max[d] = math.max(dataset.max[d], val) + end + end end end end diff --git a/scripts/util/load_balancing_util.lua b/scripts/util/load_balancing_util.lua index 7ba061ea2..89e9244c0 100644 --- a/scripts/util/load_balancing_util.lua +++ b/scripts/util/load_balancing_util.lua @@ -70,6 +70,7 @@ balancer.siblingWeight = 2 balancer.itrFactor = 1000 balancer.imbalanceFactor = 1.05 balancer.noSiblingClustering = false +balancer.qualityRedist = false balancer.staticProcHierarchy = false @@ -121,6 +122,10 @@ function balancer.ParseParameters() balancer.noSiblingClustering = util.HasParamOption("-noSiblingClustering", "siblings should always be clustered if adaptive refinement is performed. Better distribution qualities if disabled.") + if not balancer.qualityRedist then + balancer.qualityRedist = util.HasParamOption("-qualityRedist", "Perform quality redistriubtions on higher levels where all processes already have parts of the grid.") + end + balancer.staticProcHierarchy = balancer.staticProcHierarchy or util.HasParamOption("-staticProcHierarchy") balancer.partitioner = util.GetParam("-partitioner", balancer.partitioner, @@ -155,6 +160,11 @@ function balancer.PrintParameters() else print(" staticProcHierarchy inactive") end + if balancer.qualityRedist == true then + print(" qualityRedist active") + else + print(" qualityRedist inactive") + end print(" partitioner = " .. balancer.partitioner) end @@ -181,8 +191,6 @@ function balancer.CreateLoadBalancer(domain) if balancer.communicationWeights ~= nil then partitioner:set_communication_weights(balancer.communicationWeights) end - partitioner:set_child_weight(balancer.childWeight) - partitioner:set_sibling_weight(balancer.siblingWeight) partitioner:set_itr_factor(balancer.itrFactor) partitioner:set_allowed_imbalance_factor(balancer.imbalanceFactor) partitioner:set_verbose(false) @@ -236,8 +244,11 @@ function balancer.CreateLoadBalancer(domain) procsTotal = procsTotal * numNew end else - --processHierarchy:add_hierarchy_level(lvl, 1) - break; + if balancer.qualityRedist == true then + processHierarchy:add_hierarchy_level(lvl, 1) + else + break + end end lvl = lvl + balancer.redistSteps end diff --git a/scripts/util/load_balancing_util_2.lua b/scripts/util/load_balancing_util_2.lua index f3ba72e08..46ea6569a 100644 --- a/scripts/util/load_balancing_util_2.lua +++ b/scripts/util/load_balancing_util_2.lua @@ -101,8 +101,6 @@ util.balancer.defaults = balanceWeights = nil, communicationWeights = nil, options = nil, - childWeight = 2, - siblingWeight = 2, itrFactor = 1000, verbose = false, clusteredSiblings = true, @@ -290,8 +288,6 @@ function util.balancer.CreatePartitioner(dom, partitionerDesc) RequiredPlugins({"Parmetis"}) partitioner = Partitioner_Parmetis(dom) - partitioner:set_child_weight(desc.childWeight or defaults.childWeight) - partitioner:set_sibling_weight(desc.siblingWeight or defaults.siblingWeight) partitioner:set_itr_factor(desc.itrFactor or defaults.itrFactor) partitioner:set_verbose(verbose) diff --git a/scripts/util/solver_util.lua b/scripts/util/solver_util.lua index 056d10706..6bf3b9aeb 100644 --- a/scripts/util/solver_util.lua +++ b/scripts/util/solver_util.lua @@ -622,6 +622,10 @@ function util.solver.CreateSolver(solverDesc, solverutil) util.solver.CreateLineSearch(lineSearch)) end + if type (desc.reassemble_J_freq) == "number" then + newtonSolver:set_reassemble_J_freq(desc.reassemble_J_freq) + end + util.solver.SetDebugWriter(newtonSolver, solverDesc, defaults) return newtonSolver @@ -806,6 +810,10 @@ function util.solver.CreatePreconditioner(precondDesc, solverutil) desc.gatheredBaseSolverIfAmbiguous or defaults.gatheredBaseSolverIfAmbiguous) + if desc.surfaceLevel then + gmg:set_surface_level (desc.surfaceLevel) + end + local transfer = util.solver.CreateTransfer(desc.transfer or defaults.transfer) if desc.adaptive == true then -- next three lines are obsolete, since gmg:set_transfer overwrites gmg:set_projection, anyways!? @@ -817,10 +825,6 @@ function util.solver.CreatePreconditioner(precondDesc, solverutil) end gmg:set_transfer(transfer) - if (desc.debug or defaults.debug) then - gmg:set_debug(GridFunctionDebugWriter(approxSpace)) - end - local discretization = desc.discretization or util.solver.defaults.discretization if discretization then gmg:set_discretization(discretization) @@ -850,42 +854,26 @@ function util.solver.CreatePreconditioner(precondDesc, solverutil) util.solver.CondAbort(precond == nil, "Invalid preconditioner specified: " .. name) - - - -- check: - local rprecond = precond - if desc and desc.debugSolver then - print(solver) - local dsolver = - util.solver.CreateLinearSolver( - desc.debugSolver, solverutil) - - local err = GridFunction(approxSpace) - rprecond = DebugIterator(precond, dsolver) - rprecond:set_solution(err) - else - - - - end - - -- create debug writer (optional) - if desc and ((desc.debug == true) or (desc.debugSolver and desc.debugSolver.debug==true)) then - if approxSpace == nil then - print("An ApproximationSpace is required to create a DebugWriter for the '" .. name .. "'' preconditioner.") - print("Consider setting the 'approxSpace' property of your preconditioner,") - print("or alternatively the util.solver.defaults.approxSpace property or") - print("alternatively set the option 'debug=false' in your preconditioner.") - exit() - end - - local dbgWriter = GridFunctionDebugWriter(approxSpace) - dbgWriter:set_vtk_output(true) - rprecond:set_debug(dbgWriter) - end - - if desc then desc.instance = rprecond end - + -- check: + local rprecond = precond + if desc and desc.debugSolver then + print(solver) + local dsolver = + util.solver.CreateLinearSolver( + desc.debugSolver, solverutil) + + local err = GridFunction(approxSpace) + rprecond = DebugIterator(precond, dsolver) + rprecond:set_solution(err) + else + + end + + -- create debug writer (optional) + util.solver.SetDebugWriter(rprecond, desc, defaults) + + if desc then desc.instance = rprecond end + return rprecond end @@ -1008,6 +996,9 @@ end function util.solver.SetDebugWriter(obj, desc, defaults) local dbgDesc = desc.debug + if dbgDesc == nil then + dbgDesc = desc.debugSolver + end if dbgDesc == nil then if defaults then dbgDesc = defaults.debug end end @@ -1020,7 +1011,11 @@ function util.solver.SetDebugWriter(obj, desc, defaults) if type (dbgDesc) == "boolean" then debug = dbgDesc elseif type (dbgDesc) == "table" then - debug = true + if dbgDesc.debug ~= nil then + debug = dbgDesc.debug + else + debug = true + end if dbgDesc.vtk ~= nil then vtk = dbgDesc.vtk end if dbgDesc.conn_viewer ~= nil then conn_viewer = dbgDesc.conn_viewer end else @@ -1029,25 +1024,28 @@ function util.solver.SetDebugWriter(obj, desc, defaults) end if debug then - - local approxSpace = nil - if desc then - approxSpace = desc.approxSpace or util.solver.defaults.approxSpace - end - - if approxSpace == nil then - print("An ApproximationSpace is required to create a DebugWriter.") - print("Consider setting the 'approxSpace' property of of the object to debug,") - print("or alternatively the util.solver.defaults.approxSpace property.") - print("Otherwiese set the option 'debug=false' for the object.") - exit() - end - - local dbgWriter = GridFunctionDebugWriter(approxSpace) - dbgWriter:set_vtk_output(vtk) - dbgWriter:set_conn_viewer_output(conn_viewer) - obj:set_debug(dbgWriter) + if (util.debug_writer ~= nil) then + obj:set_debug(util.debug_writer) + else + local approxSpace = nil + if desc then + approxSpace = desc.approxSpace or util.solver.defaults.approxSpace + end + + if approxSpace == nil then + print("An ApproximationSpace is required to create the standard DebugWriter.") + print("Consider setting the 'approxSpace' property of of the object to debug,") + print("or alternatively the util.solver.defaults.approxSpace property.") + print("Otherwise set util.debug_writer to your own debug writer object.") + exit() + end + + local dbgWriter = GridFunctionDebugWriter(approxSpace) + dbgWriter:set_vtk_output(vtk) + dbgWriter:set_conn_viewer_output(conn_viewer) + obj:set_debug(dbgWriter) + end end end end diff --git a/scripts/util/time_step_util.lua b/scripts/util/time_step_util.lua index 1375ec2c6..7287d6cbd 100644 --- a/scripts/util/time_step_util.lua +++ b/scripts/util/time_step_util.lua @@ -305,7 +305,9 @@ function util.SolveNonlinearTimeProblem( while (endTime == nil or ((time < endTime) and ((endTime-time)/maxStepSize > relPrecisionBound))) and ((endTSNo == nil) or (step < endTSNo)) do step = step+1 print("++++++ TIMESTEP " .. step .. " BEGIN (current time: " .. time .. ") ++++++"); - + + local solver_call = 0; + -- initial t-step size local currdt = maxStepSize -- adjust in case of over-estimation @@ -334,7 +336,13 @@ function util.SolveNonlinearTimeProblem( pp_res = true if prepareTimeStep ~= nil then + if util.debug_writer ~= nil then + util.debug_writer:enter_section ("TIMESTEP-"..step.."-Prepare-SolverCall-"..solver_call) + end pp_res = prepareTimeStep(u, step, time, currdt) + if util.debug_writer ~= nil then + util.debug_writer:leave_section () + end if type(pp_res) == "boolean" and pp_res == false then -- i.e. not nil, not something else, but "false"! print("\n++++++ Preparation of the time step failed.") else @@ -350,7 +358,13 @@ function util.SolveNonlinearTimeProblem( -- call pre process if preProcess ~= nil then + if util.debug_writer ~= nil then + util.debug_writer:enter_section ("TIMESTEP-"..step.."-PreProcess-SolverCall-"..solver_call) + end pp_res = preProcess(u, step, time, currdt) + if util.debug_writer ~= nil then + util.debug_writer:leave_section () + end if type(pp_res) == "boolean" and pp_res == false then -- i.e. not nil, not something else, but "false"! print("\n++++++ PreProcess failed.") newtonSuccess = false @@ -363,6 +377,11 @@ function util.SolveNonlinearTimeProblem( -- setup time Disc for old solutions and timestep size timeDisc:prepare_step(solTimeSeries, currdt) + -- enter debug section (if the debug_writer is specified) + if util.debug_writer ~= nil then + util.debug_writer:enter_section ("TIMESTEP-"..step.."-SolverCall-"..solver_call) + end + -- prepare newton solver if newtonSolver:prepare(u) == false then print ("\n++++++ Newton solver failed."); exit(); @@ -371,12 +390,23 @@ function util.SolveNonlinearTimeProblem( -- apply newton solver newtonSuccess = newtonSolver:apply(u) + -- exit debug section (if the debug_writer is specified) + if util.debug_writer ~= nil then + util.debug_writer:leave_section () + end + -- start over again if failed if newtonSuccess == false then break end -- call post process if postProcess ~= nil then + if util.debug_writer ~= nil then + util.debug_writer:enter_section ("TIMESTEP-"..step.."-PostProcess-SolverCall-"..solver_call) + end pp_res = postProcess(u, step, timeDisc:future_time(), currdt) + if util.debug_writer ~= nil then + util.debug_writer:leave_section () + end if type(pp_res) == "boolean" and pp_res == false then -- i.e. not nil, not something else, but "false"! print("\n++++++ PostProcess failed.") newtonSuccess = false @@ -407,7 +437,13 @@ function util.SolveNonlinearTimeProblem( end -- loop over the stages if newtonSuccess and finalizeTimeStep ~= nil then + if util.debug_writer ~= nil then + util.debug_writer:enter_section ("TIMESTEP-"..step.."-Finalize-SolverCall-"..solver_call) + end pp_res = finalizeTimeStep(u, step, time, currdt) + if util.debug_writer ~= nil then + util.debug_writer:leave_section () + end if type(pp_res) == "boolean" and pp_res == false then -- i.e. not nil, not something else, but "false"! write("\n++++++ Finalization of the time step failed. ") newtonSuccess = false @@ -443,7 +479,13 @@ function util.SolveNonlinearTimeProblem( end bSuccess = false if rewindTimeStep ~= nil then + if util.debug_writer ~= nil then + util.debug_writer:enter_section ("TIMESTEP-"..step.."-Rewind-SolverCall-"..solver_call) + end rewindTimeStep(u, step, time, currdt) + if util.debug_writer ~= nil then + util.debug_writer:leave_section () + end end else -- update new time diff --git a/scripts/util/user_data_util.lua b/scripts/util/user_data_util.lua index 01c42a361..95c22c79f 100644 --- a/scripts/util/user_data_util.lua +++ b/scripts/util/user_data_util.lua @@ -486,6 +486,10 @@ for dim = 1,3 do -- only set if dimension is compiled (otherwise metatable does not exist) if ug_dim_compiled(dim) then set_user_data_overloads("DarcyVelocityLinker"..dim.."d") + set_user_data_overloads("BinghamViscosityLinker"..dim.."d") + set_user_data_overloads("UserTensor"..dim.."d") + set_user_data_overloads("UserTensorEntryAdapter"..dim.."d") + set_user_data_overloads("UserTensorColumnAdapter"..dim.."d") end end diff --git a/ug4.bib b/ug4.bib new file mode 100644 index 000000000..c33c73eee --- /dev/null +++ b/ug4.bib @@ -0,0 +1,32 @@ +# This file is part of UG4. +# +# If you use UG4 to produce results of your publications, you are obliged to +# cite ug4_ref1_2013 and ug4_ref2_2013. + +@article +{ ug4_ref1_2013, + author = {Reiter, Sebastian and Vogel, Andreas and Heppner, Ingo and Rupp, Martin and Wittum, Gabriel}, + title = {A massively parallel geometric multigrid solver on hierarchically distributed grids}, + journal = {Computing and Visualization in Science}, + year = 2013, + month = {August}, + volume = 16, + number = 4, + pages = {151--164}, + doi = {10.1007/s00791-014-0231-x} +} + +@article +{ ug4_ref2_2013, + author = {Vogel, Andreas and Reiter, Sebastian and Rupp, Martin and N{\"a}gel, Arne and Wittum, Gabriel}, + title = {UG 4: A novel flexible software system for simulating PDE based models on high performance computers}, + journal = {Computing and Visualization in Science}, + year = 2013, + month = {August}, + volume = 16, + number = 4, + pages = {165--179}, + doi = {10.1007/s00791-014-0232-9} +} + +# End of File diff --git a/ugbase/bindings/lua/info_commands.cpp b/ugbase/bindings/lua/info_commands.cpp index 71f005b9c..e87cf8ae7 100644 --- a/ugbase/bindings/lua/info_commands.cpp +++ b/ugbase/bindings/lua/info_commands.cpp @@ -1209,7 +1209,7 @@ bool PluginRequired(const char *name) { if(PluginLoaded(name) == false) { - string msg = string("plugin ") + name + string(" not loaded. Please use 'cmake -D") + name + string("=ON ..' in your build directory."); + string msg = string("plugin ") + name + string(" not loaded. Please use 'cmake -D") + name + string("=ON .' in your build directory."); std::string file; size_t line; if(GetLuaFileAndLine(script::GetDefaultLuaState(), file, line)) throw UGError(msg.c_str(), file.c_str(), line); diff --git a/ugbase/bindings/vrl/messaging.h b/ugbase/bindings/vrl/messaging.h index 919ac9dbe..8a1025506 100644 --- a/ugbase/bindings/vrl/messaging.h +++ b/ugbase/bindings/vrl/messaging.h @@ -58,18 +58,6 @@ namespace ug { namespace vrl { -/** - * DO NOT USE THIS METHOD! - * (totally broken) - * @param msg - */ -void soutPrintln(std::string msg); -/** - * DO NOT USE THIS METHOD! - * (totally broken) - * @param msg - */ -void serrPrintln(std::string msg); /** * Replaces each substring of target string that is equal to diff --git a/ugbase/bridge/CMakeLists.txt b/ugbase/bridge/CMakeLists.txt index 44354e91e..83ff4d8a0 100644 --- a/ugbase/bridge/CMakeLists.txt +++ b/ugbase/bridge/CMakeLists.txt @@ -83,7 +83,7 @@ if(buildAlgebra) algebra_bridges/solver_bridge.cpp algebra_bridges/eigensolver_bridge.cpp algebra_bridges/domain_dependent_preconditioner_bridge.cpp - algebra_bridges/constrained_linear_iterator_bridge.cpp + #algebra_bridges/constrained_linear_iterator_bridge.cpp algebra_bridges/pilut_bridge.cpp algebra_bridges/obstacle_bridge.cpp algebra_bridges/restart_bridge.cpp diff --git a/ugbase/bridge/algebra_bridges/bridge_mat_vec_operations.h b/ugbase/bridge/algebra_bridges/bridge_mat_vec_operations.h index c40d22592..d0f116cfd 100644 --- a/ugbase/bridge/algebra_bridges/bridge_mat_vec_operations.h +++ b/ugbase/bridge/algebra_bridges/bridge_mat_vec_operations.h @@ -183,6 +183,13 @@ double VecNorm(SmartPtr v) } +template +double VecMaxNorm(SmartPtr v) +{ + return v->maxnorm(); +} + + template double VecScaleAddNorm(SmartPtr > vsac) { diff --git a/ugbase/bridge/algebra_bridges/common_bridge.cpp b/ugbase/bridge/algebra_bridges/common_bridge.cpp index fbf685047..cbb043109 100644 --- a/ugbase/bridge/algebra_bridges/common_bridge.cpp +++ b/ugbase/bridge/algebra_bridges/common_bridge.cpp @@ -42,6 +42,7 @@ #include "bridge/util_algebra_dependent.h" // operator interfaces +#include "lib_algebra/operator/fixed_convergence_check.h" #include "lib_algebra/operator/interface/operator.h" #include "lib_algebra/operator/interface/matrix_operator.h" #include "lib_algebra/operator/interface/matrix_operator_inverse.h" @@ -161,6 +162,7 @@ static void Algebra(Registry& reg, string grp) reg.add_function("VecProd", &VecScaleAddProd1); reg.add_function("VecProd", &VecScaleAddProd2); reg.add_function("VecNorm", &VecNorm); + reg.add_function("VecMaxNorm", &VecMaxNorm); reg.add_function("VecNorm", &VecScaleAddNorm); reg.add_function("VecHadamardProd", (void (*)(vector_type&, const vector_type &, const vector_type &)) &VecHadamardProd, grp, "", "dst#vec1#vec2", "vec1 * vec2 (elementwise)"); @@ -205,7 +207,13 @@ static void Algebra(Registry& reg, string grp) { typedef IVectorDebugWriter T; string name = string("IVectorDebugWriter").append(suffix); - reg.add_class_(name, grp); + reg.add_class_(name, grp) + .add_method("get_context", static_cast (T::*) ()>(&T::get_context), "Gets the debugger writer context", "") + .add_method("set_context", &T::set_context, "Sets the debugger writer context", "context") + .add_method("set_base_dir", &T::set_base_dir, "Sets the base directory for output", "dir") + .add_method("enter_section", &T::enter_section, "Enters a debugging section", "dirName") + .add_method("leave_section", &T::leave_section, "Leaves the current debugging section", "") + ; reg.add_class_to_group(name, "IVectorDebugWriter", tag); } @@ -435,6 +443,19 @@ static void Algebra(Registry& reg, string grp) .set_construct_as_smart_pointer(true); reg.add_class_to_group(name, "EnergyConvCheck", tag); } + +// FixedConvCheck + { + typedef FixedConvergenceCheck T; + typedef IConvergenceCheck TBase; + string name = string("FixedConvergenceCheck").append(suffix); + reg.add_class_(name, grp, "Convergence Check") + // .add_constructor() + .template add_constructor("") + .set_construct_as_smart_pointer(true); + reg.add_class_to_group(name, "FixedConvergenceCheck", tag); + } + } @@ -458,6 +479,20 @@ static void Common(Registry& reg, string grp) reg.add_class_to_group("IPositionProvider2d", "IPositionProvider", GetDimensionTag<2>()); reg.add_class_to_group("IPositionProvider3d", "IPositionProvider", GetDimensionTag<3>()); } + +// Debug Writer Context + { + typedef DebugWriterContext T; + reg.add_class_("DebugWriterContext", grp) + .add_constructor() + .add_method("set_base_dir", &T::set_base_dir) + .add_method("get_base_dir", &T::get_base_dir) + .add_method("enter_section", &T::enter_section) + .add_method("leave_section", &T::leave_section) + .add_method("print_message", &T::leave_section) + .add_method("compose_file_path", &T::leave_section) + .set_construct_as_smart_pointer(true); + } } }; // end Functionality diff --git a/ugbase/bridge/algebra_bridges/solver_bridge.cpp b/ugbase/bridge/algebra_bridges/solver_bridge.cpp index 698560e4b..1e8269723 100644 --- a/ugbase/bridge/algebra_bridges/solver_bridge.cpp +++ b/ugbase/bridge/algebra_bridges/solver_bridge.cpp @@ -52,6 +52,7 @@ #include "lib_algebra/operator/linear_solver/lu.h" #include "lib_algebra/operator/linear_solver/agglomerating_solver.h" #include "lib_algebra/operator/linear_solver/debug_iterator.h" +#include "lib_algebra/operator/linear_solver/external_solvers/external_solvers.h" #ifdef UG_PARALLEL #include "lib_algebra/operator/linear_solver/feti.h" #endif @@ -318,6 +319,16 @@ static void Algebra(Registry& reg, string grp) } #endif + // ExternalSolver + { + typedef IExternalSolver T; + string name = string("ExternalSolver").append(suffix); + reg.add_class_(name, grp) + .add_method("set_disable_preprocessing", &T::set_disable_preprocessing, "", "", "") + .add_method("enable_consistent_interfaces", &T::enable_consistent_interfaces, "", "", ""); + + } + } diff --git a/ugbase/bridge/bridge.cpp b/ugbase/bridge/bridge.cpp index 623b6421f..c11d2ab76 100644 --- a/ugbase/bridge/bridge.cpp +++ b/ugbase/bridge/bridge.cpp @@ -249,7 +249,7 @@ void RegisterStandardBridges(Registry& reg, string parentGroup) RegisterBridge_Solver(reg, parentGroup); RegisterBridge_Eigensolver(reg, parentGroup); RegisterBridge_DomainDependentPreconditioner(reg, parentGroup); - RegisterBridge_ConstrainedLinearIterator(reg, parentGroup); + //RegisterBridge_ConstrainedLinearIterator(reg, parentGroup); RegisterBridge_Restart(reg, parentGroup); @@ -285,7 +285,6 @@ void RegisterStandardBridges(Registry& reg, string parentGroup) #endif #ifdef UG_DIM_3 if(!first) {availDims << ",";}; availDims << "3"; - first = false; #endif #ifdef UG_ALGEBRA diff --git a/ugbase/bridge/disc_bridges/adaptive_tools_bridge.cpp b/ugbase/bridge/disc_bridges/adaptive_tools_bridge.cpp index d65602c9c..e8c1c8b83 100644 --- a/ugbase/bridge/disc_bridges/adaptive_tools_bridge.cpp +++ b/ugbase/bridge/disc_bridges/adaptive_tools_bridge.cpp @@ -275,6 +275,7 @@ static void Domain(Registry& reg, string grp) typedef IElementMarkingStrategy TBase; string name = string("StdCoarseningMarking").append(suffix); reg.add_class_(name, grp) + .template add_constructor("tolerated max error#safety factor#min level") .template add_constructor("tolerated max error#safety factor") .template add_constructor("tolerated max error") .add_method("set_tolerance", &T::set_tolerance) diff --git a/ugbase/bridge/disc_bridges/algebra_bridge.cpp b/ugbase/bridge/disc_bridges/algebra_bridge.cpp index 87c9a32a7..527d432b6 100644 --- a/ugbase/bridge/disc_bridges/algebra_bridge.cpp +++ b/ugbase/bridge/disc_bridges/algebra_bridge.cpp @@ -279,6 +279,7 @@ static void Algebra(Registry& reg, string parentGroup) .add_method("set_line_search", &T::set_line_search, "", "lineSeach") .add_method("disable_line_search", &T::disable_line_search) .add_method("line_search", &T::line_search, "lineSeach", "") + .add_method("set_reassemble_J_freq", &T::set_reassemble_J_freq, "reassemble freq. for Jacobian") .add_method("init", &T::init, "success", "op") .add_method("prepare", &T::prepare, "success", "u") .add_method("apply", &T::apply, "success", "u") diff --git a/ugbase/bridge/disc_bridges/constraints_bridge.cpp b/ugbase/bridge/disc_bridges/constraints_bridge.cpp index c0c1b8bca..90d4a6bca 100644 --- a/ugbase/bridge/disc_bridges/constraints_bridge.cpp +++ b/ugbase/bridge/disc_bridges/constraints_bridge.cpp @@ -128,6 +128,9 @@ static void DomainAlgebra(Registry& reg, string grp) reg.add_class_(name, grp) .template add_constructor() .template add_constructor() +#ifdef LAGRANGE_DIRICHLET_ADJ_TRANSFER_FIX + .template add_constructor() +#endif .add_method("add", static_cast >, const char*, const char*)>(&T::add), "", "Value#Function#Subsets") .add_method("add", static_cast >, const std::vector&, const std::vector&)>(&T::add), diff --git a/ugbase/bridge/disc_bridges/grid_function_bridge.cpp b/ugbase/bridge/disc_bridges/grid_function_bridge.cpp index 521e51a0f..d728fcf56 100644 --- a/ugbase/bridge/disc_bridges/grid_function_bridge.cpp +++ b/ugbase/bridge/disc_bridges/grid_function_bridge.cpp @@ -239,6 +239,19 @@ static void DomainAlgebra(Registry& reg, string grp) reg.add_class_to_group(name, "IComponentSpace", tag); } + // GridFunctionComponentSpace + { + typedef GridFunctionComponentSpace T; + typedef IComponentSpace TBase; + + string name = string("GridFunctionComponentSpace").append(suffix); + reg.add_class_(name, grp) + .template add_constructor("function names") + .template add_constructor("function names, subset names") + .set_construct_as_smart_pointer(true); + reg.add_class_to_group(name, "GridFunctionComponentSpace", tag); + } + // L2ComponentSpace { typedef L2ComponentSpace T; @@ -259,6 +272,24 @@ static void DomainAlgebra(Registry& reg, string grp) reg.add_class_to_group(name, "L2ComponentSpace", tag); } + // L2QuotientSpace (= L2ComponentSpace which factors out constants) + { + typedef L2QuotientSpace T; + typedef IComponentSpace TBase; + typedef typename L2Integrand::weight_type TWeight; + + string name = string("L2QuotientSpace").append(suffix); + reg.add_class_(name, grp) + .template add_constructor("fctNames") + .template add_constructor("fctNames, order") + .template add_constructor("fctNames, order, weight") + .template add_constructor("fctNames, order, weight, ssNames") + .template add_constructor) >("fctNames, order, weight") + .template add_constructor, const char *) >("fctNames, order, weight, ssNames") + .set_construct_as_smart_pointer(true); + reg.add_class_to_group(name, "L2QuotientSpace", tag); + } + // H1SemiComponentSpace { typedef H1SemiComponentSpace T; @@ -334,6 +365,7 @@ static void DomainAlgebra(Registry& reg, string grp) reg.add_class_(name, grp) .template add_constructor("fctNames") .template add_constructor("fctNames, order") + .template add_constructor("fctNames, subsetNames, order") //.template add_constructor("fctNames, order, scale") .set_construct_as_smart_pointer(true); reg.add_class_to_group(name, "H1ComponentSpace", tag); @@ -385,6 +417,14 @@ static void DomainAlgebra(Registry& reg, string grp) reg.add_function("CheckDoFPositions", static_cast(CheckDoFPositions), grp); } +// ScaleGF + { + reg.add_function("ScaleGF", ScaleGF, grp, "", + "scaled output vector # input vector # vector of scaling factors for each function", + "Scales the input vector using the given scaling factors for each function and writes " + "the result to the output vector"); + } + // AverageFunctionDifference { typedef ug::GridFunction GF; diff --git a/ugbase/bridge/disc_bridges/integrate_bridge.cpp b/ugbase/bridge/disc_bridges/integrate_bridge.cpp index 3fba8551a..af8ad94ec 100644 --- a/ugbase/bridge/disc_bridges/integrate_bridge.cpp +++ b/ugbase/bridge/disc_bridges/integrate_bridge.cpp @@ -7,7 +7,7 @@ * UG4 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License version 3 (as published by the * Free Software Foundation) with the following additional attribution - * requirements (according to LGPL/GPL v3 §7): + * requirements (according to LGPL/GPL v3 ��7): * * (1) The following notice must be displayed in the Appropriate Legal Notices * of covered and combined works: "Based on UG4 (www.ug4.org/license)". @@ -20,7 +20,7 @@ * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively * parallel geometric multigrid solver on hierarchically distributed grids. * Computing and visualization in science 16, 4 (2013), 151-164" - * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * "Vogel, A., Reiter, S., Rupp, M., N��gel, A., and Wittum, G. UG4 -- a novel * flexible software system for simulating pde based models on high performance * computers. Computing and visualization in science 16, 4 (2013), 165-179" * @@ -165,7 +165,10 @@ static void DomainAlgebra(Registry& reg, string grp) reg.add_function("IntegralNormalComponentOnManifold", static_cast, const char*, const char*)>(&IntegralNormalComponentOnManifold), grp, "Integral", "LuaFunction#GridFunction#BoundarySubsets#InnerSubsets"); reg.add_function("IntegralNormalComponentOnManifold", static_cast, const char*)>(&IntegralNormalComponentOnManifold), grp, "Integral", "LuaFunction#GridFunction#BoundarySubsets"); #endif + { + reg.add_function("IntegrateNormalComponentOnManifold", static_cast(&IntegrateNormalComponentOnManifold),grp, "Integral", "GridFunction#Component#BoundarySubset"); } + } // IntegrateDiscFlux { diff --git a/ugbase/bridge/disc_bridges/multigrid_bridge.cpp b/ugbase/bridge/disc_bridges/multigrid_bridge.cpp index ec4afad14..6277caf35 100644 --- a/ugbase/bridge/disc_bridges/multigrid_bridge.cpp +++ b/ugbase/bridge/disc_bridges/multigrid_bridge.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2015: G-CSC, Goethe University Frankfurt + * Copyright (c) 2011-2018: G-CSC, Goethe University Frankfurt * Author: Andreas Vogel * * This file is part of UG4. @@ -35,6 +35,7 @@ #include #include + // include bridge #include "bridge/bridge.h" #include "bridge/util.h" @@ -50,7 +51,8 @@ #include "lib_disc/operator/linear_operator/multi_grid_solver/mg_solver.h" #include "lib_disc/operator/linear_operator/element_gauss_seidel/element_gauss_seidel.h" #include "lib_disc/operator/linear_operator/element_gauss_seidel/component_gauss_seidel.h" -//#include "lib_disc/operator/linear_operator/uzawa/uzawa.h" +#include "lib_disc/operator/linear_operator/subspace_correction/sequential_subspace_correction.h" +#include "lib_disc/operator/linear_operator/uzawa/uzawa.h" using namespace std; @@ -209,6 +211,7 @@ static void DomainAlgebra(Registry& reg, string grp) .add_method("set_comm_comp_overlap", &T::set_comm_comp_overlap) .add_method("ignore_init_for_base_solver", static_cast(&T::ignore_init_for_base_solver), "", "ignore") .add_method("ignore_init_for_base_solver", static_cast(&T::ignore_init_for_base_solver), "is ignored", "") + .add_method("force_reinit", &T::force_reinit) .set_construct_as_smart_pointer(true); reg.add_class_to_group(name, "GeometricMultiGrid", tag); } @@ -245,27 +248,58 @@ static void DomainAlgebra(Registry& reg, string grp) .set_construct_as_smart_pointer(true); reg.add_class_to_group(name, "ComponentGaussSeidel", tag); } -/* + + // SequentialSubspaceCorrection + { + typedef SequentialSubspaceCorrection T; + typedef IPreconditioner TBase; + string name = string("SequentialSubspaceCorrection").append(suffix); + reg.add_class_(name, grp, "Sequential subspace correction") + .template add_constructor("omega") + .add_method("set_vertex_subspace", &T::set_vertex_subspace, "", "subspace") + .set_construct_as_smart_pointer(true); + reg.add_class_to_group(name, "SequentialSubspaceCorrection", tag); + } + + + // ILocalSubspace (i.e. base class for any 'subspace' in subspace correction methods) + { + typedef ILocalSubspace TVertexSubspace; + string name = string("ILocalSubspace").append(suffix); + reg.add_class_(name, grp, "ILocalSubspace base"); + reg.add_class_to_group(name, "ILocalSubspace", tag); + + // VertexCenteredVankaSubspace + { + typedef VertexCenteredVankaSubspace T; + // typedef IPreconditioner TBase; + string name = string("VertexCenteredVankaSubspace").append(suffix); + reg.add_class_(name, grp, "Vertex centered Vanka") + .template add_constructor&, const std::vector&)>("primary functions, secondary functions") + .set_construct_as_smart_pointer(true); + reg.add_class_to_group(name, "VertexCenteredVankaSubspace", tag); + } + } + // Uzawa (smoother/iteration) - { - typedef UzawaBase T; - typedef ILinearIterator TBase; - typedef DebugWritingObject TBase2; - string name = string("UzawaBase").append(suffix); - - reg.add_class_(name, grp) - .ADD_CONSTRUCTOR( (const std::vector&) ) ("String ID for Schur") - .ADD_CONSTRUCTOR( (const char *) ) ("String ID for Schur") - .add_method("set_forward_iter", &T::set_forward_iter, "forward iteration", "beta") - .add_method("set_schur_iter", &T::set_schur_iter, "Schur iteration", "beta") - .add_method("set_backward_iter", &T::set_backward_iter, "backward iteration", "beta") - .add_method("set_schur_operator_update", &T::set_schur_operator_update, "update for Schur", "beta") - .set_construct_as_smart_pointer(true); - - reg.add_class_to_group(name, "UzawaBase", tag); - //std::cout <<"Registered "<< name << std::endl; - } -*/ + { + typedef UzawaBase T; + typedef ILinearIterator TBase; + typedef DebugWritingObject TBase2; + string name = string("UzawaBase").append(suffix); + + reg.add_class_(name, grp) + .ADD_CONSTRUCTOR( (const std::vector&) ) ("String IDs for Schur complement") + .ADD_CONSTRUCTOR( (const char *) ) ("String ID for Schur") + .add_method("set_forward_iter", &T::set_forward_iter, "forward iteration", "beta") + .add_method("set_schur_iter", &T::set_schur_iter, "Schur iteration", "beta") + .add_method("set_backward_iter", &T::set_backward_iter, "backward iteration", "beta") + .add_method("set_schur_operator_update", &T::set_schur_operator_update, "update for Schur", "beta") + .set_construct_as_smart_pointer(true); + + reg.add_class_to_group(name, "UzawaBase", tag); + } + } diff --git a/ugbase/bridge/disc_bridges/output_bridge.cpp b/ugbase/bridge/disc_bridges/output_bridge.cpp index 01555a046..73598f935 100644 --- a/ugbase/bridge/disc_bridges/output_bridge.cpp +++ b/ugbase/bridge/disc_bridges/output_bridge.cpp @@ -140,7 +140,6 @@ static void DomainAlgebra(Registry& reg, string grp) .add_method("set_conn_viewer_output", &T::set_conn_viewer_output, "", "bCVOutput") .add_method("set_conn_viewer_indices", &T::set_conn_viewer_indices, "", "bIndicesOutput") .add_method("set_print_consistent", &T::set_print_consistent, "", "printConsistent") - .add_method("set_base_dir", &T::set_base_dir, "", "") .add_method("set_grid_level", &T::set_grid_level, "Sets the grid level", "GridLevel") .set_construct_as_smart_pointer(true); reg.add_class_to_group(name, "GridFunctionDebugWriter", tag); @@ -268,6 +267,10 @@ static void Dimension(Registry& reg, string grp) .add_method("select_element", static_cast >, const char*)>(&T::select_element)) .add_method("select_element", static_cast, dim> >, const char*)>(&T::select_element)) .add_method("set_binary", &T::set_binary, "", "bBinary", "should values be printed in binary (base64 encoded way ) or plain ascii") + .add_method("set_user_defined_comment", static_cast(&T::set_user_defined_comment)) + .add_method("set_write_grid", static_cast(&T::set_write_grid)) + .add_method("set_write_subset_indices", static_cast(&T::set_write_subset_indices)) + .add_method("set_write_proc_ranks", static_cast(&T::set_write_proc_ranks)) .set_construct_as_smart_pointer(true); reg.add_class_to_group(name, "VTKOutput", tag); } diff --git a/ugbase/bridge/disc_bridges/user_data_bridge.cpp b/ugbase/bridge/disc_bridges/user_data_bridge.cpp index 6b47ddd1f..38637074a 100644 --- a/ugbase/bridge/disc_bridges/user_data_bridge.cpp +++ b/ugbase/bridge/disc_bridges/user_data_bridge.cpp @@ -47,6 +47,7 @@ #include "lib_disc/spatial_disc/user_data/linker/scale_add_linker.h" #include "lib_disc/spatial_disc/user_data/linker/inverse_linker.h" #include "lib_disc/spatial_disc/user_data/linker/darcy_velocity_linker.h" +#include "lib_disc/spatial_disc/user_data/linker/bingham_viscosity_linker.h" #include "lib_disc/spatial_disc/user_data/linker/projection_linker.h" #include "lib_disc/spatial_disc/user_data/user_function.h" #include "lib_disc/spatial_disc/user_data/common_user_data/common_user_data.h" @@ -303,6 +304,24 @@ static void Dimension(Registry& reg, string grp) reg.add_class_to_group(name, "DarcyVelocityLinker", dimTag); } +// BinghamViscosityLinker + { + typedef BinghamViscosityLinker T; + typedef DependentUserData TBase; + string name = string("BinghamViscosityLinker").append(dimSuffix); + reg.add_class_(name, grp) + .add_method("set_velocity_gradient", &T::set_velocity_gradient) + .add_method("set_yield_stress", static_cast(&T::set_yield_stress)) + .add_method("set_yield_stress", static_cast >)>(&T::set_yield_stress)) + .add_method("set_viscosity", static_cast(&T::set_viscosity)) + .add_method("set_viscosity", static_cast >)>(&T::set_viscosity)) + .add_method("set_density", static_cast(&T::set_density)) + .add_method("set_density", static_cast >)>(&T::set_density)) + .add_constructor() + .set_construct_as_smart_pointer(true); + reg.add_class_to_group(name, "BinghamViscosityLinker", dimTag); + } + // InverseLinker"Type" { typedef InverseLinker T; diff --git a/ugbase/bridge/domain_bridges/domain_bridge.cpp b/ugbase/bridge/domain_bridges/domain_bridge.cpp index dd1906f49..0b47708c4 100644 --- a/ugbase/bridge/domain_bridges/domain_bridge.cpp +++ b/ugbase/bridge/domain_bridges/domain_bridge.cpp @@ -112,17 +112,28 @@ static bool SavePartitionMap(PartitionMap& pmap, TDomain& domain, } +template +static bool TestDomainInterfaces(TDomain* dom, bool verbose) +{ + #ifdef UG_PARALLEL + return TestGridLayoutMap(*dom->grid(), + dom->distributed_grid_manager()->grid_layout_map(), verbose); + #endif + return true; +} + template static bool TestDomainInterfaces(TDomain* dom) { #ifdef UG_PARALLEL return TestGridLayoutMap(*dom->grid(), - dom->distributed_grid_manager()->grid_layout_map()); + dom->distributed_grid_manager()->grid_layout_map(), true); #endif return true; } + template static void ScaleDomain(TDomain& dom, number sx, number sy, number sz) { @@ -432,6 +443,9 @@ static void Domain(Registry& reg, string grp) // MaxElementDiameter reg.add_function("MaxElementDiameter", static_cast( &MaxElementDiameter), grp); +// MinElementDiameter + reg.add_function("MinElementDiameter", static_cast( + &MinElementDiameter), grp); // LoadDomain reg.add_function("LoadDomain", static_cast( @@ -497,7 +511,8 @@ static void Domain(Registry& reg, string grp) reg.add_function("GetMaxEdgeLength", &GetMaxEdgeLength, grp); reg.add_function("PrintElementEdgeRatios", static_cast(&PrintElementEdgeRatios), grp); // debugging - reg.add_function("TestDomainInterfaces", &TestDomainInterfaces, grp); + reg.add_function("TestDomainInterfaces", static_cast(&TestDomainInterfaces), grp); + reg.add_function("TestDomainInterfaces", static_cast(&TestDomainInterfaces), grp); reg.add_function("MinimizeMemoryFootprint", &MinimizeMemoryFootprint, grp); } diff --git a/ugbase/bridge/domain_bridges/load_balancing_bridge.cpp b/ugbase/bridge/domain_bridges/load_balancing_bridge.cpp index a0dc2a560..bf31c8d7b 100644 --- a/ugbase/bridge/domain_bridges/load_balancing_bridge.cpp +++ b/ugbase/bridge/domain_bridges/load_balancing_bridge.cpp @@ -315,6 +315,7 @@ static void Common(Registry& reg, string grp) { .add_method("set_partitioner", &T::set_partitioner) .add_method("create_quality_record", &T::create_quality_record) .add_method("print_quality_records", &T::print_quality_records) + .add_method("print_last_quality_record", &T::print_last_quality_record) .add_method("estimate_distribution_quality", static_cast(&T::estimate_distribution_quality)) .add_method("set_balance_weights", &T::set_balance_weights) .add_method("problems_occurred", &T::problems_occurred); diff --git a/ugbase/bridge/domain_bridges/refinement_bridge.cpp b/ugbase/bridge/domain_bridges/refinement_bridge.cpp index d725df54a..cae3fba61 100644 --- a/ugbase/bridge/domain_bridges/refinement_bridge.cpp +++ b/ugbase/bridge/domain_bridges/refinement_bridge.cpp @@ -49,6 +49,7 @@ #include "lib_grid/refinement/global_multi_grid_refiner.h" #include "lib_grid/refinement/hanging_node_refiner_multi_grid.h" #include "lib_grid/refinement/ref_mark_adjusters/horizontal_anisotropy_adjuster.h" +#include "lib_grid/refinement/ref_mark_adjusters/shadow_copy_adjuster.h" #include "lib_grid/algorithms/subdivision/subdivision_volumes.h" #include "lib_grid/grid_objects/tetrahedron_rules.h" #ifdef UG_PARALLEL @@ -212,6 +213,23 @@ AddHorizontalAnisotropyAdjuster(IRefiner* ref, TDomain* dom) } +/** + * @brief Adds a ShadowCopyAdjuster to the given refiner + * @param ref the refiner; has to be derived from HangingNodeRefiner_MultiGrid + */ +static SPIRefMarkAdjuster +AddShadowCopyAdjuster(IRefiner* ref) +{ + HangingNodeRefiner_MultiGrid* href = dynamic_cast(ref); + UG_COND_THROW(!href, "A ShadowCopyAdjuster can only be added to an instance of HangingNodeRefiner_MultiGrid."); + + SmartPtr sca = make_sp(new ShadowCopyAdjuster()); + + href->add_ref_mark_adjuster(sca); + return sca; +} + + // //////////////////////////////////////////////////////////////////////////////// // /// marks face for anisotropic refinement, if it contains edges below given sizeRatio @@ -297,9 +315,9 @@ static void MarkForRefinement_AllAnisotropic(SmartPtr ref) //////////////////////////////////////////////////////////////////////////////// /// Marks all vertices in the given d-dimensional sphere. template -void MarkForAdaption_VerticesInSphere(TDomain& dom, SmartPtr refiner, +void MarkForAdaption_VerticesInSphereMaxLvl(TDomain& dom, SmartPtr refiner, const typename TDomain::position_type& center, - number radius, std::string markType) + number radius, std::string markType, int maxLvl) { PROFILE_FUNC_GROUP("grid"); typedef typename TDomain::position_accessor_type position_accessor_type; @@ -312,7 +330,10 @@ void MarkForAdaption_VerticesInSphere(TDomain& dom, SmartPtr refiner, "Refiner was not created for the specified domain. Aborting.")); } + typedef typename TDomain::grid_type TGrid; + Grid& grid = *refiner->get_associated_grid(); + TGrid& g = *dom.grid(); position_accessor_type& aaPos = dom.position_accessor(); // we'll compare against the square radius. @@ -328,6 +349,10 @@ void MarkForAdaption_VerticesInSphere(TDomain& dom, SmartPtr refiner, for(VertexIterator iter = grid.begin(); iter != grid.end(); ++iter) { + int lvl = g.get_level(*iter); + if(maxLvl >= 0 && lvl >= maxLvl) + continue; + if(VecDistanceSq(center, aaPos[*iter]) <= radiusSq){ CollectAssociated(vEdges, grid, *iter); CollectAssociated(vFaces, grid, *iter); @@ -345,7 +370,15 @@ void MarkForRefinement_VerticesInSphere(TDomain& dom, SmartPtr refiner const typename TDomain::position_type& center, number radius) { - MarkForAdaption_VerticesInSphere(dom, refiner, center, radius, "refine"); + MarkForAdaption_VerticesInSphereMaxLvl(dom, refiner, center, radius, "refine", -1); +} + +template +void MarkForAdaption_VerticesInSphere(TDomain& dom, SmartPtr refiner, + const typename TDomain::position_type& center, + number radius, std::string markType, int maxLvl) +{ + MarkForAdaption_VerticesInSphereMaxLvl(dom, refiner, center, radius, markType, -1); } //////////////////////////////////////////////////////////////////////////////// @@ -839,17 +872,106 @@ void MarkAnisotropic_LongEdges(TDomain& dom, IRefiner& refiner, number minLen) // refiner->mark(volumes.begin(), volumes.end(), RM_ANISOTROPIC); // } -static number DistanceToSurfaceDomain(MathVector<1>& tpos, const Vertex* vrt, +//////////////////////////////////////////////////////////////////////////////// +/// Marks all elements which have vertices in the given d-dimensional cube. +/** Make sure that TAPos is an attachment of vector_t position types.*/ +template +void AssignSubset_VerticesInCube(TDomain& dom, + const typename TDomain::position_type& min, + const typename TDomain::position_type& max, int si) +{ + typedef typename TDomain::position_type position_type; + typedef typename TDomain::position_accessor_type position_accessor_type; + + Grid& grid = *dom.grid(); + position_accessor_type& aaPos = dom.position_accessor(); + MGSubsetHandler& sh = *dom.subset_handler(); + +// iterate over all vertices of the grid. If a vertex is inside the given cube, +// then we'll mark all associated elements. + for(VertexIterator iter = grid.begin(); + iter != grid.end(); ++iter) + { + // Position + position_type& pos = aaPos[*iter]; + + // check flag + bool bInside = true; + + // check node + for(size_t d = 0; d < pos.size(); ++d) + if(pos[d] < min[d] || max[d] < pos[d]) + bInside = false; + + if(bInside) + { + sh.assign_subset(*iter, si); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +/// Marks all elements which have vertices in the given d-dimensional cube. +/** Make sure that TAPos is an attachment of vector_t position types.*/ +template +void AssignSubset_VerticesInSphere(TDomain& dom, + const typename TDomain::position_type& center, + const number radius, int si) +{ + typedef typename TDomain::position_type position_type; + typedef typename TDomain::position_accessor_type position_accessor_type; + + Grid& grid = *dom.grid(); + position_accessor_type& aaPos = dom.position_accessor(); + MGSubsetHandler& sh = *dom.subset_handler(); + +// iterate over all vertices of the grid. If a vertex is inside the given cube, +// then we'll mark all associated elements. + for(VertexIterator iter = grid.begin(); + iter != grid.end(); ++iter) + { + // Position + position_type& pos = aaPos[*iter]; + + // check flag + bool bInside = true; + + // check node + number normSq = 0.0; + for(int d = 0; d < TDomain::dim; ++d){ + normSq += (pos[d] - center[d])*(pos[d] - center[d]); + } + number dist = sqrt( normSq ); + + if(dist >= radius) + bInside = false; + + if(bInside) + { + sh.assign_subset(*iter, si); + } + } +} + + +#ifdef UG_DIM_1 +static number DistanceToSurfaceDomain(MathVector<1>& tpos, const Vertex* vrt, Grid::VertexAttachmentAccessor > >& aaPosSurf) { UG_THROW("Not implemented"); } -static number DistanceToSurfaceDomain(MathVector<2>& tpos, const Edge* edge, +#endif + +#ifdef UG_DIM_2 +static number DistanceToSurfaceDomain(MathVector<2>& tpos, const Edge* edge, Grid::VertexAttachmentAccessor > >& aaPosSurf) { return DistancePointToLine(tpos , aaPosSurf[edge->vertex(0)], aaPosSurf[edge->vertex(1)]); } -static number DistanceToSurfaceDomain(MathVector<3>& tpos, const Face* face, +#endif + +#ifdef UG_DIM_3 +static number DistanceToSurfaceDomain(MathVector<3>& tpos, const Face* face, Grid::VertexAttachmentAccessor > >& aaPosSurf) { @@ -863,6 +985,7 @@ static number DistanceToSurfaceDomain(MathVector<3>& tpos, const Face* face, tpos, aaPosSurf[face->vertex(0)], aaPosSurf[face->vertex(1)], aaPosSurf[face->vertex(2)], n); } +#endif template void MarkForRefinement_CloseToSurface(TDomain& dom, SmartPtr refiner, @@ -871,7 +994,7 @@ void MarkForRefinement_CloseToSurface(TDomain& dom, SmartPtr refiner, { PROFILE_FUNC(); typedef typename TDomain::grid_type TGrid; - typedef typename TDomain::subset_handler_type TSubsetHandler; + //typedef typename TDomain::subset_handler_type TSubsetHandler; typedef typename TDomain::position_type TPos; typedef typename TDomain::position_accessor_type TAAPos; typedef typename domain_traits::element_type TElem; @@ -937,8 +1060,8 @@ void MarkForRefinement_ContainsSurfaceNode(TDomain& dom, SmartPtr refi { PROFILE_FUNC(); typedef typename TDomain::grid_type TGrid; - typedef typename TDomain::subset_handler_type TSubsetHandler; - typedef typename TDomain::position_type TPos; + //typedef typename TDomain::subset_handler_type TSubsetHandler; + //typedef typename TDomain::position_type TPos; typedef typename TDomain::position_accessor_type TAAPos; typedef typename domain_traits::element_type TElem; typedef typename domain_traits::side_type TSide; @@ -1532,10 +1655,12 @@ void SetSmoothSubdivisionVolumesBoundaryRefinementRule(std::string bndRefRule) SetBoundaryRefinementRule(SUBDIV_SURF_LOOP_SCHEME); else if(bndRefRule.compare("subdiv_surf_averaging_scheme") == 0) SetBoundaryRefinementRule(SUBDIV_SURF_AVERAGING_SCHEME); + else if(bndRefRule.compare("subdiv_surf_butterfly_scheme") == 0) + SetBoundaryRefinementRule(SUBDIV_SURF_BUTTERFLY_SCHEME); else if(bndRefRule.compare("subdiv_vol") == 0) SetBoundaryRefinementRule(SUBDIV_VOL); else - UG_THROW("ERROR in SetBoundaryRefinementRule: Unknown boundary refinement rule! Known rules are: 'linear', 'subdiv_surf_loop_scheme', 'subdiv_surf_averaging_scheme' or 'subdiv_vol'."); + UG_THROW("ERROR in SetBoundaryRefinementRule: Unknown boundary refinement rule! Known rules are: 'linear', 'subdiv_surf_loop_scheme', 'subdiv_surf_averaging_scheme', 'subdiv_surf_butterfly_scheme' or 'subdiv_vol'."); } @@ -1589,6 +1714,9 @@ static void Common(Registry& reg, string grp) .add_function("MarkNeighborsForAnisotropicRefinement", &MarkNeighborsForAnisotropicRefinement, grp, "", "refiner#sideNeighborsOnly"); + + reg.add_function("AddShadowCopyAdjuster", &AddShadowCopyAdjuster, grp, "", "refiner"); + } /** @@ -1604,7 +1732,7 @@ template static void Domain(Registry& reg, string grp) { typedef TDomain domain_type; - typedef typename TDomain::position_attachment_type apos_type; + //typedef typename TDomain::position_attachment_type apos_type; string suffix = GetDomainSuffix(); string tag = GetDomainTag(); @@ -1629,6 +1757,9 @@ static void Domain(Registry& reg, string grp) .add_function("MarkForAdaption_VerticesInSphere", &MarkForAdaption_VerticesInSphere, grp, "", "dom#refiner#center#radius#adaption_type") + .add_function("MarkForAdaption_VerticesInSphereMaxLvl", + &MarkForAdaption_VerticesInSphereMaxLvl, grp, + "", "dom#refiner#center#radius#adaption_type") .add_function("MarkForRefinement_EdgesInSphere", &MarkForRefinement_ElementsInSphere, grp, "", "dom#refiner#center#radius") @@ -1704,6 +1835,12 @@ static void Domain(Registry& reg, string grp) grp, "", "") .add_function("MarkForRefinement_ContainsSurfaceNode", &MarkForRefinement_ContainsSurfaceNode, + grp, "", "") + .add_function("AssignSubset_VerticesInCube", + &AssignSubset_VerticesInCube, + grp, "", "") + .add_function("AssignSubset_VerticesInSphere", + &AssignSubset_VerticesInSphere, grp, "", ""); diff --git a/ugbase/bridge/domain_bridges/transform_bridge.cpp b/ugbase/bridge/domain_bridges/transform_bridge.cpp index edb932d29..a04dc40b6 100644 --- a/ugbase/bridge/domain_bridges/transform_bridge.cpp +++ b/ugbase/bridge/domain_bridges/transform_bridge.cpp @@ -121,8 +121,9 @@ void ScaleDomain(TDomain& dom, ISelector& sel, const vector3& center, vector vrts; CollectVerticesTouchingSelection(vrts, sel); - if(vrts.empty()) + if(vrts.empty()){ return; + } for(size_t i = 0; i < vrts.size(); ++i){ pos_t& v = aaPos[vrts[i]]; diff --git a/ugbase/bridge/misc_bridges/vec_math_bridge.cpp b/ugbase/bridge/misc_bridges/vec_math_bridge.cpp index 66c86d7ed..af7922135 100644 --- a/ugbase/bridge/misc_bridges/vec_math_bridge.cpp +++ b/ugbase/bridge/misc_bridges/vec_math_bridge.cpp @@ -103,45 +103,53 @@ static void RegisterVecMathBridge_DimIndep(Registry& reg, string grp) typedef MathVector<1, number> vec_type; reg.add_class_("Vec1d", grp) .add_constructor() +#ifndef UG_FOR_VRL // TODO can we add all constructors to base class of class group? For now, use MakeVec for Java API. .add_constructor() +#endif .add_method("set_coord", &vec_type::set_coord, "", "index # value", "sets the value of the coordinate with the given index") .add_method("coord", static_cast(&vec_type::coord)); - //reg.add_class_to_group("Vec1d", "Vec", GetDimensionTag<1>()); + reg.add_class_to_group("Vec1d", "Vec", GetDimensionTag<1>()); } { typedef MathVector<2, number> vec_type; reg.add_class_("Vec2d", grp) .add_constructor() +#ifndef UG_FOR_VRL // TODO can we add all constructors to base class of class group? For now, use MakeVec for Java API. .add_constructor() +#endif .add_method("set_coord", &vec_type::set_coord, "", "index # value", "sets the value of the coordinate with the given index") .add_method("coord", static_cast(&vec_type::coord)); - //reg.add_class_to_group("Vec2d", "Vec", GetDimensionTag<2>()); + reg.add_class_to_group("Vec2d", "Vec", GetDimensionTag<2>()); } { typedef MathVector<3, number> vec_type; reg.add_class_("Vec3d", grp) .add_constructor() +#ifndef UG_FOR_VRL // TODO can we add all constructors to base class of class group? For now, use MakeVec for Java API. .add_constructor() +#endif .add_method("set_coord", &vec_type::set_coord, "", "index # value", "sets the value of the coordinate with the given index") .add_method("coord", static_cast(&vec_type::coord)); - //reg.add_class_to_group("Vec3d", "Vec", GetDimensionTag<3>()); + reg.add_class_to_group("Vec3d", "Vec", GetDimensionTag<3>()); } { typedef MathVector<4, number> vec_type; reg.add_class_("Vec4d", grp) .add_constructor() +#ifndef UG_FOR_VRL // TODO can we add all constructors to base class of class group? For now, use MakeVec for Java API. .add_constructor() +#endif .add_method("set_coord", &vec_type::set_coord, "", "index # value", "sets the value of the coordinate with the given index") .add_method("coord", static_cast(&vec_type::coord)); - //reg.add_class_to_group("Vec4d", "Vec", GetDimensionTag<4>()); + reg.add_class_to_group("Vec4d", "Vec", GetDimensionTag<4>()); } // register make-methods diff --git a/ugbase/common/debug_id.cpp b/ugbase/common/debug_id.cpp index 0b326073b..88277f78c 100644 --- a/ugbase/common/debug_id.cpp +++ b/ugbase/common/debug_id.cpp @@ -34,6 +34,7 @@ #include "common/log.h" #include "common/error.h" #include "common/assert.h" +#include #include #include "util/string_util.h" @@ -110,6 +111,8 @@ register_debug_id(const char *debugID) else { // not quite clear if cout is defined yet. + // --> it should be, if we define it in this header! + std::cout << "FATAL ERROR: DebugID "<(pex)) ss << "bad_alloc exception: " << pex->what() << "\nThis is mostly caused by an OUT OF MEMORY - condition.\n"\ - << "You might have to reduce your problem size, go parallel or increase memory."; + << "You might have to reduce your problem size, go parallel or increase memory."; if(dynamic_cast(pex)) ss << "bad_typeid exception: " << pex->what(); else if(dynamic_cast(pex)) - ss << "bad_cast exception: " << pex->what() << "\nThis is caused by a Casting error in classes:" - "An object is expected to be be or derive from Class A, but is not."; + ss << "bad_cast exception: " << pex->what() << "\nThis is caused by a casting error in classes: " + "An object is expected to be be or derive from class A, but is not."; else if(dynamic_cast(pex)) ss << "bad_exception exception: " << pex->what() << "\nException thrown by unexpected handler."; else if(dynamic_cast(pex)) diff --git a/ugbase/common/error.h b/ugbase/common/error.h index b09b230f9..872d1f5ee 100644 --- a/ugbase/common/error.h +++ b/ugbase/common/error.h @@ -66,6 +66,22 @@ void ug_throw_error(); catch(const std::exception& ex) { std::stringstream __ss; __ss << msg;\ throw ug::UGError(__ss.str(), ex,__FILE__,__LINE__); } +#define UG_CATCH_PRINT(msg) \ + catch (ug::UGError& err)\ + {\ + std::stringstream __ss;\ + __ss << msg;\ + err.push_msg(__ss.str(), __FILE__, __LINE__);\ + UG_LOG(err.get_stacktrace());\ + }\ + catch (const std::exception& ex)\ + {\ + std::stringstream __ss;\ + __ss << msg;\ + ug::UGError err(__ss.str(), ex, __FILE__, __LINE__);\ + UG_LOG(err.get_stacktrace());\ + } + #define UG_CATCH_THROW_FUNC() UG_CATCH_THROW(PRETTY_FUNCTION << "failed. ") // end group ugbase_common diff --git a/ugbase/common/log.h b/ugbase/common/log.h index ed1af90fe..33a13a557 100644 --- a/ugbase/common/log.h +++ b/ugbase/common/log.h @@ -333,6 +333,24 @@ inline std::string ConvertNumberSI (uint64_t size, unsigned int width, #endif +// Usage: +/* The following macro can be used to print warning messages if condition is met. + * To use it the define 'UG_ENABLE_WARNINGS' must be set. Otherwise nothing will + * be done (no runtime overhead). + * + * UG_WARNING(cond, msg) - prints a warning to the normal output stream + */ +#ifdef UG_ENABLED_WARNINGS + #define UG_COND_WARNING(cond, msg) {if (cond) {ug::GetLogAssistant().logger()\ + << "UG_WARNING in " << __FILE__ << " at line " \ + __LINE__ << ": " << msg << std::flush;}} +#else + #define UG_COND_WARNING(cond, msg) {} +#endif + + + + //////////////////////////////////////////////////////////////////////////////// // LOG @@ -346,10 +364,10 @@ inline std::string ConvertNumberSI (uint64_t size, unsigned int width, #define VRL_LOG(msg) #endif - #define UG_LOG(msg) {ug::GetLogAssistant().logger() << msg << std::flush; VRL_LOG(msg);} +#define UG_COND_LOG(cond, msg) { if (cond) { UG_LOG(msg); } } #define UG_LOGN(msg) UG_LOG(msg << "\n") - +#define UG_COND_LOGN(cond, msg) { if (cond) { UG_LOGN(msg); } } #define UG_LOG_ALL_PROCS(msg) {ug::LogAssistant& la = ug::GetLogAssistant();\ int op = la.get_output_process(); la.set_output_process(-1);\ la.logger() << "[Proc " << std::setw(3) << la.get_process_rank() << "]: "\ diff --git a/ugbase/common/math/math_vector_matrix/math_matrix_functions_common_impl.hpp b/ugbase/common/math/math_vector_matrix/math_matrix_functions_common_impl.hpp index 87ab285a7..d2fe1a606 100644 --- a/ugbase/common/math/math_vector_matrix/math_matrix_functions_common_impl.hpp +++ b/ugbase/common/math/math_vector_matrix/math_matrix_functions_common_impl.hpp @@ -7,7 +7,7 @@ * UG4 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License version 3 (as published by the * Free Software Foundation) with the following additional attribution - * requirements (according to LGPL/GPL v3 §7): + * requirements (according to LGPL/GPL v3 ��7): * * (1) The following notice must be displayed in the Appropriate Legal Notices * of covered and combined works: "Based on UG4 (www.ug4.org/license)". @@ -20,7 +20,7 @@ * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively * parallel geometric multigrid solver on hierarchically distributed grids. * Computing and visualization in science 16, 4 (2013), 151-164" - * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * "Vogel, A., Reiter, S., Rupp, M., N��gel, A., and Wittum, G. UG4 -- a novel * flexible software system for simulating pde based models on high performance * computers. Computing and visualization in science 16, 4 (2013), 165-179" * @@ -409,7 +409,7 @@ template inline typename MathMatrix<3,3,T>::value_type Determinant(const MathMatrix<3,3,T>& m) { - return m(0,0)*m(1,1)*m(2,2) + return m(0,0)*m(1,1)*m(2,2) + m(0,1)*m(1,2)*m(2,0) + m(0,2)*m(1,0)*m(2,1) - m(0,0)*m(1,2)*m(2,1) @@ -417,6 +417,24 @@ Determinant(const MathMatrix<3,3,T>& m) - m(0,2)*m(1,1)*m(2,0); } +template +inline typename MathMatrix<4,4,T>::value_type +Determinant(const MathMatrix<4,4,T>& m) +{ + return m(0,3)*m(1,2)*m(2,1)*m(3,0)-m(0,2)*m(1,3)*m(2,1)*m(3,0) + - m(0,3)*m(1,1)*m(2,2)*m(3,0)+m(0,1)*m(1,3)*m(2,2)*m(3,0) + + m(0,2)*m(1,1)*m(2,3)*m(3,0)-m(0,1)*m(1,2)*m(2,3)*m(3,0) + - m(0,3)*m(1,2)*m(2,0)*m(3,1)+m(0,2)*m(1,3)*m(2,0)*m(3,1) + + m(0,3)*m(1,0)*m(2,2)*m(3,1)-m(0,0)*m(1,3)*m(2,2)*m(3,1) + - m(0,2)*m(1,0)*m(2,3)*m(3,1)+m(0,0)*m(1,2)*m(2,3)*m(3,1) + + m(0,3)*m(1,1)*m(2,0)*m(3,2)-m(0,1)*m(1,3)*m(2,0)*m(3,2) + - m(0,3)*m(1,0)*m(2,1)*m(3,2)+m(0,0)*m(1,3)*m(2,1)*m(3,2) + + m(0,1)*m(1,0)*m(2,3)*m(3,2)-m(0,0)*m(1,1)*m(2,3)*m(3,2) + - m(0,2)*m(1,1)*m(2,0)*m(3,3)+m(0,1)*m(1,2)*m(2,0)*m(3,3) + + m(0,2)*m(1,0)*m(2,1)*m(3,3)-m(0,0)*m(1,2)*m(2,1)*m(3,3) + - m(0,1)*m(1,0)*m(2,2)*m(3,3)+m(0,0)*m(1,1)*m(2,2)*m(3,3); +} + //////////////////////////////////////////////////////////////////////////////// // Gram Determinant of Matrix //////////////////////////////////////////////////////////////////////////////// diff --git a/ugbase/common/math/math_vector_matrix/math_matrix_vector_functions_common_impl.hpp b/ugbase/common/math/math_vector_matrix/math_matrix_vector_functions_common_impl.hpp index c992ccc67..96325b353 100644 --- a/ugbase/common/math/math_vector_matrix/math_matrix_vector_functions_common_impl.hpp +++ b/ugbase/common/math/math_vector_matrix/math_matrix_vector_functions_common_impl.hpp @@ -34,6 +34,7 @@ #define __H__LGMATH__MATRIX_VECTOR_FUNCTIONS_COMMON_IMPL__ #include +#include "common/error.h" #include "math_matrix.h" #include "math_vector.h" diff --git a/ugbase/common/math/math_vector_matrix/math_vector.h b/ugbase/common/math/math_vector_matrix/math_vector.h index fed429970..3f873cce6 100644 --- a/ugbase/common/math/math_vector_matrix/math_vector.h +++ b/ugbase/common/math/math_vector_matrix/math_vector.h @@ -7,7 +7,7 @@ * UG4 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License version 3 (as published by the * Free Software Foundation) with the following additional attribution - * requirements (according to LGPL/GPL v3 §7): + * requirements (according to LGPL/GPL v3 ��7): * * (1) The following notice must be displayed in the Appropriate Legal Notices * of covered and combined works: "Based on UG4 (www.ug4.org/license)". @@ -20,7 +20,7 @@ * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively * parallel geometric multigrid solver on hierarchically distributed grids. * Computing and visualization in science 16, 4 (2013), 151-164" - * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * "Vogel, A., Reiter, S., Rupp, M., N��gel, A., and Wittum, G. UG4 -- a novel * flexible software system for simulating pde based models on high performance * computers. Computing and visualization in science 16, 4 (2013), 165-179" * @@ -130,6 +130,9 @@ class MathVector MathVector& operator*= (const value_type& val) {for(std::size_t i = 0; i < N; ++i) m_data[i] *= val;return *this;} MathVector& operator/= (const value_type& val) {for(std::size_t i = 0; i < N; ++i) m_data[i] /= val;return *this;} + // negation + MathVector operator- () const { MathVector v; for (std::size_t i = 0; i < N; ++i) v.set_coord(i, -m_data[i]); return v; } + // scalar product value_type operator* (const MathVector& v) const {value_type res = 0.0; for(std::size_t i = 0; i < N; ++i) res += m_data[i] * v.coord(i);return res;} @@ -194,6 +197,9 @@ class MathVector<0, T> MathVector& operator*= (const value_type& val) {m_data[0] *= val;return *this;} MathVector& operator/= (const value_type& val) {m_data[0] /= val;return *this;} + // negation + MathVector& operator- () { return MathVector<0, T>(-m_data[0]); } + // scalar product value_type operator* (const MathVector& v) const {return m_data[0] * v.x();} @@ -258,6 +264,9 @@ class MathVector<1, T> MathVector& operator*= (const value_type& val) {m_data[0] *= val;return *this;} MathVector& operator/= (const value_type& val) {m_data[0] /= val;return *this;} + // negation + MathVector operator- () const { return MathVector<1, T>(-m_data[0]); } + // scalar product value_type operator* (const MathVector& v) const {return m_data[0] * v.x();} @@ -324,6 +333,9 @@ class MathVector<2, T> MathVector& operator*= (const value_type& val) {for(std::size_t i = 0; i < 2; ++i) m_data[i] *= val;return *this;} MathVector& operator/= (const value_type& val) {for(std::size_t i = 0; i < 2; ++i) m_data[i] /= val;return *this;} + // negation + MathVector operator- () const { return MathVector<2, T>(-m_data[0], -m_data[1]); } + // scalar product value_type operator* (const MathVector& v) const {value_type res = 0.0; for(std::size_t i = 0; i < 2; ++i) res += m_data[i] * v.coord(i);return res;} @@ -394,6 +406,9 @@ class MathVector<3, T> MathVector& operator*= (const value_type& val) {for(std::size_t i = 0; i < 3; ++i) m_data[i] *= val;return *this;} MathVector& operator/= (const value_type& val) {for(std::size_t i = 0; i < 3; ++i) m_data[i] /= val;return *this;} + // negation + MathVector operator- () const { return MathVector<3, T>(-m_data[0], -m_data[1], -m_data[2]); } + // scalar product value_type operator* (const MathVector& v) const {value_type res = 0.0; for(std::size_t i = 0; i < 3; ++i) res += m_data[i] * v.coord(i);return res;} @@ -470,6 +485,9 @@ class MathVector<4, T> MathVector& operator*= (const value_type& val) {for(std::size_t i = 0; i < 4; ++i) m_data[i] *= val;return *this;} MathVector& operator/= (const value_type& val) {for(std::size_t i = 0; i < 4; ++i) m_data[i] /= val;return *this;} + // negation + MathVector operator- () const { return MathVector<4, T>(-m_data[0], -m_data[1], -m_data[2], -m_data[3]); } + // scalar product value_type operator* (const MathVector& v) const {value_type res = 0.0; for(std::size_t i = 0; i < 4; ++i) res += m_data[i] * v.coord(i);return res;} diff --git a/ugbase/common/math/math_vector_matrix/math_vector_functions.h b/ugbase/common/math/math_vector_matrix/math_vector_functions.h index 0b8c37902..27943ddbc 100644 --- a/ugbase/common/math/math_vector_matrix/math_vector_functions.h +++ b/ugbase/common/math/math_vector_matrix/math_vector_functions.h @@ -7,7 +7,7 @@ * UG4 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License version 3 (as published by the * Free Software Foundation) with the following additional attribution - * requirements (according to LGPL/GPL v3 §7): + * requirements (according to LGPL/GPL v3 ��7): * * (1) The following notice must be displayed in the Appropriate Legal Notices * of covered and combined works: "Based on UG4 (www.ug4.org/license)". @@ -20,7 +20,7 @@ * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively * parallel geometric multigrid solver on hierarchically distributed grids. * Computing and visualization in science 16, 4 (2013), 151-164" - * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * "Vogel, A., Reiter, S., Rupp, M., N��gel, A., and Wittum, G. UG4 -- a novel * flexible software system for simulating pde based models on high performance * computers. Computing and visualization in science 16, 4 (2013), 165-179" * @@ -157,6 +157,13 @@ inline void VecSubtract(vector_t& vOut, const vector_t& v1, const vector_t& v2); +//////////////////////////////////////////////////////////////// +// Component-wise exponentiation of a vector +template +inline +void +VecPow(vector_t& vOut, const vector_t& v1, typename vector_t::value_type s); + //////////////////////////////////////////////////////////////// // Scaling of a Vector diff --git a/ugbase/common/math/math_vector_matrix/math_vector_functions_common_impl.hpp b/ugbase/common/math/math_vector_matrix/math_vector_functions_common_impl.hpp index 5b7283185..21966d08a 100644 --- a/ugbase/common/math/math_vector_matrix/math_vector_functions_common_impl.hpp +++ b/ugbase/common/math/math_vector_matrix/math_vector_functions_common_impl.hpp @@ -7,7 +7,7 @@ * UG4 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License version 3 (as published by the * Free Software Foundation) with the following additional attribution - * requirements (according to LGPL/GPL v3 §7): + * requirements (according to LGPL/GPL v3 ��7): * * (1) The following notice must be displayed in the Appropriate Legal Notices * of covered and combined works: "Based on UG4 (www.ug4.org/license)". @@ -20,7 +20,7 @@ * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively * parallel geometric multigrid solver on hierarchically distributed grids. * Computing and visualization in science 16, 4 (2013), 151-164" - * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel + * "Vogel, A., Reiter, S., Rupp, M., N��gel, A., and Wittum, G. UG4 -- a novel * flexible software system for simulating pde based models on high performance * computers. Computing and visualization in science 16, 4 (2013), 165-179" * @@ -232,6 +232,19 @@ VecSubtract(vector_t& vOut, const vector_t& v1, const vector_t& v2) } } +/// component-wise exponentiation of a vector +template +inline +void +VecPow(vector_t& vOut, const vector_t& v1, typename vector_t::value_type s) +{ + typedef typename vector_t::size_type size_type; + for(size_type i = 0; i < vOut.size(); ++i) + { + vOut[i] = std::pow(v1[i], s); + } +} + /// scales a MathVector template inline diff --git a/ugbase/common/math/misc/tritri.cpp b/ugbase/common/math/misc/tritri.cpp index 19b0b96ba..599bd298e 100644 --- a/ugbase/common/math/misc/tritri.cpp +++ b/ugbase/common/math/misc/tritri.cpp @@ -316,7 +316,7 @@ int tri_tri_intersect(number V0[3],number V1[3],number V2[3], c=fabs(D[2]); //#pragma warning( default : 4244 ) if(b>max) max=b,index=1; - if(c>max) max=c,index=2; + if(c>max) index=2; /* this is the simplified projection onto L*/ vp0=V0[index]; diff --git a/ugbase/common/progress.cpp b/ugbase/common/progress.cpp index c5de322db..0bffebf7e 100644 --- a/ugbase/common/progress.cpp +++ b/ugbase/common/progress.cpp @@ -45,6 +45,7 @@ Progress::Progress(int minSecondsUntilProgress) m_minSecondsUntilProgress = minSecondsUntilProgress; m_length=100; bStarted=false; + posNow=-1; myDepth = totalDepth++; } /* diff --git a/ugbase/common/progress.h b/ugbase/common/progress.h index fe017ab76..b55d8fe85 100644 --- a/ugbase/common/progress.h +++ b/ugbase/common/progress.h @@ -48,8 +48,6 @@ namespace ug class Progress { - int m_minSecondsUntilProgress; - double startS; public: Progress(int minSecondsUntilProgress=-1); @@ -89,7 +87,11 @@ class Progress void setD(double now); void stop(); + private: + + int m_minSecondsUntilProgress; + double startS; double dNextValueToUpdate; size_t iNextValueToUpdate; int posNow; diff --git a/ugbase/common/util/file_util.cpp b/ugbase/common/util/file_util.cpp index b664b808a..f9745cf47 100644 --- a/ugbase/common/util/file_util.cpp +++ b/ugbase/common/util/file_util.cpp @@ -217,17 +217,19 @@ std::string FindFileInStandardPaths(const char* filename) std::string FindDirInStandardPaths(const char* dirname) { -// first check whether the file can be loaded (e.g. absolute path or relative to woring-directory) +// first check whether the file can be loaded (e.g. absolute path or relative to working directory) std::string dirNameOut = dirname; if (DirectoryExists(dirNameOut.c_str())) return dirNameOut; -// Now check whether the file was specified relative to the current -// scripting-directory - dirNameOut = PathProvider::get_current_path(); - dirNameOut.append("/").append(dirname); +// Now check whether the directory was specified relative to the current +// scripting-directory or script or apps or root paths + bool success = PathProvider::get_dirname_relative_to_current_path(dirname, dirNameOut) + || PathProvider::get_dirname_relative_to_path(SCRIPT_PATH, dirname, dirNameOut) + || PathProvider::get_dirname_relative_to_path(APPS_PATH, dirname, dirNameOut) + || PathProvider::get_dirname_relative_to_path(ROOT_PATH, dirname, dirNameOut); - if(DirectoryExists(dirNameOut.c_str())) + if (success) return dirNameOut; // filename couldn't be located diff --git a/ugbase/common/util/file_util.h b/ugbase/common/util/file_util.h index 8340158bd..e5ef9c9a6 100644 --- a/ugbase/common/util/file_util.h +++ b/ugbase/common/util/file_util.h @@ -123,6 +123,19 @@ static inline size_t FileSize( std::string filename) */ UG_API bool FileTypeIs( const char *filename, const char *extension ); +/** + * \brief Creates a directory + * + * This is a hack. This function does the same as CreateDirectory. + * But there is a linking problem in MS VC, so that the name CreateDirectory + * cannot be used. + * + * \param[in] directory name of the directory + * \return true if successfull + * + */ +UG_API bool CreateDirectoryTMP(const char *directory); + /** * \brief Creates a directory * @@ -130,14 +143,29 @@ UG_API bool FileTypeIs( const char *filename, const char *extension ); * \param[in] mode (optional, default 0777) Sets ownership options for the file. * Ignored on windows. * \return true if successfull - * \{ */ -UG_API bool CreateDirectoryTMP(const char *directory); UG_API bool CreateDirectory(const char *directory); + +/** + * \brief Creates a directory + * + * \param[in] directory name of the directory + * \param[in] mode (optional, default 0777) Sets ownership options for the file. + * Ignored on windows. + * \return true if successfull + */ UG_API bool CreateDirectory(const char *directory, int mode); -UG_API bool CreateDirectory(std::string directory); -/** \} */ +/** + * \brief Creates a directory + * + * \param[in] directory name of the directory + * \return true if successfull + */ +static inline bool CreateDirectory(std::string directory) +{ + return CreateDirectoryTMP(directory.c_str()); +} /** * \brief Compares two files by their content diff --git a/ugbase/common/util/os_dependent_impl/file_util_posix.cpp b/ugbase/common/util/os_dependent_impl/file_util_posix.cpp index dd40ea32e..807eec99a 100644 --- a/ugbase/common/util/os_dependent_impl/file_util_posix.cpp +++ b/ugbase/common/util/os_dependent_impl/file_util_posix.cpp @@ -156,11 +156,6 @@ bool CreateDirectory(const char *directory, int mode) return mkdir(directory, mode) == 0; } -bool CreateDirectory(std::string directory) -{ - return CreateDirectory(directory.c_str()); -} - std::string GetTmpPath() { return string("/tmp"); diff --git a/ugbase/common/util/os_dependent_impl/file_util_win.cpp b/ugbase/common/util/os_dependent_impl/file_util_win.cpp index 27a82314d..0774d18b2 100644 --- a/ugbase/common/util/os_dependent_impl/file_util_win.cpp +++ b/ugbase/common/util/os_dependent_impl/file_util_win.cpp @@ -154,11 +154,6 @@ bool CreateDirectory(const char *directory, int mode) return _mkdir(directory) == 0; } -bool CreateDirectory(std::string directory) -{ - return CreateDirectory(directory.c_str()); -} - std::string GetTmpPath() { static string userDataPath(""); diff --git a/ugbase/common/util/path_provider.h b/ugbase/common/util/path_provider.h index de8b13f11..760b8280c 100644 --- a/ugbase/common/util/path_provider.h +++ b/ugbase/common/util/path_provider.h @@ -146,6 +146,22 @@ class PathProvider return FileExists(absoluteFilename.c_str()); } + + /** + * @param relativeDirname (in) relative directory name + * @param absoluteDirname (out) absolute directory name + * @return true if directory exists relative to current path + */ + static inline bool get_dirname_relative_to_current_path(const std::string &relativeDirname, std::string &absoluteDirname) + { + const char* pathSep = GetPathSeparator(); + + if (!inst().has_current_path()) + return false; + absoluteDirname = inst().get_current_path() + pathSep + relativeDirname; + return DirectoryExists(absoluteDirname.c_str()); + } + /** * @param relativeFilename (in) relative filename * @param absoluteFilename (out) absolute filename @@ -160,6 +176,20 @@ class PathProvider return FileExists(absoluteFilename.c_str()); } + /** + * @param relativeDirname (in) relative directory name + * @param absoluteDirname (out) absolute directory name + * @return true if directory exists relative to current path + */ + static inline bool get_dirname_relative_to_path(PathTypes pathType, const std::string &relativeDirname, std::string &absoluteDirname) + { + const char* pathSep = GetPathSeparator(); + + if (!inst().has_path(pathType)) + return false; + absoluteDirname = inst().get_path(pathType) + pathSep + relativeDirname; + return DirectoryExists(absoluteDirname.c_str()); + } private: PathProvider() {} PathProvider(const PathProvider&) {} diff --git a/ugbase/common/util/section_container.hpp b/ugbase/common/util/section_container.hpp index 7ed010aeb..330009636 100644 --- a/ugbase/common/util/section_container.hpp +++ b/ugbase/common/util/section_container.hpp @@ -304,19 +304,6 @@ erase(const typename ug::SectionContainer::iterator& elemHan // if this is the case, we have to update the begin-handle of this section if(elemHandle == m_vSections[sectionIndex].m_elemsBegin) { - // get the previous valid section - int prevValidSection = -1; - { - for(int i = sectionIndex - 1; i >= 0; --i) - { - if(num_elements(i) > 0) - { - prevValidSection = i; - break; - } - } - } - // erase the element hNext = m_container.erase(elemHandle); m_vSections[sectionIndex].m_numElements--; @@ -324,8 +311,18 @@ erase(const typename ug::SectionContainer::iterator& elemHan // update the current section and the previous valid one. m_vSections[sectionIndex].m_elemsBegin = hNext; - if(prevValidSection != -1) - m_vSections[prevValidSection].m_elemsEnd = hNext; + // change begin and end iterators in all preceding empty sections + // and end iterator in the preceding non-empty section + for (int i = sectionIndex - 1; i >= 0; --i) + { + if (num_elements(i) <= 0) + { + m_vSections[i].m_elemsBegin = m_vSections[i].m_elemsEnd = hNext; + continue; + } + m_vSections[i].m_elemsEnd = hNext; + break; + } } else { diff --git a/ugbase/lib_algebra/CMakeLists.txt b/ugbase/lib_algebra/CMakeLists.txt index abf4afe33..3fa108768 100644 --- a/ugbase/lib_algebra/CMakeLists.txt +++ b/ugbase/lib_algebra/CMakeLists.txt @@ -52,6 +52,7 @@ set(src_Algebra ${src_Algebra} operator/preconditioner/line_smoothers.cpp operator/linear_solver/analyzing_solver.cpp algebra_common/permutation_util.cpp + operator/preconditioner/schur/schur.cpp ) add_subdirectory(common/matrixio) @@ -59,7 +60,6 @@ add_subdirectory(common/matrixio) if(PARALLEL) # add parallelization set(src_Algebra ${src_Algebra} - operator/preconditioner/schur/schur.cpp operator/preconditioner/schur/schur_precond.cpp operator/preconditioner/schur/schur_complement_operator.cpp operator/preconditioner/schur/parallel_progress.cpp diff --git a/ugbase/lib_algebra/cpu_algebra/sparsematrix.h b/ugbase/lib_algebra/cpu_algebra/sparsematrix.h index ef3168b2c..6ad4e4fff 100644 --- a/ugbase/lib_algebra/cpu_algebra/sparsematrix.h +++ b/ugbase/lib_algebra/cpu_algebra/sparsematrix.h @@ -117,6 +117,10 @@ template class SparseMatrix /// destructor virtual ~SparseMatrix () {} + /** + * @brief Clears the matrix vectors and frees their memory + */ + void clear_and_free(); /** * \brief resizes the SparseMatrix diff --git a/ugbase/lib_algebra/cpu_algebra/sparsematrix_impl.h b/ugbase/lib_algebra/cpu_algebra/sparsematrix_impl.h index 53a58bd7a..5d9d65e55 100644 --- a/ugbase/lib_algebra/cpu_algebra/sparsematrix_impl.h +++ b/ugbase/lib_algebra/cpu_algebra/sparsematrix_impl.h @@ -61,6 +61,25 @@ SparseMatrix::SparseMatrix() if(bNeedsValues) values.resize(32); } +template +void SparseMatrix::clear_and_free() +{ + std::vector().swap(rowStart); + std::vector().swap(rowMax); + std::vector().swap(rowEnd); + m_numCols = 0; + nnz = 0; + + std::vector().swap(cols); + std::vector().swap(values); + maxValues = 0; + +#ifdef CHECK_ROW_ITERATORS + std::vector().swap(nrOfRowIterators); +#endif +} + + template void SparseMatrix::resize_and_clear(size_t newRows, size_t newCols) { diff --git a/ugbase/lib_algebra/cpu_algebra/vector.h b/ugbase/lib_algebra/cpu_algebra/vector.h index 37c810678..66fe19bbb 100644 --- a/ugbase/lib_algebra/cpu_algebra/vector.h +++ b/ugbase/lib_algebra/cpu_algebra/vector.h @@ -175,6 +175,9 @@ class Vector //: public IVector //! return sqrt(sum values[i]^2) (euclidian norm) inline double norm() const; + //! return max values[i] (max norm) + inline double maxnorm() const; + size_t size() const { return m_size; } diff --git a/ugbase/lib_algebra/cpu_algebra/vector_impl.h b/ugbase/lib_algebra/cpu_algebra/vector_impl.h index ff6a1ae5d..2bfa425ed 100644 --- a/ugbase/lib_algebra/cpu_algebra/vector_impl.h +++ b/ugbase/lib_algebra/cpu_algebra/vector_impl.h @@ -328,6 +328,15 @@ inline double Vector::norm() const return sqrt(d); } +template +inline double Vector::maxnorm() const +{ + double d=0; + for(size_t i=0; i void CloneVector(Vector &dest, const Vector& src) { diff --git a/ugbase/lib_algebra/operator/debug_writer.h b/ugbase/lib_algebra/operator/debug_writer.h index f923a1555..aee827418 100644 --- a/ugbase/lib_algebra/operator/debug_writer.h +++ b/ugbase/lib_algebra/operator/debug_writer.h @@ -36,7 +36,7 @@ #include "common/util/smart_pointer.h" #include "common/math/ugmath.h" #include "common/profiler/profiler.h" - +#include "common/util/file_util.h" namespace ug{ @@ -52,6 +52,62 @@ class IPositionProvider virtual ~IPositionProvider() {} }; +/// Context of a debugger writer: Keeps the debugging section etc. +class DebugWriterContext +{ + public: + + /// constructor + DebugWriterContext () : m_baseDir(".") {} + + /// set the base directory for output files (.vec and .mat) + inline void set_base_dir(const char* const baseDir) {m_baseDir = std::string(baseDir);} + std::string get_base_dir() { return m_baseDir; } + + /// enter a new debugging section + inline void enter_section(const char* secDir) {m_secDir.push_back(secDir);} + + /// leave the current debugging section + inline void leave_section () {m_secDir.pop_back();} + + /// prints a message + void print_message(const char * msg) + { + UG_LOG ("DBG > "); + for (size_t i = 0; i < m_secDir.size (); i++) + { + UG_LOG (":" << m_secDir[i]); + } + UG_LOG (" > " << msg); + } + + /// composes the path for the files and creates the intermediate directories (up to the base one): + void compose_file_path(std::string& path) + { + path = get_base_dir (); + if (! FileExists (path)) + { + UG_WARNING ("IVectorDebugWriter: Directory '" << path << "' does not exist. Using cwd instead.\n"); + path = "."; + } + for (size_t i = 0; i < m_secDir.size (); i++) + { + path.append ("/"); //TODO: This can be OS-dependent. + path.append (m_secDir[i]); + if ((! FileExists (path)) && ! CreateDirectory (path)) + UG_WARNING ("IVectorDebugWriter: Could not create directory '" << path << "'. Using cwd instead.\n"); + } + path.append ("/"); //TODO: This can be OS-dependent. + } + + protected: + + /// base directory for the debugging output + std::string m_baseDir; + + /// debuging section subdirectories + std::vector m_secDir; +}; /// base class for all vector debug writer /** @@ -66,11 +122,15 @@ class IVectorDebugWriter public: /// Constructor - IVectorDebugWriter() : m_baseDir("."), m_currentDim(-1) {} + IVectorDebugWriter() + : m_spContext (new DebugWriterContext), m_currentDim(-1) {} + + /// virtual destructor + virtual ~IVectorDebugWriter(){} /// write vector virtual void write_vector(const vector_type& vec, const char* name) = 0; - + /// returns the current dimension int current_dimension() const {return m_currentDim;} @@ -103,28 +163,60 @@ class IVectorDebugWriter m_currentDim = dim; } - /// virtual destructor - virtual ~IVectorDebugWriter(){} - + /// get the dimensionality int get_dim() const { return m_currentDim; } + + /// set the debugging writer context + void set_context(SmartPtr context) {m_spContext = context;} + + /// get the debugging writer context + SmartPtr get_context() {return m_spContext;} - /// set the base directory for output files (.vec and .mat) - inline void set_base_dir(const char* const baseDir) {m_baseDir = std::string(baseDir);} - std::string get_base_dir() { return m_baseDir; } + /// get the debugging writer context + ConstSmartPtr get_context() const {return m_spContext;} - protected: - /// base directory for output - std::string m_baseDir; + /// prints a message + virtual void print_message(const char * msg) {if (m_spContext.valid()) m_spContext->print_message(msg);} + /// set the base directory for output files (.vec and .mat) + inline void set_base_dir(const char* const baseDir) + { + if (! m_spContext.valid()) + set_context (SmartPtr (new DebugWriterContext)); + m_spContext->set_base_dir (baseDir); + } + + std::string get_base_dir() {return (m_spContext.valid())? m_spContext->get_base_dir() : "";} + + /// enter a new debugging section + inline void enter_section(const char* secDir) {if (m_spContext.valid()) m_spContext->enter_section (secDir);} + + /// leave the current debugging section + inline void leave_section () {if (m_spContext.valid()) m_spContext->leave_section ();} + + protected: + /// returns the positions and sets the current dim template std::vector >& positions() { m_currentDim = dim; return get_pos(Int2Type()); } + + /// composes the path for the files and creates the intermediate directories (up to the base one): + void compose_file_path(std::string& path) + { + if (m_spContext.valid()) m_spContext->compose_file_path (path); + else path = "."; + } + + protected: + + /// debugging writer context + SmartPtr m_spContext; /// current dimension int m_currentDim; @@ -194,20 +286,23 @@ class VectorDebugWritingObject SmartPtr > vector_debug_writer() {return m_spVectorDebugWriter;} ConstSmartPtr > vector_debug_writer() const {return m_spVectorDebugWriter;} + /// returns true if the debug writer is set + bool vector_debug_writer_valid() const {return m_spVectorDebugWriter.valid();} + protected: - virtual void write_debug(const vector_type& vec, std::string filename) + /// writing debug output for a vector (if debug writer set) + void write_debug(const vector_type& vec, const char* filename) { - write_debug(vec, filename.c_str()); + write_debug(vec, std::string (filename)); } /// writing debug output for a vector (if debug writer set) - virtual void write_debug(const vector_type& vec, const char* filename) + virtual void write_debug(const vector_type& vec, std::string name) { PROFILE_FUNC_GROUP("algebra debug"); // if no debug writer set, we're done if(m_spVectorDebugWriter.invalid()) return; // check ending - std::string name(filename); size_t iExtPos = name.find_last_of("."); if(iExtPos != std::string::npos && name.substr(iExtPos).compare(".vec") != 0) UG_THROW("Only '.vec' format supported for vectors, but" @@ -219,7 +314,35 @@ class VectorDebugWritingObject // write m_spVectorDebugWriter->write_vector(vec, name.c_str()); } + + /// prints a debugger message (listing all the sections) + void print_debugger_message(std::string msg) + { + print_debugger_message(msg.c_str()); + } + /// prints a debugger message (listing all the sections) + void print_debugger_message(const char * msg) + { + if (m_spVectorDebugWriter.valid()) m_spVectorDebugWriter->print_message(msg); + } + /// enters a debugging section + void enter_vector_debug_writer_section(std::string secDir) + { + enter_vector_debug_writer_section(secDir.c_str()); + } + /// enters a debugging section + void enter_vector_debug_writer_section(const char * secDir) + { + if (m_spVectorDebugWriter.valid()) m_spVectorDebugWriter->enter_section(secDir); + } + + /// leaves a debugging section + void leave_vector_debug_writer_section() + { + if (m_spVectorDebugWriter.valid()) m_spVectorDebugWriter->leave_section(); + } + protected: /// Debug Writer SmartPtr > m_spVectorDebugWriter; @@ -267,16 +390,23 @@ class DebugWritingObject : public VectorDebugWritingObject > debug_writer() {return m_spDebugWriter;} ConstSmartPtr > debug_writer() const {return m_spDebugWriter;} + /// returns true if the debug writer is set + bool debug_writer_valid() const {return m_spDebugWriter.valid();} + protected: /// write debug output for a matrix (if debug writer set) - virtual void write_debug(const matrix_type& mat, const char* filename) + void write_debug(const matrix_type& mat, const char* filename) + { + write_debug(mat, std::string(filename)); + } + /// write debug output for a matrix (if debug writer set) + void write_debug(const matrix_type& mat, std::string name) { PROFILE_FUNC_GROUP("algebra debug"); // if no debug writer set, we're done if(m_spDebugWriter.invalid()) return; // check ending - std::string name(filename); size_t iExtPos = name.find_last_of("."); if(iExtPos != std::string::npos && name.substr(iExtPos).compare(".mat") != 0) UG_THROW("Only '.mat' format supported for matrices, but" @@ -289,6 +419,23 @@ class DebugWritingObject : public VectorDebugWritingObjectwrite_matrix(mat, name.c_str()); } + /// enters a debugging section + void enter_debug_writer_section(std::string secDir) + { + enter_debug_writer_section(secDir.c_str()); + } + /// enters a debugging section + void enter_debug_writer_section(const char * secDir) + { + if (m_spDebugWriter.valid()) m_spDebugWriter->enter_section(secDir); + } + + /// leaves a debugging section + void leave_debug_writer_section() + { + if (m_spDebugWriter.valid()) m_spDebugWriter->leave_section(); + } + protected: /// Debug Writer SmartPtr > m_spDebugWriter; diff --git a/ugbase/lib_algebra/operator/eigensolver/power_method.h b/ugbase/lib_algebra/operator/eigensolver/power_method.h index 28dca3c24..9994e08a2 100644 --- a/ugbase/lib_algebra/operator/eigensolver/power_method.h +++ b/ugbase/lib_algebra/operator/eigensolver/power_method.h @@ -187,6 +187,15 @@ class PowerMethod else m_spEigenvector = m_spResidual->clone(); + // reset Dirichlet rows to 0 + for(size_t i = 0; i < m_spEigenvector->size(); i++) + { + if(m_vbDirichlet[i]) + { + (*m_spEigenvector)[i] = 0.0; + } + } + // v = v / ||v||_B normalize_approximations(); @@ -250,6 +259,15 @@ class PowerMethod // v = A^-1 B v or v = A^-1 v m_spSolver->apply(*m_spEigenvector, *m_spResidual); + // reset Dirichlet rows to 0 + for(size_t i = 0; i < m_spEigenvector->size(); i++) + { + if(m_vbDirichlet[i]) + { + (*m_spEigenvector)[i] = 0.0; + } + } + // v = v / ||v||_B normalize_approximations(); diff --git a/ugbase/lib_algebra/operator/fixed_convergence_check.h b/ugbase/lib_algebra/operator/fixed_convergence_check.h index 47be4ddf1..104354c9e 100644 --- a/ugbase/lib_algebra/operator/fixed_convergence_check.h +++ b/ugbase/lib_algebra/operator/fixed_convergence_check.h @@ -110,7 +110,7 @@ class FixedConvergenceCheck : public IConvergenceCheck virtual number reduction() const { UG_ASSERT(0, "not provided by FixedConvergenceCheck"); return 0;} // returns the current convergence rate - virtual number rate() const { UG_ASSERT(0, "not provided by FixedConvergenceCheck"); return 0;} + virtual number rate() const { return 0;} // returns the averaged convergence rate virtual number avg_rate() const { UG_ASSERT(0, "not provided by FixedConvergenceCheck"); return 0;} diff --git a/ugbase/lib_algebra/operator/interface/constrained_linear_iterator.h b/ugbase/lib_algebra/operator/interface/constrained_linear_iterator.h index 3e69b7aaf..b153238f6 100644 --- a/ugbase/lib_algebra/operator/interface/constrained_linear_iterator.h +++ b/ugbase/lib_algebra/operator/interface/constrained_linear_iterator.h @@ -54,6 +54,11 @@ namespace ug { * The handled constraints must implement the two methods: * adjust_correction(), * adjust_defect(). + * + * @note This class may have lost its use: + * Constraints are now usually implemented in such a way that + * that both defect and correction is always zero in constrained + * DoFs. */ template class ConstrainedLinearIterator : public TLinIt diff --git a/ugbase/lib_algebra/operator/linear_solver/bicgstab.h b/ugbase/lib_algebra/operator/linear_solver/bicgstab.h index 4b7dd7c1a..45a53f27f 100644 --- a/ugbase/lib_algebra/operator/linear_solver/bicgstab.h +++ b/ugbase/lib_algebra/operator/linear_solver/bicgstab.h @@ -113,8 +113,11 @@ class BiCGStab // check correct storage type in parallel #ifdef UG_PARALLEL - if(!b.has_storage_type(PST_ADDITIVE) || !x.has_storage_type(PST_CONSISTENT)) + if(!b.has_storage_type(PST_ADDITIVE) || !x.has_storage_type(PST_CONSISTENT)){ + UG_LOG("BICGStab:b_storage_type"<step(), 'i'); + // Iteration loop while(!convergence_check()->iteration_ended()) { @@ -225,13 +230,16 @@ class BiCGStab // apply q = M^-1 * p ... if(preconditioner().valid()) { + enter_precond_debug_section(convergence_check()->step(), 'a'); if(!preconditioner()->apply(q, p)) { UG_LOG("BiCGStab: Cannot apply preconditioner. Aborting.\n"); + this->leave_vector_debug_writer_section(); return false; } - // ... or copy q = p + this->leave_vector_debug_writer_section(); } + // ... or copy q = p else { q = p; @@ -280,6 +288,8 @@ class BiCGStab // check convergence convergence_check()->update(s); + write_debugXR(x, s, convergence_check()->step(), 'a'); + // if finished: set output to last defect and exist loop if(convergence_check()->iteration_ended()) { @@ -289,13 +299,16 @@ class BiCGStab // apply q = M^-1 * s ... if(preconditioner().valid()) { + enter_precond_debug_section(convergence_check()->step(), 'b'); if(!preconditioner()->apply(q, s)) { UG_LOG("BiCGStab: Cannot apply preconditioner. Aborting.\n"); + this->leave_vector_debug_writer_section(); return false; } - // ... or set q:=s + this->leave_vector_debug_writer_section(); } + // ... or set q:=s else { q = s; @@ -352,6 +365,8 @@ class BiCGStab // check convergence convergence_check()->update(r); + write_debugXR(x, r, convergence_check()->step(), 'b'); + // check values if(omega == 0.0) { @@ -401,6 +416,23 @@ class BiCGStab convergence_check()->set_info(s); } + /// debugger output: solution and residual + void write_debugXR(vector_type &x, vector_type &r, int loopCnt, char phase) + { + if(!this->vector_debug_writer_valid()) return; + char ext[20]; sprintf(ext, "-%c_iter%03d", phase, loopCnt); + write_debug(r, std::string("BiCGStab_Residual") + ext + ".vec"); + write_debug(x, std::string("BiCGStab_Solution") + ext + ".vec"); + } + + /// debugger section for the preconditioner + void enter_precond_debug_section(int loopCnt, char phase) + { + if(!this->vector_debug_writer_valid()) return; + char ext[20]; sprintf(ext, "-%c_iter%03d", phase, loopCnt); + this->enter_vector_debug_writer_section(std::string("BiCGStab_Precond") + ext); + } + public: virtual std::string config_string() const { diff --git a/ugbase/lib_algebra/operator/linear_solver/cg.h b/ugbase/lib_algebra/operator/linear_solver/cg.h index bae68e1e5..fe0381a02 100644 --- a/ugbase/lib_algebra/operator/linear_solver/cg.h +++ b/ugbase/lib_algebra/operator/linear_solver/cg.h @@ -121,16 +121,21 @@ class CG SmartPtr spZ = x.clone_without_values(); vector_type& z = *spZ; SmartPtr spP = x.clone_without_values(); vector_type& p = *spP; + write_debugXR(x, r, convergence_check()->step()); + // Preconditioning if(preconditioner().valid()) { + enter_precond_debug_section(convergence_check()->step()); // apply z = M^-1 * s if(!preconditioner()->apply(z, r)) { UG_LOG("ERROR in 'CG::apply_return_defect': " "Cannot apply preconditioner. Aborting.\n"); + this->leave_vector_debug_writer_section(); return false; } + this->leave_vector_debug_writer_section(); } else z = r; @@ -187,6 +192,8 @@ class CG // Update r := r - alpha*t VecScaleAdd(r, 1.0, r, -alpha, q); + write_debugXR(x, r, convergence_check()->step()); + // Check convergence convergence_check()->update(r); if(convergence_check()->iteration_ended()) break; @@ -194,16 +201,19 @@ class CG // Preconditioning if(preconditioner().valid()) { + enter_precond_debug_section(convergence_check()->step()); // apply z = M^-1 * r if(!preconditioner()->apply(z, r)) { UG_LOG("ERROR in 'CG::apply_return_defect': " "Cannot apply preconditioner. Aborting.\n"); + this->leave_vector_debug_writer_section(); return false; } + this->leave_vector_debug_writer_section(); } else z = r; - + #ifdef UG_PARALLEL // make z consistent if(!z.change_storage_type(PST_CONSISTENT)) @@ -260,6 +270,23 @@ class CG convergence_check()->set_info(s); } + /// debugger output: solution and residual + void write_debugXR(vector_type &x, vector_type &r, int loopCnt) + { + if(!this->vector_debug_writer_valid()) return; + char ext[20]; sprintf(ext, "_iter%03d", loopCnt); + write_debug(r, std::string("CG_Residual") + ext + ".vec"); + write_debug(x, std::string("CG_Solution") + ext + ".vec"); + } + + /// debugger section for the preconditioner + void enter_precond_debug_section(int loopCnt) + { + if(!this->vector_debug_writer_valid()) return; + char ext[20]; sprintf(ext, "_iter%03d", loopCnt); + this->enter_vector_debug_writer_section(std::string("CG_Precond_") + ext); + } + protected: number VecProd(vector_type& a, vector_type& b) { diff --git a/ugbase/lib_algebra/operator/linear_solver/external_solvers/external_solvers.h b/ugbase/lib_algebra/operator/linear_solver/external_solvers/external_solvers.h index a01b49b8d..f5da88dea 100644 --- a/ugbase/lib_algebra/operator/linear_solver/external_solvers/external_solvers.h +++ b/ugbase/lib_algebra/operator/linear_solver/external_solvers/external_solvers.h @@ -87,6 +87,7 @@ class IExternalSolver public: // Constructor IExternalSolver() + : m_bUseConsistentInterfaces(false), m_bDisablePreprocessing(false) { m_size = 0; m_blockSize = 0; @@ -104,13 +105,19 @@ class IExternalSolver /// returns if parallel solving is supported virtual bool supports_parallel() const {return false;} + /// disable preprocessing (if underlying matrix has not changed) + void set_disable_preprocessing(bool bDisable) {m_bDisablePreprocessing = bDisable;} - public: + void enable_consistent_interfaces(bool enable){ m_bUseConsistentInterfaces = enable; } virtual void double_init(const CPUAlgebra::matrix_type &mat) = 0; void mat_preprocess(const matrix_type &A) { + // do not do a thing if preprocessing disabled + if (m_bDisablePreprocessing) + return; + if( A.num_rows() == 0 || A.num_cols() == 0) { m_size = 0; return; } STATIC_ASSERT(matrix_type::rows_sorted, Matrix_has_to_have_sorted_rows); @@ -119,13 +126,16 @@ class IExternalSolver #ifdef UG_PARALLEL // add slave rows to master rows (in indices which this is possible for) matrix_type A_tmp; A_tmp = A; - MatAddSlaveRowsToMasterRowOverlap0(A_tmp); - - // set zero on slaves - std::vector vIndex; - CollectUniqueElements(vIndex, A.layouts()->slave()); - SetDirichletRow(A_tmp, vIndex); - + if(m_bUseConsistentInterfaces){ + MatMakeConsistentOverlap0(A_tmp); + }else { + MatAddSlaveRowsToMasterRowOverlap0(A_tmp); + + // set zero on slaves + std::vector vIndex; + CollectUniqueElements(vIndex, A.layouts()->slave()); + SetDirichletRow(A_tmp, vIndex); + } // Even after this setting of Dirichlet rows, it is possible that there are // zero rows on a proc because of the distribution: // For example, if one has a horizontal grid interface between two SHADOW_RIM_COPY @@ -218,12 +228,17 @@ class IExternalSolver m_d.resize(m_size); #ifdef UG_PARALLEL + m_d.set_storage_type(PST_ADDITIVE); m_c.set_storage_type(PST_CONSISTENT); - // make defect unique SmartPtr spDtmp = d.clone(); - spDtmp->change_storage_type(PST_UNIQUE); + if(m_bUseConsistentInterfaces){ + spDtmp->change_storage_type(PST_CONSISTENT); + } else{ + spDtmp->change_storage_type(PST_UNIQUE); + } + get_vector(m_d, *spDtmp); #else @@ -239,6 +254,7 @@ class IExternalSolver #ifdef UG_PARALLEL // correction must always be consistent (but is unique by construction) + // (or regarded as such in the case of consistent interfaces) c.set_storage_type(PST_UNIQUE); c.change_storage_type(PST_CONSISTENT); #endif @@ -334,9 +350,13 @@ class IExternalSolver // Postprocess routine virtual bool postprocess() {return true;} - CPUAlgebra::vector_type m_c, m_d; - size_t m_size; - size_t m_blockSize; + bool m_bUseConsistentInterfaces; + CPUAlgebra::vector_type m_c, m_d; + size_t m_size; + size_t m_blockSize; + bool m_bDisablePreprocessing; + + }; } // namespace ug diff --git a/ugbase/lib_algebra/operator/linear_solver/linear_solver.h b/ugbase/lib_algebra/operator/linear_solver/linear_solver.h index 49ea8f26c..cb1455be4 100644 --- a/ugbase/lib_algebra/operator/linear_solver/linear_solver.h +++ b/ugbase/lib_algebra/operator/linear_solver/linear_solver.h @@ -102,8 +102,7 @@ class LinearSolver if(!preconditioner()->apply_update_defect(c, d)) { - UG_LOG("ERROR in 'LinearSolver::apply': Iterator " - "Operator applied incorrectly. Aborting.\n"); + UG_LOG("ERROR in 'LinearSolver': Could not apply preconditioner. Aborting.\n"); return false; } LS_PROFILE_END(LS_ApplyPrecond); @@ -111,14 +110,6 @@ class LinearSolver return true; } - void write_debugXCD(vector_type &x, vector_type &c, vector_type &d, int loopCnt, bool bWriteC) - { - char ext[20]; sprintf(ext, "_iter%03d", loopCnt); - write_debug(d, std::string("LS_Defect_") + ext + ".vec"); - if(bWriteC) write_debug(c, std::string("LS_Correction_") + ext + ".vec"); - write_debug(x, std::string("LS_Solution_") + ext + ".vec"); - } - /// solves the system and returns the last defect virtual bool apply_return_defect(vector_type& x, vector_type& b) { @@ -127,7 +118,7 @@ class LinearSolver #ifdef UG_PARALLEL if(!b.has_storage_type(PST_ADDITIVE) || !x.has_storage_type(PST_CONSISTENT)) - UG_THROW("LinearSolver::apply: Inadequate storage format of Vectors."); + UG_THROW("LinearSolver::apply: Inadequate parallel storage format of Vectors."); #endif // rename b as d (for convenience) @@ -159,7 +150,13 @@ class LinearSolver // Iteration loop while(!convergence_check()->iteration_ended()) { - if( !compute_correction(c, d) ) return false; + enter_precond_debug_section(loopCnt); + if( !compute_correction(c, d) ) + { + this->leave_vector_debug_writer_section(); + return false; + } + this->leave_vector_debug_writer_section(); // post-process the correction m_corr_post_process.apply (c); @@ -221,6 +218,24 @@ class LinearSolver } } + /// debugger output: solution, correction, defect + void write_debugXCD(vector_type &x, vector_type &c, vector_type &d, int loopCnt, bool bWriteC) + { + if(!this->vector_debug_writer_valid()) return; + char ext[20]; sprintf(ext, "_iter%03d", loopCnt); + write_debug(d, std::string("LS_Defect") + ext + ".vec"); + if(bWriteC) write_debug(c, std::string("LS_Correction") + ext + ".vec"); + write_debug(x, std::string("LS_Solution") + ext + ".vec"); + } + + /// debugger section for the preconditioner + void enter_precond_debug_section(int loopCnt) + { + if(!this->vector_debug_writer_valid()) return; + char ext[20]; sprintf(ext, "_iter%03d", loopCnt); + this->enter_vector_debug_writer_section(std::string("LS_Precond_") + ext); + } + protected: /// postprocessor for the correction in the iterations PProcessChain m_corr_post_process; diff --git a/ugbase/lib_algebra/operator/preconditioner/gauss_seidel.h b/ugbase/lib_algebra/operator/preconditioner/gauss_seidel.h index 4ffe5ec42..626286940 100644 --- a/ugbase/lib_algebra/operator/preconditioner/gauss_seidel.h +++ b/ugbase/lib_algebra/operator/preconditioner/gauss_seidel.h @@ -170,9 +170,20 @@ class GaussSeidelBase : public IPreconditioner } else if (m_bConsistentInterfaces) { - UG_COND_THROW(!d.has_storage_type(PST_ADDITIVE), "Additive or unique defect expected."); - step(m_A, c, d, m_relax); - c.set_storage_type(PST_ADDITIVE); + // make defect consistent + SmartPtr spDtmp = d.clone(); + spDtmp->change_storage_type(PST_CONSISTENT); + + THROW_IF_NOT_EQUAL_3(c.size(), spDtmp->size(), m_A.num_rows()); + step(m_A, c, *spDtmp, m_relax); + + // declare c unique to enforce that only master correction is used + // when it is made consistent below + c.set_storage_type(PST_UNIQUE); + + //UG_COND_THROW(!d.has_storage_type(PST_ADDITIVE), "Additive or unique defect expected."); + //step(m_A, c, d, m_relax); + //c.set_storage_type(PST_ADDITIVE); } else { diff --git a/ugbase/lib_algebra/operator/preconditioner/ilu.h b/ugbase/lib_algebra/operator/preconditioner/ilu.h index b104d1e5c..f35bb9af6 100644 --- a/ugbase/lib_algebra/operator/preconditioner/ilu.h +++ b/ugbase/lib_algebra/operator/preconditioner/ilu.h @@ -223,6 +223,8 @@ bool FactorizeILUSorted(Matrix_type &A, const number eps = 1e-50) // solve x = L^-1 b +// Returns true on success, or false on issues that lead to some changes in the solution +// (the solution is computed unless no exceptions are thrown) template bool invert_L(const Matrix_type &A, Vector_type &x, const Vector_type &b) { @@ -245,6 +247,8 @@ bool invert_L(const Matrix_type &A, Vector_type &x, const Vector_type &b) } // solve x = U^-1 * b +// Returns true on success, or false on issues that lead to some changes in the solution +// (the solution is computed unless no exceptions are thrown) template bool invert_U(const Matrix_type &A, Vector_type &x, const Vector_type &b, const number eps = 1e-8) @@ -254,8 +258,8 @@ bool invert_U(const Matrix_type &A, Vector_type &x, const Vector_type &b, typename Vector_type::value_type s; - size_t numNearZero=0; - + bool result = true; + // last row diagonal U entry might be close to zero with corresponding close to zero rhs // when solving Navier Stokes system, therefore handle separately if(x.size() > 0) @@ -269,27 +273,27 @@ bool invert_U(const Matrix_type &A, Vector_type &x, const Vector_type &b, // nearly zero due to round-off errors. In order to allow ill- // scaled matrices (i.e. small matrix entries row-wise) this // is compared to the rhs, that is small in this case as well. + //TODO: Note that this may happen for problems with naturally + // non-zero kernels, e.g. for the Stokes equation. One should + // probably suppress this message in those cases but set the + // rhs to 0. if (BlockNorm(A(i,i)) <= eps * BlockNorm(s)) { - if(numNearZero++<5) - { UG_LOG("ILU Warning: Near-zero diagonal entry " - "with norm "<=5) - { UG_LOG("...\nILU Warning: " << numNearZero << " ( out of " << x.size() << ") near-zero diagonal entries in last row of U.\n"); } - - return true; + return result; } @@ -372,7 +373,8 @@ class ILU : public IPreconditioner protected: using base_type::set_debug; using base_type::debug_writer; - // using base_type::write_debug; + using base_type::write_debug; + using base_type::print_debugger_message; public: // Constructor @@ -465,7 +467,11 @@ class ILU : public IPreconditioner matrix_type &mat = *pOp; PROFILE_BEGIN_GROUP(ILU_preprocess, "algebra ILU"); // Debug output of matrices - write_debug(mat, "ILU_prep_01_A_BeforeMakeUnique"); + #ifdef UG_PARALLEL + write_overlap_debug(mat, "ILU_prep_01_A_BeforeMakeUnique"); + #else + write_debug(mat, "ILU_PreProcess_orig_A"); + #endif m_ILU = mat; @@ -517,14 +523,21 @@ class ILU : public IPreconditioner m_h.resize(m_ILU.num_cols()); - write_debug(m_ILU, "ILU_prep_02_A_AfterMakeUnique"); + #ifdef UG_PARALLEL + write_overlap_debug(m_ILU, "ILU_prep_02_A_AfterMakeUnique"); + #endif // if using overlap we already sort in a different way if(m_bSort && !(m_useOverlap && sortSlaveToEnd)) calc_cuthill_mckee(); // Debug output of matrices - write_debug(m_ILU, "ILU_prep_03_A_BeforeFactorize"); + #ifdef UG_PARALLEL + write_overlap_debug(m_ILU, "ILU_prep_03_A_BeforeFactorize"); + #else + write_debug(m_ILU, "ILU_PreProcess_U_BeforeFactor"); + #endif + // Compute ILU Factorization if (m_beta!=0.0) FactorizeILUBeta(m_ILU, m_beta); @@ -533,7 +546,11 @@ class ILU : public IPreconditioner m_ILU.defragment(); // Debug output of matrices - write_debug(m_ILU, "ILU_prep_04_A_AfterFactorize"); + #ifdef UG_PARALLEL + write_overlap_debug(m_ILU, "ILU_prep_04_A_AfterFactorize"); + #else + write_debug(m_ILU, "ILU_PreProcess_U_AfterFactor"); + #endif // we're done return true; @@ -545,15 +562,19 @@ class ILU : public IPreconditioner if(!m_bSort || m_bSortIsIdentity) { // apply iterator: c = LU^{-1}*d - invert_L(m_ILU, tmp, d); // h := L^-1 d - invert_U(m_ILU, c, tmp, m_invEps); // c := U^-1 h = (LU)^-1 d + if(! invert_L(m_ILU, tmp, d)) // h := L^-1 d + print_debugger_message("ILU: There were issues at inverting L\n"); + if(! invert_U(m_ILU, c, tmp, m_invEps)) // c := U^-1 h = (LU)^-1 d + print_debugger_message("ILU: There were issues at inverting U\n"); } else { // we save one vector here by renaming SetVectorAsPermutation(tmp, d, m_newIndex); - invert_L(m_ILU, c, tmp); // c = L^{-1} d - invert_U(m_ILU, tmp, c, m_invEps); // tmp = (LU)^{-1} d + if(! invert_L(m_ILU, c, tmp)) // c = L^{-1} d + print_debugger_message("ILU: There were issues at inverting L (after permutation)\n"); + if(! invert_U(m_ILU, tmp, c, m_invEps)) // tmp = (LU)^{-1} d + print_debugger_message("ILU: There were issues at inverting U (after permutation)\n"); SetVectorAsPermutation(c, tmp, m_oldIndex); } } @@ -571,7 +592,7 @@ class ILU : public IPreconditioner // for debug output (only for application is written) static bool first = true; - if(first) write_debug(d, "ILU_step_1_d"); + if(first) write_overlap_debug(d, "ILU_step_1_d"); if(m_useOverlap){ for(size_t i = 0; i < d.size(); ++i) m_oD[i] = d[i]; @@ -580,7 +601,7 @@ class ILU : public IPreconditioner m_oD.set_storage_type(PST_ADDITIVE); m_oD.change_storage_type(PST_CONSISTENT); - if(first) write_debug(m_oD, "ILU_step_2_oD_consistent"); + if(first) write_overlap_debug(m_oD, "ILU_step_2_oD_consistent"); applyLU(m_oC, m_oD, m_h); @@ -590,10 +611,14 @@ class ILU : public IPreconditioner c.set_storage_type(PST_UNIQUE); } else if(m_useConsistentInterfaces){ - UG_COND_THROW(d.has_storage_type(PST_CONSISTENT), - "additive or unique defect expected"); - applyLU(c, d, m_h); - c.set_storage_type(PST_ADDITIVE); + // make defect consistent + SmartPtr spDtmp = d.clone(); + spDtmp->change_storage_type(PST_CONSISTENT); + applyLU(c, *spDtmp, m_h); + + // declare c unique to enforce that only master correction is used + // when it is made consistent below + c.set_storage_type(PST_UNIQUE); } else{ // make defect unique @@ -605,15 +630,17 @@ class ILU : public IPreconditioner } // write debug - if(first) write_debug(c, "ILU_step_3_c"); + if(first) write_overlap_debug(c, "ILU_step_3_c"); c.change_storage_type(PST_CONSISTENT); // write debug - if(first) {write_debug(c, "ILU_step_4_c_consistent"); first = false;} + if(first) {write_overlap_debug(c, "ILU_step_4_c_consistent"); first = false;} #else + write_debug(d, "ILU_step_d"); applyLU(c, d, m_h); + write_debug(c, "ILU_step_c"); #endif // we're done @@ -624,19 +651,17 @@ class ILU : public IPreconditioner virtual bool postprocess() {return true;} private: - template void write_debug(const T& t, std::string name) + #ifdef UG_PARALLEL + template void write_overlap_debug(const T& t, std::string name) { - #ifdef UG_PARALLEL - if(debug_writer().valid()){ - if(m_useOverlap && m_overlapWriter.valid() && t.layouts()->overlap_enabled()) - m_overlapWriter->write(t, name); - else - base_type::write_debug(t, name.c_str()); - } - #else - base_type::write_debug(t, name.c_str()); - #endif + if(debug_writer().valid()){ + if(m_useOverlap && m_overlapWriter.valid() && t.layouts()->overlap_enabled()) + m_overlapWriter->write(t, name); + else + write_debug(t, name.c_str()); + } } + #endif protected: /// storage for factorization diff --git a/ugbase/lib_algebra/operator/preconditioner/ilut.h b/ugbase/lib_algebra/operator/preconditioner/ilut.h index dec7eb8c1..fc99bbfdd 100644 --- a/ugbase/lib_algebra/operator/preconditioner/ilut.h +++ b/ugbase/lib_algebra/operator/preconditioner/ilut.h @@ -439,14 +439,14 @@ class ILUTPreconditioner : public IPreconditioner vector_value s = c[i]; ++it; // skip diag - for(; it != m_U.end_row(i); ++it) + for(; it != m_U.end_row(i); ++it){ // s -= it.value() * c[it.index()]; MatMultAdd(s, 1.0, s, -1.0, it.value(), c[it.index()] ); + } + // c[i] = s/uii; + InverseMatMult(c[i], 1.0, uii, s); - // c[i] = s/uii; - InverseMatMult(c[i], 1.0, uii, s); - - if(i==0) break; + if(i==0) break; } } return true; @@ -521,14 +521,14 @@ class ILUTPreconditioner : public IPreconditioner vector_value s = c[i]; ++it; // skip diag - for(; it != m_U.end_row(i); ++it) + for(; it != m_U.end_row(i); ++it){ // s -= it.value() * c[it.index()]; MatMultAdd(s, 1.0, s, -1.0, it.value(), c[it.index()] ); + } + // c[i] = s/uii; + InverseMatMult(c[i], 1.0, uii, s); - // c[i] = s/uii; - InverseMatMult(c[i], 1.0, uii, s); - - if(i==0) break; + if(i==0) break; } } } diff --git a/ugbase/lib_algebra/operator/preconditioner/jacobi.h b/ugbase/lib_algebra/operator/preconditioner/jacobi.h index 36463bd05..a649dddbb 100644 --- a/ugbase/lib_algebra/operator/preconditioner/jacobi.h +++ b/ugbase/lib_algebra/operator/preconditioner/jacobi.h @@ -114,10 +114,10 @@ class Jacobi : public IPreconditioner public: /// default constructor - Jacobi() {this->set_damp(1.0);}; + Jacobi() {this->set_damp(1.0); m_bBlock = true;}; /// constructor setting the damping parameter - Jacobi(number damp) {this->set_damp(damp);}; + Jacobi(number damp) {this->set_damp(damp); m_bBlock = true;}; /// clone constructor Jacobi( const Jacobi &parent ) @@ -141,6 +141,7 @@ class Jacobi : public IPreconditioner virtual ~Jacobi() {}; + /// sets if blocked jacobi is used (inverting block-diagonal), or plain (scalar) diagonal if false void set_block(bool b) { m_bBlock = b; @@ -206,7 +207,7 @@ class Jacobi : public IPreconditioner #else typename matrix_type::value_type &d = mat(i,i); #endif - if(m_bBlock) + if(!m_bBlock) GetDiag(m, d); else m = d; diff --git a/ugbase/lib_algebra/operator/preconditioner/schur/schur.cpp b/ugbase/lib_algebra/operator/preconditioner/schur/schur.cpp index 8380e138a..c1d802e30 100644 --- a/ugbase/lib_algebra/operator/preconditioner/schur/schur.cpp +++ b/ugbase/lib_algebra/operator/preconditioner/schur/schur.cpp @@ -30,6 +30,7 @@ * GNU Lesser General Public License for more details. */ +#include "common/debug_id.h" #include "schur.h" namespace ug{ diff --git a/ugbase/lib_algebra/parallelization/parallel_vector.h b/ugbase/lib_algebra/parallelization/parallel_vector.h index 6e0bfa60c..aa25a6e86 100644 --- a/ugbase/lib_algebra/parallelization/parallel_vector.h +++ b/ugbase/lib_algebra/parallelization/parallel_vector.h @@ -140,6 +140,9 @@ class ParallelVector : public TVector */ number norm() const; + /// max norm (overwrites TVector::maxnorm()) + number maxnorm() const; + /// dotprod (overwrites TVector::dotprod()) /** * Returns the dot product of the vector. First, the dot prod of each process @@ -185,7 +188,7 @@ class ParallelVector : public TVector virtual this_type* virtual_clone_without_values() const; private: - // type of storage (i.e. consistent, additiv, additiv unique) + // type of storage (i.e. consistent, additive, additive unique) // holds or-combiation of constants enumerated in ug::ParallelStorageType. uint m_type; diff --git a/ugbase/lib_algebra/parallelization/parallel_vector_impl.h b/ugbase/lib_algebra/parallelization/parallel_vector_impl.h index 4fcf9e0c9..ea2cc315d 100644 --- a/ugbase/lib_algebra/parallelization/parallel_vector_impl.h +++ b/ugbase/lib_algebra/parallelization/parallel_vector_impl.h @@ -293,6 +293,33 @@ number ParallelVector::norm() const return sqrt((number)tNormGlobal); } +template +inline +number ParallelVector::maxnorm() const +{ + PROFILE_FUNC_GROUP("algebra parallelization"); + + if(this->has_storage_type(PST_ADDITIVE)) + if(!const_cast*>(this)->change_storage_type(PST_UNIQUE)) + UG_THROW("ParallelVector::norm(): Cannot change" + " ParallelStorageType to unique."); + + // step 2: compute process-local defect norm, square them + double tNormLocal = (double)TVector::maxnorm(); + + // step 3: sum squared local norms + PARVEC_PROFILE_BEGIN(ParVec_norm_allreduce); + double tNormGlobal; + if(layouts()->proc_comm().empty()) + tNormGlobal = tNormLocal; + else + tNormGlobal = layouts()->proc_comm().allreduce(tNormLocal, PCL_RO_MAX); + PARVEC_PROFILE_END(); + + // step 4: return global norm ( = square root of summed squared local norms) + return (number)tNormGlobal; +} + template inline number ParallelVector::dotprod(const this_type& v) diff --git a/ugbase/lib_algebra/small_algebra/double.h b/ugbase/lib_algebra/small_algebra/double.h index 880fe53ba..873b780d3 100644 --- a/ugbase/lib_algebra/small_algebra/double.h +++ b/ugbase/lib_algebra/small_algebra/double.h @@ -66,6 +66,13 @@ inline number BlockNorm2(const number &a) return a*a; } +template number BlockMaxNorm(const T &t); +template <> +inline number BlockMaxNorm(const number &a) +{ + return a>0 ? a : -a; +} + ////////////////////////////////////////////////////// // get/set specialization for numbers diff --git a/ugbase/lib_algebra/small_algebra/small_matrix/block_dense.h b/ugbase/lib_algebra/small_algebra/small_matrix/block_dense.h index 7fafecd5a..74f5c462b 100644 --- a/ugbase/lib_algebra/small_algebra/small_matrix/block_dense.h +++ b/ugbase/lib_algebra/small_algebra/small_matrix/block_dense.h @@ -36,6 +36,7 @@ #include "densematrix.h" #include "densevector.h" +#include namespace ug{ @@ -62,6 +63,17 @@ inline double BlockNorm2(const DenseVector &v) +template +inline double BlockMaxNorm(const DenseVector &v) +{ + double max=0; + for(size_t i=0; i < v.size(); i++) + max = std::max(max, BlockMaxNorm(v[i])); + return max; +} + + + ////////////////////////////////////////////////////// // algebra stuff to avoid temporary variables diff --git a/ugbase/lib_disc/dof_manager/dof_distribution.cpp b/ugbase/lib_disc/dof_manager/dof_distribution.cpp index 51f6652e5..1b8cc0895 100644 --- a/ugbase/lib_disc/dof_manager/dof_distribution.cpp +++ b/ugbase/lib_disc/dof_manager/dof_distribution.cpp @@ -95,17 +95,30 @@ void DoFDistribution::check_subsets() { // check, that all geom objects are assigned to a subset if( m_spMGSH->num() != multi_grid()->num()) + { + geometry_traits::const_iterator iter = multi_grid()->begin(); + geometry_traits::const_iterator iterEnd = multi_grid()->end(); + for (; iter != iterEnd; ++iter) + if (m_spMGSH->get_subset_index(*iter) == -1) + UG_LOGN("Missing subset info for " << ElementDebugInfo(*multi_grid(), *iter)); UG_THROW("All Vertices " " must be assigned to a subset. The passed subset handler " " contains non-assigned elements, thus the dof distribution" " is not possible, aborting."); - + } if( m_spMGSH->num() != multi_grid()->num()) + { + geometry_traits::const_iterator iter = multi_grid()->begin(); + geometry_traits::const_iterator iterEnd = multi_grid()->end(); + for (; iter != iterEnd; ++iter) + if (m_spMGSH->get_subset_index(*iter) == -1) + UG_LOGN("Missing subset info for " << ElementDebugInfo(*multi_grid(), *iter)); + UG_THROW("All Edges " " must be assigned to a subset. The passed subset handler " " contains non-assigned elements, thus the dof distribution" " is not possible, aborting."); - + } if( m_spMGSH->num() != multi_grid()->num()) UG_THROW("All Faces " " must be assigned to a subset. The passed subset handler " diff --git a/ugbase/lib_disc/dof_manager/dof_distribution.h b/ugbase/lib_disc/dof_manager/dof_distribution.h index e24bb1f63..04b716735 100644 --- a/ugbase/lib_disc/dof_manager/dof_distribution.h +++ b/ugbase/lib_disc/dof_manager/dof_distribution.h @@ -182,6 +182,27 @@ class DoFDistribution : public DoFDistributionInfoProvider // } } + template + void collect_associated + ( + std::vector& vAssElem, + GridObject* elem, + bool clearContainer = true + ) const + { + if (dynamic_cast(elem)) + collect_associated(vAssElem, dynamic_cast(elem), clearContainer); + else if (dynamic_cast(elem)) + collect_associated(vAssElem, dynamic_cast(elem), clearContainer); + else if (dynamic_cast(elem)) + collect_associated(vAssElem, dynamic_cast(elem), clearContainer); + else if (dynamic_cast(elem)) + collect_associated(vAssElem, dynamic_cast(elem), clearContainer); + else + UG_THROW("Element is neither Vertex nor Edge, Face or Volume. " + "Other elements not implemented."); + } + /// returns if the grid object is part of the dof distribution template bool is_contained(TGeomObj* obj) const{ diff --git a/ugbase/lib_disc/dof_manager/ordering/downwindorder.cpp b/ugbase/lib_disc/dof_manager/ordering/downwindorder.cpp index c64c4e259..499b0cc28 100644 --- a/ugbase/lib_disc/dof_manager/ordering/downwindorder.cpp +++ b/ugbase/lib_disc/dof_manager/ordering/downwindorder.cpp @@ -102,7 +102,8 @@ void OrderDownwindForDofDist(SmartPtr dd, ConstSmartPtr vAdjacency; // count how many vertex were kept / removed per adjacency vector - size_t initialcount, kept, removed = 0; + size_t kept, removed = 0; + size_t initialcount = 0; MathVector vVel1, vPos1, vPos2, vDir1_2; size_t i; diff --git a/ugbase/lib_disc/domain_util.cpp b/ugbase/lib_disc/domain_util.cpp index af9ba8a1e..09f833b8e 100644 --- a/ugbase/lib_disc/domain_util.cpp +++ b/ugbase/lib_disc/domain_util.cpp @@ -156,6 +156,15 @@ number MaxElementDiameter(TDomain& domain, int level) domain.grid()->template end(level)); } +template +number MinElementDiameter(TDomain& domain, int level) +{ + typedef typename domain_traits::grid_base_object TElem; + return MinElementDiameter(*domain.grid(), domain.position_accessor(), + domain.grid()->template begin(level), + domain.grid()->template end(level)); +} + template void LoadDomain(Domain1d& domain, const char* filename); template void LoadDomain(Domain2d& domain, const char* filename); template void LoadDomain(Domain3d& domain, const char* filename); @@ -172,5 +181,9 @@ template number MaxElementDiameter(Domain1d& domain, int level); template number MaxElementDiameter(Domain2d& domain, int level); template number MaxElementDiameter(Domain3d& domain, int level); +template number MinElementDiameter(Domain1d& domain, int level); +template number MinElementDiameter(Domain2d& domain, int level); +template number MinElementDiameter(Domain3d& domain, int level); + } // end namespace ug diff --git a/ugbase/lib_disc/domain_util.h b/ugbase/lib_disc/domain_util.h index 49af84435..faa1a6cc0 100644 --- a/ugbase/lib_disc/domain_util.h +++ b/ugbase/lib_disc/domain_util.h @@ -153,6 +153,10 @@ number ElementDiameter(const TElem& elem, TDomain& domain); template number MaxElementDiameter(TDomain& domain, int level); +/// returns the minimal diameter of all elements between iterBegin and iterEnd. +template +number MinElementDiameter(TDomain& domain, int level); + // end group lib_disc_domain /// \} diff --git a/ugbase/lib_disc/function_spaces/error_elem_marking_strategy.h b/ugbase/lib_disc/function_spaces/error_elem_marking_strategy.h index 9a0074c6d..d79a345f0 100644 --- a/ugbase/lib_disc/function_spaces/error_elem_marking_strategy.h +++ b/ugbase/lib_disc/function_spaces/error_elem_marking_strategy.h @@ -177,10 +177,13 @@ class StdCoarseningMarkingStrategy : public IElementMarkingStrategy typedef IElementMarkingStrategy base_type; StdCoarseningMarkingStrategy(number tol) - : m_tol(tol), m_safety(8.0) {}; + : m_tol(tol), m_safety(8.0), m_minLvl(0) {} StdCoarseningMarkingStrategy(number tol, number safety) - : m_tol(tol), m_safety(safety) {}; + : m_tol(tol), m_safety(safety), m_minLvl(0) {} + + StdCoarseningMarkingStrategy(number tol, number safety, int minLvl) + : m_tol(tol), m_safety(safety), m_minLvl(minLvl) {} void set_tolerance(number tol) {m_tol = tol;} void set_safety_factor(number safety) {m_safety = safety;} @@ -190,9 +193,9 @@ class StdCoarseningMarkingStrategy : public IElementMarkingStrategy ConstSmartPtr dd); protected: - number m_tol; number m_safety; + int m_minLvl; }; template @@ -200,7 +203,7 @@ void StdCoarseningMarkingStrategy::mark(typename base_type::elem_access IRefiner& refiner, ConstSmartPtr dd) { - MarkElementsForCoarsening(aaError, refiner, dd, m_tol, m_safety); + MarkElementsForCoarsening(aaError, refiner, dd, m_tol, m_safety, m_minLvl); } @@ -243,7 +246,7 @@ number CreateSortedListOfElems( std::vector< std::pair > &etaSqList) { - typedef typename std::pair TPair; + //typedef typename std::pair TPair; typename DoFDistribution::traits::const_iterator iter; number localErrSq=0; @@ -430,7 +433,7 @@ void APosterioriCoarsening::mark(typename base_type::elem_accessor_type ConstSmartPtr dd) { typedef typename base_type::elem_type TElem; - typedef typename DoFDistribution::traits::const_iterator const_iterator; + //typedef typename DoFDistribution::traits::const_iterator const_iterator; typedef typename std::pair TPair; typedef typename std::vector TPairVector; diff --git a/ugbase/lib_disc/function_spaces/error_indicator.h b/ugbase/lib_disc/function_spaces/error_indicator.h index 7ed37c0b9..df96b51b7 100644 --- a/ugbase/lib_disc/function_spaces/error_indicator.h +++ b/ugbase/lib_disc/function_spaces/error_indicator.h @@ -1100,7 +1100,7 @@ void EvaluateResidualErrorP1(SmartPtr u, // evaluate L2-Norm of f and store element contributions in aaError /*SmartPtr > spIntegrand = make_sp(new UserDataIntegrand(f, u, time));*/ - UserDataIntegrand integrand(f, u, time); + UserDataIntegrand integrand(f, &(*u), time); Integrate(u->template begin(), u->template end(), aaPos, integrand, quadOrder, quadType, &aaError); diff --git a/ugbase/lib_disc/function_spaces/error_indicator_util.h b/ugbase/lib_disc/function_spaces/error_indicator_util.h index b8b93dc86..258e8acfa 100644 --- a/ugbase/lib_disc/function_spaces/error_indicator_util.h +++ b/ugbase/lib_disc/function_spaces/error_indicator_util.h @@ -397,7 +397,8 @@ void MarkElementsForCoarsening IRefiner& refiner, ConstSmartPtr dd, number TOL, - number safety + number safety, + int minLevel = 0 ) { typedef typename DoFDistribution::traits::const_iterator const_iterator; @@ -428,6 +429,10 @@ void MarkElementsForCoarsening // ignore if already marked for coarsening if (refiner.get_mark(elem) & RM_COARSEN) continue; + // ignore if level too low + if (dd->multi_grid()->get_level(elem) <= minLevel) + continue; + // get parent TElem* parent = dynamic_cast(dd->multi_grid()->get_parent(elem)); if (!parent) continue; // either dynamic casting failed or parent does not exist diff --git a/ugbase/lib_disc/function_spaces/grid_function_user_data.h b/ugbase/lib_disc/function_spaces/grid_function_user_data.h index 892075315..8d323c754 100644 --- a/ugbase/lib_disc/function_spaces/grid_function_user_data.h +++ b/ugbase/lib_disc/function_spaces/grid_function_user_data.h @@ -293,11 +293,25 @@ class GridFunctionVectorData } } + + if(bDeriv){ + for(size_t ip = 0; ip < nip; ++ip){ + for(int d = 0; d < dim; ++d) + { + const LocalShapeFunctionSet& rTrialSpace = + LocalFiniteElementProvider::get(roid, m_vlfeID[d]); + // evaluate at shapes at ip + rTrialSpace.shapes(vShape, vLocIP[ip]); + + for(size_t sh = 0; sh < vShape.size(); ++sh) + vvvDeriv[ip][d][sh][d] = vShape[sh]; + } + } + } + + }UG_CATCH_THROW("GridFunctionVectorData: Reference Object: " <& value, diff --git a/ugbase/lib_disc/function_spaces/grid_function_util.h b/ugbase/lib_disc/function_spaces/grid_function_util.h index 514d07ca5..f7967d9b1 100644 --- a/ugbase/lib_disc/function_spaces/grid_function_util.h +++ b/ugbase/lib_disc/function_spaces/grid_function_util.h @@ -74,6 +74,87 @@ using boost::math::isnan; using boost::math::isinf; #endif + +template +static void ScaleGFOnElems +( + ConstSmartPtr dd, + SmartPtr vecOut, + ConstSmartPtr vecIn, + const std::vector& vScale +) +{ + typename DoFDistribution::traits::const_iterator iter, iterEnd; + std::vector vInd; + + try + { + // iterate all elements (including SHADOW_RIM_COPY!) + iter = dd->template begin(SurfaceView::ALL); + iterEnd = dd->template end(SurfaceView::ALL); + for (; iter != iterEnd; ++iter) + { + for (size_t fi = 0; fi < dd->num_fct(); ++fi) + { + size_t nInd = dd->inner_dof_indices(*iter, fi, vInd); + + // remember multi indices + for (size_t dof = 0; dof < nInd; ++dof) + DoFRef(*vecOut, vInd[dof]) = vScale[fi] * DoFRef(*vecIn, vInd[dof]); + } + } + } + UG_CATCH_THROW("Error while scaling vector.") +} + + +/** + * \brief Scales all functions contained in a grid function. + * + * Each function has a separate scaling factor. + * + * \param scaledVecOut the scaled grid function (output) + * \param vecIn the original grid function (input) + * \param scalingFactors vector of scales for each of the composite functions + */ +template +void ScaleGF +( + SmartPtr scaledVecOut, + ConstSmartPtr vecIn, + const std::vector& scalingFactors +) +{ + // check that the correct numbers of scaling factors are given + size_t n = scalingFactors.size(); + UG_COND_THROW(n != vecIn->num_fct(), "Number of scaling factors (" << n << ") " + "does not match number of functions given in dimless vector (" << vecIn->num_fct() << ")."); + + // check that input and output vectors have the same number of components and dofs + UG_COND_THROW(n != scaledVecOut->num_fct(), "Input and output vectors do not have " + "the same number of functions (" << n << " vs. " << scaledVecOut->num_fct() << ")."); + for (size_t fct = 0; fct < n; ++fct) + { + UG_COND_THROW(vecIn->num_dofs(fct) != scaledVecOut->num_dofs(fct), + "Input and output vectors do not have the same number of DoFs for function " << fct + << " (" << vecIn->num_dofs(fct) << " vs. " << scaledVecOut->num_dofs(fct) << ")."); + } + + ConstSmartPtr dd = vecIn->dof_distribution(); + + if (dd->max_dofs(VERTEX)) + ScaleGFOnElems(dd, scaledVecOut, vecIn, scalingFactors); + if (dd->max_dofs(EDGE)) + ScaleGFOnElems(dd, scaledVecOut, vecIn, scalingFactors); + if (dd->max_dofs(FACE)) + ScaleGFOnElems(dd, scaledVecOut, vecIn, scalingFactors); + if (dd->max_dofs(VOLUME)) + ScaleGFOnElems(dd, scaledVecOut, vecIn, scalingFactors); +} + + + + //////////////////////////////////////////////////////////////////////////////// // AverageComponent //////////////////////////////////////////////////////////////////////////////// @@ -830,7 +911,6 @@ class GridFunctionDebugWriter: public IDebugWriter /// write vector virtual void write_vector(const vector_type& vec, const char* filename) { - // write to conn viewer if (bConnViewerOut) write_vector_to_conn_viewer(vec, filename); @@ -854,15 +934,9 @@ class GridFunctionDebugWriter: public IDebugWriter update_positions(); - std::string name = get_base_dir() + "/" + filename; - - if (!FileExists(get_base_dir())) { - UG_WARNING("GridFunctionDebugWriter::write_matrix: directory " - << get_base_dir() << "does not exist."); - UG_WARNING("GridFunctionDebugWriter::write_matrix: using cwd " - "as basedir."); - name = "./"; name.append(filename); - } + std::string name; + this->compose_file_path (name); + name += filename; if ( !FileTypeIs( filename, ".mat" ) ) { UG_THROW( "Only '.mat' format supported for matrices, but" @@ -931,15 +1005,9 @@ class GridFunctionDebugWriter: public IDebugWriter PROFILE_FUNC_GROUP("debug"); update_positions(); - std::string name = get_base_dir() + "/" + filename; - - if (!FileExists(get_base_dir())) { - UG_WARNING("GridFunctionDebugWriter::write_vector_to_conn_viewer: directory " - << get_base_dir() << "does not exist."); - UG_WARNING("GridFunctionDebugWriter::write_vector_to_conn_viewer: using cwd " - "as basedir."); - name = "./"; name.append(filename); - } + std::string name; + this->compose_file_path (name); + name += filename; if ( !FileTypeIs( filename, ".vec" ) ) { UG_THROW( "Only '.vec' format supported for vectors, but" @@ -959,15 +1027,10 @@ class GridFunctionDebugWriter: public IDebugWriter void write_vector_to_vtk(const vector_type& vec, const char* filename) { PROFILE_FUNC_GROUP("debug"); // check name - std::string name = get_base_dir() + "/" + filename; - - if (!FileExists(get_base_dir())) { - UG_WARNING("GridFunctionDebugWriter::write_vector_to_vtk: directory " - << get_base_dir() << "does not exist."); - UG_WARNING("GridFunctionDebugWriter::write_vector_to_vtk: using cwd " - "as basedir."); - name = "./"; name.append(filename); - } + + std::string name; + this->compose_file_path (name); + name += filename; typedef GridFunction TGridFunction; TGridFunction vtkFunc( diff --git a/ugbase/lib_disc/function_spaces/integrate.h b/ugbase/lib_disc/function_spaces/integrate.h index c9ef53c24..fc33c107d 100644 --- a/ugbase/lib_disc/function_spaces/integrate.h +++ b/ugbase/lib_disc/function_spaces/integrate.h @@ -7,7 +7,7 @@ * UG4 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License version 3 (as published by the * Free Software Foundation) with the following additional attribution - * requirements (according to LGPL/GPL v3 §7): + * requirements (according to LGPL/GPL v3): * * (1) The following notice must be displayed in the Appropriate Legal Notices * of covered and combined works: "Based on UG4 (www.ug4.org/license)". @@ -43,6 +43,7 @@ #include "lib_disc/common/function_group.h" #include "lib_disc/common/groups_util.h" +#include "lib_disc/domain_util.h" // for CollectCornerCoordinates #include "lib_disc/quadrature/quadrature_provider.h" #include "lib_disc/local_finite_element/local_finite_element_provider.h" #include "lib_disc/spatial_disc/disc_util/fv1_geom.h" @@ -478,7 +479,7 @@ class UserDataIntegrand SmartPtr > m_spData; // grid function - SmartPtr m_spGridFct; + TGridFunction* m_spGridFct; // time number m_time; @@ -486,7 +487,7 @@ class UserDataIntegrand public: /// constructor UserDataIntegrand(SmartPtr > spData, - SmartPtr spGridFct, + TGridFunction* spGridFct, number time) : m_spData(spData), m_spGridFct(spGridFct), m_time(time) { @@ -498,9 +499,8 @@ class UserDataIntegrand number time) : m_spData(spData), m_spGridFct(NULL), m_time(time) { - if(m_spData->requires_grid_fct()) - UG_THROW("UserDataIntegrand: Missing GridFunction, but " - " data requires grid function.") + UG_COND_THROW(m_spData->requires_grid_fct(), + "UserDataIntegrand: Missing GridFunction, but data requires grid function."); }; /// \copydoc IIntegrand::values @@ -855,14 +855,19 @@ class UserDataDistIntegrandSq template number Integral(SmartPtr > spData, - SmartPtr spGridFct, + TGridFunction& spGridFct, const char* subsets, number time, int quadOrder, std::string quadType) { - UserDataIntegrand spIntegrand(spData, spGridFct, time); - return IntegrateSubsets(spIntegrand, *spGridFct, subsets, quadOrder, quadType); + UserDataIntegrand spIntegrand(spData, &spGridFct, time); + return IntegrateSubsets(spIntegrand, spGridFct, subsets, quadOrder, quadType); } +template +number Integral(SmartPtr > spData, SmartPtr spGridFct, + const char* subsets, number time, int quadOrder, std::string quadType) +{ return Integral(spData, *spGridFct, subsets, time, quadOrder, quadType); } + template number Integral(SmartPtr > spData, SmartPtr spGridFct,const char* subsets,number time, int order) {return Integral(spData, spGridFct, subsets, time, order, "best");} @@ -928,7 +933,7 @@ number Integral(const char* luaFct, static const int dim = TGridFunction::dim; SmartPtr > sp = LuaUserDataFactory::create(luaFct); - return Integral(sp, spGridFct, subsets, time, quadOrder, quadType); + return Integral(sp, *spGridFct, subsets, time, quadOrder, quadType); } template @@ -1068,28 +1073,33 @@ class L2ErrorIntegrand */ template number L2Error(SmartPtr > spExactSol, - SmartPtr spGridFct, const char* cmp, + TGridFunction& gridFct, const char* cmp, number time, int quadOrder, const char* subsets) { // get function id of name - const size_t fct = spGridFct->fct_id_by_name(cmp); + const size_t fct = gridFct.fct_id_by_name(cmp); // check that function exists - if(fct >= spGridFct->num_fct()) - UG_THROW("L2Error: Function space does not contain" - " a function with name " << cmp << "."); + UG_COND_THROW(fct >= gridFct.num_fct(), + "L2Error: Function space does not contain a function with name " << cmp << "."); - L2ErrorIntegrand spIntegrand(spExactSol, *spGridFct, fct, time); - return sqrt(IntegrateSubsets(spIntegrand, *spGridFct, subsets, quadOrder)); + L2ErrorIntegrand spIntegrand(spExactSol, gridFct, fct, time); + return sqrt(IntegrateSubsets(spIntegrand, gridFct, subsets, quadOrder)); } +template +number L2Error(SmartPtr > spExactSol, + SmartPtr spGridFct, const char* cmp, + number time, int quadOrder, const char* subsets) +{ return L2Error(spExactSol, *spGridFct, cmp, time, quadOrder, subsets); } + template number L2Error(SmartPtr > spExactSol, SmartPtr spGridFct, const char* cmp, number time, int quadOrder) -{ - return L2Error(spExactSol, spGridFct, cmp, time, quadOrder, NULL); -} +{ return L2Error(spExactSol, *spGridFct, cmp, time, quadOrder, NULL); } + + #ifdef UG_FOR_LUA @@ -1371,7 +1381,6 @@ number GridFunctionDistance2(TGridFunction& spGridFct1, const char* cmp1, const int level1 = spGridFct1.dof_distribution()->grid_level().level(); const int level2 = spGridFct2.dof_distribution()->grid_level().level(); - // w/ weights if(level1 > level2){ TDistIntegrand spIntegrand(spGridFct1, fct1, spGridFct2, fct2, spWeights); @@ -1380,9 +1389,41 @@ number GridFunctionDistance2(TGridFunction& spGridFct1, const char* cmp1, TDistIntegrand spIntegrand(spGridFct2, fct2, spGridFct1, fct1, spWeights); return IntegrateSubsets(spIntegrand, spGridFct2, subsets, quadOrder); } +} +//! Computes (weighted) distance with shift for averages +template +number GridFunctionDistance2(TGridFunction& spGridFct1, const char* cmp1, + TGridFunction& spGridFct2, const char* cmp2, + int quadOrder, const char* subsets, + ConstSmartPtr spWeights, + number distAvg12) +{ +// get function id of name + const size_t fct1 = spGridFct1.fct_id_by_name(cmp1); + const size_t fct2 = spGridFct2.fct_id_by_name(cmp2); + +// check that function exists + if(fct1 >= spGridFct1.num_fct()) + UG_THROW("GridFunctionDistance: Function space does not contain" + " a function with name " << cmp1 << "."); + if(fct2 >= spGridFct2.num_fct()) + UG_THROW("GridFunctionDistance: Function space does not contain" + " a function with name " << cmp2 << "."); + +// get top level of gridfunctions + const int level1 = spGridFct1.dof_distribution()->grid_level().level(); + const int level2 = spGridFct2.dof_distribution()->grid_level().level(); + // w/ weights + if(level1 > level2){ + TDistIntegrand spIntegrand(spGridFct1, fct1, spGridFct2, fct2, spWeights, distAvg12); + return IntegrateSubsets(spIntegrand, spGridFct1, subsets, quadOrder); + }else{ + TDistIntegrand spIntegrand(spGridFct2, fct2, spGridFct1, fct1, spWeights, -distAvg12); + return IntegrateSubsets(spIntegrand, spGridFct2, subsets, quadOrder); + } } @@ -1509,8 +1550,7 @@ number L2Norm2(TGridFunction& u, const char* cmp, const size_t fct = u.fct_id_by_name(cmp); // check that function exists - if(fct >= u.num_fct()) - UG_THROW("L2Norm: Function space does not contain" + UG_COND_THROW(fct >= u.num_fct(), "L2Norm: Function space does not contain" " a function with name " << cmp << "."); L2Integrand integrandL2(u, fct, spWeight); @@ -1525,8 +1565,7 @@ number L2Norm2(TGridFunction& u, const char* cmp, const size_t fct = u.fct_id_by_name(cmp); // check that function exists - if(fct >= u.num_fct()) - UG_THROW("L2Norm: Function space does not contain" + UG_COND_THROW(fct >= u.num_fct(), "L2Norm: Function space does not contain" " a function with name " << cmp << "."); L2Integrand integrandL2(u, fct); @@ -1582,6 +1621,9 @@ class L2DistIntegrand ConstSmartPtr m_spWeight; + /// shift + double m_deltaFineCoarse; + public: /// constructor (1st is fine grid function) @@ -1589,13 +1631,13 @@ class L2DistIntegrand TGridFunction& coarseGridFct, size_t coarseCmp) : m_fineData(fineGridFct, fineCmp), m_fineTopLevel(fineGridFct.dof_distribution()->grid_level().level()), m_coarseData(coarseGridFct, coarseCmp), m_coarseTopLevel(coarseGridFct.dof_distribution()->grid_level().level()), - m_spMG(m_fineData.domain()->grid()), m_spWeight(make_sp(new ConstUserNumber(1.0))) + m_spMG(m_fineData.domain()->grid()), m_spWeight(make_sp(new ConstUserNumber(1.0))), + m_deltaFineCoarse(0.0) { - if(m_fineTopLevel < m_coarseTopLevel) - UG_THROW("L2DiffIntegrand: fine and top level inverted."); - - if(m_fineData.domain().get() != m_coarseData.domain().get()) - UG_THROW("L2DiffIntegrand: grid functions defined on different domains."); + UG_COND_THROW(m_fineTopLevel < m_coarseTopLevel, + "L2DiffIntegrand: fine and top level inverted."); + UG_COND_THROW(m_fineData.domain().get() != m_coarseData.domain().get(), + "L2DiffIntegrand: grid functions defined on different domains."); }; /// constructor (1st is fine grid function) @@ -1603,26 +1645,39 @@ class L2DistIntegrand TGridFunction& coarseGridFct, size_t coarseCmp, ConstSmartPtr spWeight) : m_fineData(fineGridFct, fineCmp), m_fineTopLevel(fineGridFct.dof_distribution()->grid_level().level()), m_coarseData(coarseGridFct, coarseCmp), m_coarseTopLevel(coarseGridFct.dof_distribution()->grid_level().level()), - m_spMG(m_fineData.domain()->grid()), m_spWeight(spWeight) + m_spMG(m_fineData.domain()->grid()), m_spWeight(spWeight), + m_deltaFineCoarse(0.0) { - if(m_fineTopLevel < m_coarseTopLevel) - UG_THROW("L2DiffIntegrand: fine and top level inverted."); + UG_COND_THROW(m_fineTopLevel < m_coarseTopLevel, + "L2DiffIntegrand: fine and top level inverted."); + UG_COND_THROW(m_fineData.domain().get() != m_coarseData.domain().get(), + "L2DiffIntegrand: grid functions defined on different domains."); + }; - if(m_fineData.domain().get() != m_coarseData.domain().get()) - UG_THROW("L2DiffIntegrand: grid functions defined on different domains."); + /// constructor (1st is fine grid function) + L2DistIntegrand(TGridFunction& fineGridFct, size_t fineCmp, + TGridFunction& coarseGridFct, size_t coarseCmp, ConstSmartPtr spWeight, number dist12) + : m_fineData(fineGridFct, fineCmp), m_fineTopLevel(fineGridFct.dof_distribution()->grid_level().level()), + m_coarseData(coarseGridFct, coarseCmp), m_coarseTopLevel(coarseGridFct.dof_distribution()->grid_level().level()), + m_spMG(m_fineData.domain()->grid()), m_spWeight(spWeight), + m_deltaFineCoarse(dist12) + { + UG_COND_THROW(m_fineTopLevel < m_coarseTopLevel, + "L2DiffIntegrand: fine and top level inverted."); + UG_COND_THROW(m_fineData.domain().get() != m_coarseData.domain().get(), + "L2DiffIntegrand: grid functions defined on different domains."); }; + virtual ~L2DistIntegrand() {} /// sets subset virtual void set_subset(int si) { - if(!m_fineData.is_def_in_subset(si)) - UG_THROW("L2DiffIntegrand: Grid function component" - <::set_subset(si); } @@ -1707,11 +1762,11 @@ class L2DistIntegrand } // get squared of difference - vValue[ip] = fineElemWeights[ip]*(coarseSolIP - fineSolIP)*(coarseSolIP - fineSolIP); + vValue[ip] = fineElemWeights[ip]*(fineSolIP - coarseSolIP -m_deltaFineCoarse)*(fineSolIP-coarseSolIP-m_deltaFineCoarse); } } - UG_CATCH_THROW("L2ErrorIntegrand::evaluate: trial space missing."); + UG_CATCH_THROW("L2DistIntegrand::evaluate: trial space missing."); }; }; @@ -1721,10 +1776,10 @@ template number L2Distance2(TGridFunction& spGridFct1, const char* cmp1, TGridFunction& spGridFct2, const char* cmp2, int quadOrder, const char* subsets, - ConstSmartPtr::weight_type> spWeight) + ConstSmartPtr::weight_type> spWeight, number avgDist12=0.0) { return GridFunctionDistance2, TGridFunction> - (spGridFct1, cmp1, spGridFct2, cmp2, quadOrder, subsets, spWeight); + (spGridFct1, cmp1, spGridFct2, cmp2, quadOrder, subsets, spWeight, avgDist12); } @@ -1802,8 +1857,8 @@ class H1SemiIntegrand /// sets subset virtual void set_subset(int si) { - if(!m_scalarData.is_def_in_subset(si)) - UG_THROW("H1Error: Grid function component" + + UG_COND_THROW(!m_scalarData.is_def_in_subset(si), "H1Error: Grid function component" <::set_subset(si); } @@ -1869,8 +1924,7 @@ class H1SemiIntegrand gridFct.dof_indices(pElem, m_scalarData.fct(), ind); // check multi indices - if(ind.size() != num_sh) - UG_THROW("H1SemiNormFuncIntegrand::evaluate: Wrong number of multi-)indices."); + UG_COND_THROW(ind.size() != num_sh, "H1SemiNormFuncIntegrand::evaluate: Wrong number of multi-)indices."); // loop all integration points std::vector > vLocGradient(num_sh); @@ -1932,8 +1986,7 @@ number H1SemiNorm2(TGridFunction& gridFct, const char* cmp, int quadOrder, const const size_t fct = gridFct.fct_id_by_name(cmp); // check that function exists - if(fct >= gridFct.num_fct()) - UG_THROW("H1SemiNorm: Function space does not contain" + UG_COND_THROW(fct >= gridFct.num_fct(), "H1SemiNorm: Function space does not contain" " a function with name " << cmp << "."); if (weights.invalid()) { H1SemiIntegrand integrand(gridFct, fct); @@ -2022,22 +2075,18 @@ class H1SemiDistIntegrand : public StdIntegrandgrid()), m_spWeight(spWeight) { - if(m_fineTopLevel < m_coarseTopLevel) - UG_THROW("H1SemiDiffIntegrand: fine and top level inverted."); - - if(m_fineData.domain().get() != m_coarseData.domain().get()) - UG_THROW("H1SemiDiffIntegrand: grid functions defined on different domains."); + UG_COND_THROW(m_fineTopLevel < m_coarseTopLevel, "H1SemiDiffIntegrand: fine and top level inverted."); + UG_COND_THROW(m_fineData.domain().get() != m_coarseData.domain().get(), "H1SemiDiffIntegrand: grid functions defined on different domains."); } virtual ~H1SemiDistIntegrand(){} /// sets subset virtual void set_subset(int si) { - if(!m_fineData.is_def_in_subset(si)) - UG_THROW("H1SemiDiffIntegrand: Grid function component" - <::set_subset(si); } @@ -2280,8 +2329,8 @@ class H1EnergyIntegrand /// sets subset virtual void set_subset(int si) { - if(!m_scalarData.is_def_in_subset(si)) - UG_THROW("H1EnergyIntegrand: Grid function component" + + UG_COND_THROW(!m_scalarData.is_def_in_subset(si), "H1EnergyIntegrand: Grid function component" <::set_subset(si); } @@ -2347,8 +2396,7 @@ class H1EnergyIntegrand gridFct.dof_indices(pElem, m_scalarData.fct(), ind); // check multi indices - if(ind.size() != num_sh) - UG_THROW("H1EnergyIntegrand::evaluate: Wrong number of multi-)indices."); + UG_COND_THROW(ind.size() != num_sh, "H1EnergyIntegrand::evaluate: Wrong number of multi-)indices."); // loop all integration points std::vector > vLocGradient(num_sh); @@ -2410,8 +2458,7 @@ number H1EnergyNorm2(TGridFunction& gridFct, const char* cmp, int quadOrder, con const size_t fct = gridFct.fct_id_by_name(cmp); // check that function exists - if(fct >= gridFct.num_fct()) - UG_THROW("H1SemiNorm: Function space does not contain" + UG_COND_THROW(fct >= gridFct.num_fct(), "H1SemiNorm: Function space does not contain" " a function with name " << cmp << "."); if (weights.invalid()) { H1EnergyIntegrand integrand(gridFct, fct); @@ -2779,7 +2826,7 @@ class H1NormIntegrand // compute global gradient MathVector approxGradIP; MathMatrix JTInv; - Inverse(JTInv, vJT[ip]); + RightInverse(JTInv, vJT[ip]); MatVecMult(approxGradIP, JTInv, locTmp); // get squared of difference @@ -2968,7 +3015,7 @@ class H1DistIntegrand // compute global gradient MathVector fineGradIP; MathMatrix fineJTInv; - Inverse(fineJTInv, vJT[ip]); + RightInverse(fineJTInv, vJT[ip]); MatVecMult(fineGradIP, fineJTInv, fineLocTmp); // compute global gradient @@ -3040,21 +3087,23 @@ class StdFuncIntegrand private: // grid function - SmartPtr m_spGridFct; + TGridFunction* m_pGridFct; // component of function const size_t m_fct; public: /// constructor - StdFuncIntegrand(SmartPtr spGridFct, size_t cmp) - : m_spGridFct(spGridFct), m_fct(cmp) + StdFuncIntegrand(TGridFunction* pGridFct, size_t cmp) + : m_pGridFct(pGridFct), m_fct(cmp) {}; + virtual ~StdFuncIntegrand(){} + /// sets subset virtual void set_subset(int si) { - if(!m_spGridFct->is_def_in_subset(m_fct, si)) + if(!m_pGridFct->is_def_in_subset(m_fct, si)) UG_THROW("L2ErrorIntegrand: Grid function component" <::set_subset(si); @@ -3073,7 +3122,7 @@ class StdFuncIntegrand // get reference object id (i.e. Triangle, Quadrilateral, Tetrahedron, ...) ReferenceObjectID roid = (ReferenceObjectID) pElem->reference_object_id(); - const LFEID m_id = m_spGridFct->local_finite_element_id(m_fct); + const LFEID m_id = m_pGridFct->local_finite_element_id(m_fct); try{ // get trial space @@ -3086,12 +3135,11 @@ class StdFuncIntegrand // get multiindices of element std::vector ind; // aux. index array - m_spGridFct->dof_indices(pElem, m_fct, ind); + m_pGridFct->dof_indices(pElem, m_fct, ind); // check multi indices - if(ind.size() != num_sh) - UG_THROW("StdFuncIntegrand::evaluate: Wrong number of" - " multi indices."); + UG_COND_THROW(ind.size() != num_sh, + "StdFuncIntegrand::evaluate: Wrong number of multi indices."); // loop all integration points for(size_t ip = 0; ip < numIP; ++ip) @@ -3103,7 +3151,7 @@ class StdFuncIntegrand { // get value at shape point (e.g. corner for P1 fct) // and add shape fct at ip * value at shape - const number valSH = DoFRef((*m_spGridFct), ind[sh]); + const number valSH = DoFRef((*m_pGridFct), ind[sh]); approxSolIP += valSH * rTrialSpace.shape(sh, vLocIP[ip]); } @@ -3119,7 +3167,7 @@ class StdFuncIntegrand template -number StdFuncIntegralOnVertex(SmartPtr spGridFct, +number StdFuncIntegralOnVertex(TGridFunction& gridFct, size_t fct, int si) { @@ -3132,8 +3180,8 @@ number StdFuncIntegralOnVertex(SmartPtr spGridFct, // note: this iterator is for the base elements, e.g. Face and not // for the special type, e.g. Triangle, Quadrilateral - const_iterator iter = spGridFct->template begin(si); - const_iterator iterEnd = spGridFct->template end(si); + const_iterator iter = gridFct.template begin(si); + const_iterator iterEnd = gridFct.template end(si); // iterate over all elements for(; iter != iterEnd; ++iter) @@ -3142,13 +3190,13 @@ number StdFuncIntegralOnVertex(SmartPtr spGridFct, grid_base_object* pElem = *iter; std::vector ind; // aux. index array - spGridFct->dof_indices(pElem, fct, ind); + gridFct.dof_indices(pElem, fct, ind); // compute approximated solution at integration point number value = 0.0; for(size_t sh = 0; sh < ind.size(); ++sh) { - value += DoFRef((*spGridFct), ind[sh]); + value += DoFRef(gridFct, ind[sh]); } // add to global sum @@ -3160,21 +3208,24 @@ number StdFuncIntegralOnVertex(SmartPtr spGridFct, return integral; } +template +number StdFuncIntegralOnVertex(SmartPtr spGridFct, size_t fct, int si) +{ return StdFuncIntegralOnVertex(*spGridFct, fct, si); } + template -number Integral(SmartPtr spGridFct, const char* cmp, +number Integral(TGridFunction& gridFct, const char* cmp, const char* subsets, int quadOrder) { // get function id of name - const size_t fct = spGridFct->fct_id_by_name(cmp); + const size_t fct = gridFct.fct_id_by_name(cmp); // check that function exists - if(fct >= spGridFct->num_fct()) - UG_THROW("L2Norm: Function space does not contain" + UG_COND_THROW(fct >= gridFct.num_fct(), "L2Norm: Function space does not contain" " a function with name " << cmp << "."); // read subsets - SubsetGroup ssGrp(spGridFct->domain()->subset_handler()); + SubsetGroup ssGrp(gridFct.domain()->subset_handler()); if(subsets != NULL) { ssGrp.add(TokenizeString(subsets)); @@ -3198,7 +3249,7 @@ number Integral(SmartPtr spGridFct, const char* cmp, { number value = 0; for(size_t s = 0; s < ssGrp.size(); ++s) - value += StdFuncIntegralOnVertex(spGridFct, fct, ssGrp[s]); + value += StdFuncIntegralOnVertex(gridFct, fct, ssGrp[s]); #ifdef UG_PARALLEL // sum over processes @@ -3212,10 +3263,16 @@ number Integral(SmartPtr spGridFct, const char* cmp, return value; } - StdFuncIntegrand spIntegrand(spGridFct, fct); - return IntegrateSubsets(spIntegrand, *spGridFct, subsets, quadOrder); + StdFuncIntegrand integrand(&gridFct, fct); + return IntegrateSubsets(integrand, gridFct, subsets, quadOrder); } +template +number Integral(SmartPtr spGridFct, const char* cmp, + const char* subsets, int quadOrder) +{ return Integral(*spGridFct, cmp, subsets, quadOrder); } + + template number Integral(SmartPtr spGridFct, const char* cmp, const char* subsets) @@ -3575,7 +3632,7 @@ number IntegralNormalComponentOnManifold( int quadOrder) { SmartPtr, TGridFunction::dim> > spIntegrand - = make_sp(new UserDataIntegrand, TGridFunction>(spData, spGridFct, time)); + = make_sp(new UserDataIntegrand, TGridFunction>(spData, &(*spGridFct), time)); return IntegralNormalComponentOnManifoldSubsets(spIntegrand, spGridFct, BndSubset, InnerSubset, quadOrder); } @@ -3657,6 +3714,151 @@ number IntegralNormalComponentOnManifold( //////////////////////////////////////////////////////////////////////////////// // Boundary Integral //////////////////////////////////////////////////////////////////////////////// +/// Integrates a component over some boundary subsets +/** + * This function integrates \f$ -c \cdot \vec{n} \f$ over some selected + * boundary subsets, where c is a component of the grid function u. The + * integral is taken over all boundary subset manifold geometric objects + * + * @param u a grid function + * @param cmp the component c which should be integrated + * @param BndSubset a comma-separated string of symbolic boundary subset names + * @return the integral + */ + +template +number IntegrateNormalComponentOnManifold(TGridFunction& u, const char* cmp, + const char* BndSubset) +{ +// get function id of name + const size_t fct = u.fct_id_by_name(cmp); + +// check that function exists + if(fct >= u.num_fct()) + UG_THROW("IntegrateNormalComponentOnManifold: Function space does not contain" + " a function with name " << cmp << "."); + + if(u.local_finite_element_id(fct) != LFEID(LFEID::LAGRANGE, TGridFunction::dim, 1)) + UG_THROW("IntegrateNormalComponentOnManifold:" + "Only implemented for Lagrange P1 functions."); + +// read bnd subsets + SubsetGroup bndSSGrp(u.domain()->subset_handler()); + bndSSGrp.add(TokenizeString(BndSubset)); + +// reset value + number value = 0; + +// loop subsets + for(size_t i = 0; i < bndSSGrp.size(); ++i) + { + // get subset index + const int si = bndSSGrp[i]; + + // skip if function is not defined in subset + if(!u.is_def_in_subset(fct, si)) continue; + + // create integration kernel + static const int dim = TGridFunction::dim; + + // integrate elements of subset + typedef typename domain_traits::grid_base_object grid_base_object; + + // get iterators for all elems on subset + typedef typename TGridFunction::template dim_traits::const_iterator const_iterator; + const_iterator iter = u.template begin(); + const_iterator iterEnd = u.template end(); + + // create a FV1 Geometry + DimFV1Geometry geo; + + // specify, which subsets are boundary + for(size_t s = 0; s < bndSSGrp.size(); ++s) + { + // get subset index + const int bndSubset = bndSSGrp[s]; + + // request this subset index as boundary subset. This will force the + // creation of boundary subsets when calling geo.update + geo.add_boundary_subset(bndSubset); + } + + // vector of corner coordinates of element corners (to be filled for each elem) + std::vector > vCorner; + + // loop elements of subset + for( ; iter != iterEnd; ++iter) + { + // get element + grid_base_object* elem = *iter; + + // get all corner coordinates + CollectCornerCoordinates(vCorner, *elem, u.domain()->position_accessor(), true); + + // compute bf and grads at bip for element + try{ + geo.update(elem, &vCorner[0], u.domain()->subset_handler().get()); + } + UG_CATCH_THROW("IntegrateNormalComponenOnManifold: " + "Cannot update Finite Volume Geometry."); + + // get fct multi-indices of element + std::vector ind; + u.dof_indices(elem, fct, ind); + + // specify, which subsets are boundary + for(size_t s = 0; s < bndSSGrp.size(); ++s) + { + // get subset index + const int bndSubset = bndSSGrp[s]; + + // get all bf of this subset + typedef typename DimFV1Geometry::BF BF; + const std::vector& vBF = geo.bf(bndSubset); + + // loop boundary faces + for(size_t b = 0; b < vBF.size(); ++b) + { + // get bf + const BF& bf = vBF[b]; + + // get normal on bf + const MathVector& normal = bf.normal(); + + // check multi indices + UG_ASSERT(ind.size() == bf.num_sh(), + "IntegrateNormalComponentOnManifold::values: Wrong number of" + " multi indices, ind: "< val; VecSet(val, 0.0); + for(size_t sh = 0; sh < bf.num_sh(); ++sh) + { + const number fctVal = DoFRef(u, ind[sh]); + const MathVector& ip = bf.global_ip(); + VecScaleAdd(val, 1.0, val, fctVal, ip); + } + + // sum up contributions + value -= VecDot(val, normal); + } + } + } + } + +#ifdef UG_PARALLEL + // sum over processes + if(pcl::NumProcs() > 1) + { + pcl::ProcessCommunicator com; + number local = value; + com.allreduce(&local, &value, 1, PCL_DT_DOUBLE, PCL_RO_SUM); + } +#endif + +// return the result + return value; +} /// Integrates the Flux of a component over some boundary subsets /** diff --git a/ugbase/lib_disc/function_spaces/interpolate_inner.h b/ugbase/lib_disc/function_spaces/interpolate_inner.h index 378693a71..1b25b61e8 100644 --- a/ugbase/lib_disc/function_spaces/interpolate_inner.h +++ b/ugbase/lib_disc/function_spaces/interpolate_inner.h @@ -195,15 +195,33 @@ void InterpolateOnElementsInner (spInterpolFunction, spGridFct, fct, si, time); InterpolateOnElementsInner (spInterpolFunction, spGridFct, fct, si, time); + InterpolateOnElementsInner + (spInterpolFunction, spGridFct, fct, si, time); + InterpolateOnElementsInner + (spInterpolFunction, spGridFct, fct, si, time); + InterpolateOnElementsInner + (spInterpolFunction, spGridFct, fct, si, time); + InterpolateOnElementsInner + (spInterpolFunction, spGridFct, fct, si, time); } case 1: if (spGridFct->max_fct_dofs(fct, EDGE, si)) + { InterpolateOnElementsInner (spInterpolFunction, spGridFct, fct, si, time); + InterpolateOnElementsInner + (spInterpolFunction, spGridFct, fct, si, time); + InterpolateOnElementsInner + (spInterpolFunction, spGridFct, fct, si, time); + } case 0: if (spGridFct->max_fct_dofs(fct, VERTEX, si)) + { InterpolateOnElementsInner (spInterpolFunction, spGridFct, fct, si, time); + InterpolateOnElementsInner + (spInterpolFunction, spGridFct, fct, si, time); + } break; default: UG_THROW("InterpolateOnElements: Dimension " <(vParentElem, vChildSide, vValueChild, vValueParent); + this->template prolongate(vParentElem, vChildSide, vValueChild, vValueParent); } // b) prolongation from a element @@ -544,7 +544,7 @@ class CrouzeixRaviartElemTransfer vParentElem[0] = parent; // call prolongation - prolongate(vParentElem, vChildSide, vValueChild, vValueParent); + this->template prolongate(vParentElem, vChildSide, vValueChild, vValueParent); } }; diff --git a/ugbase/lib_disc/function_spaces/metric_spaces.h b/ugbase/lib_disc/function_spaces/metric_spaces.h index 3bc341dce..d6b3dd4f1 100644 --- a/ugbase/lib_disc/function_spaces/metric_spaces.h +++ b/ugbase/lib_disc/function_spaces/metric_spaces.h @@ -221,6 +221,210 @@ class IComponentSpace : }; +/// Computes simple vector (2-)norm from grid function DoFs which belong to either of the +/// subsets and either of the functions supplied in the constructor. +template +class GridFunctionComponentSpace +: public IComponentSpace +{ + public: + GridFunctionComponentSpace(const char* fctNames) + : IComponentSpace(fctNames) {} + + GridFunctionComponentSpace(const char* fctNames, const char* ssNames) + : IComponentSpace(fctNames, ssNames, 1) {} + + virtual ~GridFunctionComponentSpace() {}; + + virtual double norm2(TGridFunction& uFine) + { + ConstSmartPtr dd = uFine.dof_distribution(); + + // find function indices + FunctionGroup fg(dd->function_pattern()); + try {fg.add(TokenizeTrimString(this->m_fctNames));} + UG_CATCH_THROW("Could not convert function names to function indices."); + + // find subset indices + SubsetGroup sg(dd->subset_handler()); + if (this->m_ssNames) + { + try {sg.add(TokenizeTrimString(this->m_ssNames));} + UG_CATCH_THROW("Could not convert subset names to subset indices."); + } + else + sg.add_all(); + + + // loop subsets + number sum = 0.0; + const size_t sgSz = sg.size(); + for (size_t i = 0; i < sgSz; ++i) + { + int si = sg[i]; + if (dd->max_dofs(VERTEX, si)) add_norm_values(sum, uFine, dd, sg[i], fg); + if (dd->max_dofs(EDGE, si)) add_norm_values(sum, uFine, dd, sg[i], fg); + if (dd->max_dofs(FACE, si)) add_norm_values(sum, uFine, dd, sg[i], fg); + if (dd->max_dofs(VOLUME, si)) add_norm_values(sum, uFine, dd, sg[i], fg); + } + +#ifdef UG_PARALLEL + if (pcl::NumProcs() > 1) + { + pcl::ProcessCommunicator pc; + sum = pc.allreduce(sum, PCL_RO_SUM); + } +#endif + + return sum; + } + + virtual double distance2(TGridFunction& uFine, TGridFunction& uCoarse) + { + ConstSmartPtr dd = uFine.dof_distribution(); + UG_COND_THROW(dd != uCoarse.dof_distribution(), + "GridFunctionComponentSpace::distance2: GF1 DoF distro is not the same as for GF2.\n" + "This case is not implemented."); + + // find function indices + FunctionGroup fg(dd->function_pattern()); + try {fg.add(TokenizeTrimString(this->m_fctNames));} + UG_CATCH_THROW("Could not convert function names to function indices."); + + // find subset indices + SubsetGroup sg(dd->subset_handler()); + if (this->m_ssNames) + { + try {sg.add(TokenizeTrimString(this->m_ssNames));} + UG_CATCH_THROW("Could not convert subset names to subset indices."); + } + else + sg.add_all(); + + + // loop subsets + number sum = 0.0; + const size_t sgSz = sg.size(); + for (size_t i = 0; i < sgSz; ++i) + { + int si = sg[i]; + if (dd->max_dofs(VERTEX, si)) add_distance_values(sum, uFine, uCoarse, dd, sg[i], fg); + if (dd->max_dofs(EDGE, si)) add_distance_values(sum, uFine, uCoarse, dd, sg[i], fg); + if (dd->max_dofs(FACE, si)) add_distance_values(sum, uFine, uCoarse, dd, sg[i], fg); + if (dd->max_dofs(VOLUME, si)) add_distance_values(sum, uFine, uCoarse, dd, sg[i], fg); + } + +#ifdef UG_PARALLEL + if (pcl::NumProcs() > 1) + { + pcl::ProcessCommunicator pc; + sum = pc.allreduce(sum, PCL_RO_SUM); + } +#endif + + return sum; + } + + private: + template + void add_distance_values + ( + number& sum, + const TGridFunction& uFine, + const TGridFunction& uCoarse, + ConstSmartPtr dd, + int si, + const FunctionGroup& fg + ) const + { + const SurfaceView& sv = *dd->surface_view(); + const MultiGrid& mg = *dd->multi_grid(); + + const number nFct = fg.size(); + + // iterate all elements (including SHADOW_RIM_COPY!) + typename DoFDistribution::traits::const_iterator iter, iterEnd; + iter = dd->template begin(si, SurfaceView::ALL); + iterEnd = dd->template end(si, SurfaceView::ALL); + std::vector vInd; + for (; iter != iterEnd; ++iter) + { + TBaseElem* elem = *iter; + if (sv.is_contained(elem, dd->grid_level(), SurfaceView::SHADOW_RIM_COPY)) + { + if (mg.num_children(elem) > 0) + { + TBaseElem* child = mg.get_child(elem, 0); + if (sv.is_contained(child, dd->grid_level(), SurfaceView::SURFACE_RIM)) + continue; + } + } + + for (size_t fi = 0; fi < nFct; ++fi) + { + dd->inner_dof_indices(elem, fg[fi], vInd); + + const size_t nDof = vInd.size(); + for (size_t dof = 0; dof < nDof; ++dof) + { + const number tmp = DoFRef(uFine, vInd[dof]) - DoFRef(uCoarse, vInd[dof]); + sum += tmp*tmp; + } + } + } + // note: no duplicate additions possible + } + + template + void add_norm_values + ( + number& sum, + const TGridFunction& uFine, + ConstSmartPtr dd, + int si, + const FunctionGroup& fg + ) const + { + const SurfaceView& sv = *dd->surface_view(); + const MultiGrid& mg = *dd->multi_grid(); + + const number nFct = fg.size(); + + // iterate all elements (including SHADOW_RIM_COPY!) + typename DoFDistribution::traits::const_iterator iter, iterEnd; + iter = dd->template begin(si, SurfaceView::ALL); + iterEnd = dd->template end(si, SurfaceView::ALL); + std::vector vInd; + for (; iter != iterEnd; ++iter) + { + TBaseElem* elem = *iter; + if (sv.is_contained(elem, dd->grid_level(), SurfaceView::SHADOW_RIM_COPY)) + { + if (mg.num_children(elem) > 0) + { + TBaseElem* child = mg.get_child(elem, 0); + if (sv.is_contained(child, dd->grid_level(), SurfaceView::SURFACE_RIM)) + continue; + } + } + + for (size_t fi = 0; fi < nFct; ++fi) + { + dd->inner_dof_indices(elem, fg[fi], vInd); + + const size_t nDof = vInd.size(); + for (size_t dof = 0; dof < nDof; ++dof) + { + const number tmp = DoFRef(uFine, vInd[dof]); + sum += tmp*tmp; + } + } + } + // note: no duplicate additions possible + } +}; + + //! Wrapper class for time dependence. template @@ -313,6 +517,81 @@ class L2ComponentSpace : }; +/** Evaluates difference between two grid functions in L2 norm */ +template +class L2QuotientSpace : + public IComponentSpace, + public IObjectWithWeights::weight_type > +{ +public: + typedef IComponentSpace base_type; + typedef typename L2DistIntegrand::weight_type weight_type; + typedef IObjectWithWeights weighted_obj_type; + + /// CTOR + L2QuotientSpace(const char *fctNames) + : base_type(fctNames), weighted_obj_type(make_sp(new ConstUserNumber(1.0))) {}; + + L2QuotientSpace(const char *fctNames, int order) + : base_type(fctNames, order), weighted_obj_type(make_sp(new ConstUserNumber(1.0))) {}; + + L2QuotientSpace(const char *fctNames, int order, double weight, const char* ssNames=0) + : base_type(fctNames, ssNames, order), weighted_obj_type(make_sp(new ConstUserNumber(weight))) {}; + + L2QuotientSpace(const char *fctNames, int order, ConstSmartPtr spWeight, const char* ssNames=0) + : base_type(fctNames, ssNames, order), weighted_obj_type(spWeight) {}; + + /// DTOR + ~L2QuotientSpace() {}; + + using IComponentSpace::norm; + using IComponentSpace::distance; + + /// for weighted norms + using weighted_obj_type::set_weight; + using weighted_obj_type::get_weight; + using weighted_obj_type::m_spWeight; + + /// \copydoc IComponentSpace::norm + double norm2(TGridFunction& u) + { + typedef ConstUserNumber MyConstUserData; + typedef SmartPtr > SPUserData; + + SPUserData spConst= make_sp(new MyConstUserData(1.0)); + number Meas = Integral(spConst, u, base_type::m_ssNames, 0.0, 1, "best"); + number uAvg = Integral(u, base_type::m_fctNames.c_str(), base_type::m_ssNames, base_type::m_quadorder); + + std::cerr << "Average:=" << uAvg <<"/" << Meas << " = " << uAvg/Meas << std::endl; + SPUserData spAvg = make_sp(new MyConstUserData(uAvg/Meas)); + double qnorm = L2Error(spAvg, u, base_type::m_fctNames.c_str(), 0.0, base_type::m_quadorder, base_type::m_ssNames); + + return qnorm*qnorm; + } + + /// \copydoc IComponentSpace::distance + double distance2(TGridFunction& uFine, TGridFunction& uCoarse) + { + typedef ConstUserNumber MyConstUserData; + typedef SmartPtr > SPUserData; + + SPUserData spConst= make_sp(new MyConstUserData(1.0)); + number Meas = Integral(spConst, uFine, base_type::m_ssNames, 0.0, 1, "best"); + number avgFine = Integral(uFine, base_type::m_fctNames.c_str(), base_type::m_ssNames, base_type::m_quadorder); + number avgCoarse = Integral(uCoarse, base_type::m_fctNames.c_str(), base_type::m_ssNames, base_type::m_quadorder); + + std::cerr << "Average:=(" << avgFine << "-" << avgCoarse<<")/" << Meas << " = " << (avgFine-avgCoarse)/Meas << std::endl; + return L2Distance2(uFine, base_type::m_fctNames.c_str(), + uCoarse, base_type::m_fctNames.c_str(), + base_type::m_quadorder, base_type::m_ssNames, weighted_obj_type::m_spWeight, + (avgFine-avgCoarse)/Meas); + } + + + +}; + + /** Evaluates distance between two grid functions in H1 semi-norm */ template class H1SemiComponentSpace @@ -519,11 +798,11 @@ class H1ComponentSpace : /// \copydoc IComponentSpace::norm double norm2(TGridFunction& uFine) - { return H1Norm2(uFine, base_type::m_fctNames.c_str(), base_type::m_quadorder); } + { return H1Norm2(uFine, base_type::m_fctNames.c_str(), base_type::m_quadorder, base_type::m_ssNames); } /// \copydoc IComponentSpace::norm double distance2(TGridFunction& uFine, TGridFunction& uCoarse) - { return H1Distance2(uFine, base_type::m_fctNames.c_str(), uCoarse, base_type::m_fctNames.c_str(), base_type::m_quadorder); } + { return H1Distance2(uFine, base_type::m_fctNames.c_str(), uCoarse, base_type::m_fctNames.c_str(), base_type::m_quadorder, base_type::m_ssNames); } }; diff --git a/ugbase/lib_disc/io/vtkoutput.cpp b/ugbase/lib_disc/io/vtkoutput.cpp index ce64ce8a6..fafd4e272 100644 --- a/ugbase/lib_disc/io/vtkoutput.cpp +++ b/ugbase/lib_disc/io/vtkoutput.cpp @@ -31,6 +31,9 @@ */ #include "vtkoutput.h" + +#include "common/util/os_info.h" // for GetPathSeparator + #include namespace ug{ @@ -77,6 +80,9 @@ print(const char* filename, Domain& domain) // header File << VTKFileWriter::normal; File << "\n"; + + write_comment(File); + File << "& domain) try{ write_grid_piece (File, aaVrtIndex, domain.position_accessor(), grid, - sh, si, dim); + sh, si, dim, sh); } UG_CATCH_THROW("VTK::print: Can not write Subset: "< 1) pvtu_filename(name, filename, si, numSubset-1, step); name = FilenameWithoutPath(name); - fprintf(file, " \n", + fprintf(file, " \n", time, si, name.c_str()); } @@ -351,7 +357,7 @@ write_subset_pvd(int numSubset, const std::string& filename, int step, number ti if(numProcs > 1) pvtu_filename(name, filename, si, numSubset-1, step); name = FilenameWithoutPath(name); - fprintf(file, " \n", + fprintf(file, " \n", time, r, name.c_str()); } @@ -590,6 +596,30 @@ set_binary(bool b) { m_bBinary = b; } +template +void VTKOutput:: +set_write_grid(bool b) { + m_bWriteGrid = b; +} + +template +void VTKOutput:: +set_write_subset_indices(bool b) { + m_bWriteSubsetIndices = b; +} + +template +void VTKOutput:: +set_write_proc_ranks(bool b) { + m_bWriteProcRanks = b; +} + +template +void VTKOutput:: +set_user_defined_comment(const char* comment){ + m_sComment = comment; +} + template bool VTKOutput:: vtk_name_used(const char* name) const diff --git a/ugbase/lib_disc/io/vtkoutput.h b/ugbase/lib_disc/io/vtkoutput.h index 3bb387e19..69dbbe05a 100644 --- a/ugbase/lib_disc/io/vtkoutput.h +++ b/ugbase/lib_disc/io/vtkoutput.h @@ -33,7 +33,10 @@ #ifndef __H__UG__LIB_DISC__IO__VTKOUTPUT__ #define __H__UG__LIB_DISC__IO__VTKOUTPUT__ +//TODO: deduplicate code in VTUOutput - reduces vulnerability to errors and linker time + // extern libraries +#include #include #include @@ -499,7 +502,7 @@ class VTKOutput Grid::VertexAttachmentAccessor >& aaVrtIndex, const Grid::VertexAttachmentAccessor > >& aaPos, Grid& grid, const T& iterContainer, int si, int dim, - int numVert, int numElem, int numConn); + int numVert, int numElem, int numConn, MGSubsetHandler& sh); template void @@ -514,12 +517,16 @@ class VTKOutput write_grid_piece(VTKFileWriter& File, Grid::VertexAttachmentAccessor >& aaVrtIndex, const Grid::VertexAttachmentAccessor > >& aaPos, - Grid& grid, const T& iterContainer, int si, int dim); + Grid& grid, const T& iterContainer, int si, int dim, MGSubsetHandler& sh); public: // maybe somebody wants to do this from outside static void write_empty_grid_piece(VTKFileWriter& File, bool binary = true); + + void + set_user_defined_comment(const char* comment); + protected: /** @@ -533,6 +540,13 @@ class VTKOutput * \param[in] dim dimension of subset * \param[in] numVert number of vertices */ + + void + write_comment(VTKFileWriter& File); + + void + write_comment_printf(FILE* File); + template void write_points(VTKFileWriter& File, @@ -593,7 +607,7 @@ class VTKOutput write_cells(VTKFileWriter& File, Grid::VertexAttachmentAccessor >& aaVrtIndex, Grid& grid, const T& iterContainer, int si, - int dim, int numElem, int numConn); + int dim, int numElem, int numConn, MGSubsetHandler& sh); /** * This function writes the elements that are part of the specified subsets. @@ -685,6 +699,60 @@ class VTKOutput write_cell_types(VTKFileWriter& File, const T& iterContainer, SubsetGroup& ssGrp, int dim, int numElem); + /** + * This method writes the 'region' for each element of a subset. The region is + * the ug4 subset index for a given element. + * + * \param[in] File file stream + * \param[in] u grid function + * \param[in] si subset index + * \param[in] sh multigrid subset handler + */ + template + void + write_cell_subsets(VTKFileWriter& File, const T& iterContainer, int si, MGSubsetHandler& sh); + + template + void + write_cell_subsets(VTKFileWriter& File, const T& iterContainer, int si, int dim, + int numElem, MGSubsetHandler& sh); + + template + void + write_cell_subsets(VTKFileWriter& File, const T& iterContainer, SubsetGroup& ssGrp, int dim, + int numElem, MGSubsetHandler& sh); + + /** + * This method writes the subset names. + * + * \param[in] File file stream + * \param[in] sh multigrid subset handler + */ + void + write_cell_subset_names(VTKFileWriter& File, MGSubsetHandler& sh); + + /** + * This method writes the proc ranks for each cell. + * + * \param[in] File file stream + * \param[in] u grid function + * \param[in] si subset index + * \param[in] sh multigrid subset handler + */ + template + void + write_cell_proc_ranks(VTKFileWriter& File, const T& iterContainer, int si, MGSubsetHandler& sh); + + template + void + write_cell_proc_ranks(VTKFileWriter& File, const T& iterContainer, int si, int dim, + int numElem, MGSubsetHandler& sh); + + template + void + write_cell_proc_ranks(VTKFileWriter& File, const T& iterContainer, SubsetGroup& ssGrp, int dim, + int numElem, MGSubsetHandler& sh); + protected: /** * This function writes a piece of the grid to the vtk file. First the @@ -922,11 +990,17 @@ class VTKOutput public: /// default constructor - VTKOutput() : m_bSelectAll(true), m_bBinary(true) {} + VTKOutput() : m_bSelectAll(true), m_bBinary(true), m_bWriteGrid(true), m_bWriteSubsetIndices(false), m_bWriteProcRanks(false) {} //TODO: maybe true? /// should values be printed in binary (base64 encoded way ) or plain ascii void set_binary(bool b); + void set_write_grid(bool b); + + void set_write_subset_indices(bool b); + + void set_write_proc_ranks(bool b); + protected: /// returns true if name for vtk-component is already used bool vtk_name_used(const char* name) const; @@ -977,6 +1051,12 @@ class VTKOutput /// map storing the time points std::map > m_mTimestep; + + bool m_bWriteGrid; + std::string m_sComment; + + bool m_bWriteSubsetIndices; + bool m_bWriteProcRanks; }; } // namespace ug diff --git a/ugbase/lib_disc/io/vtkoutput_impl.h b/ugbase/lib_disc/io/vtkoutput_impl.h index 922dad32c..9a42368ca 100644 --- a/ugbase/lib_disc/io/vtkoutput_impl.h +++ b/ugbase/lib_disc/io/vtkoutput_impl.h @@ -236,6 +236,9 @@ print_subset(const char* filename, TFunction& u, int si, int step, number time, // header File << VTKFileWriter::normal; File << "\n"; + + write_comment(File); + File << "\n"; + + write_comment(File); + File << " template void VTKOutput:: @@ -464,7 +471,7 @@ write_points_cells_piece(VTKFileWriter& File, Grid::VertexAttachmentAccessor >& aaVrtIndex, const Grid::VertexAttachmentAccessor > >& aaPos, Grid& grid, const T& iterContainer, int si, int dim, - int numVert, int numElem, int numConn) + int numVert, int numElem, int numConn, MGSubsetHandler& sh) { // write vertices of this piece try{ @@ -474,7 +481,7 @@ write_points_cells_piece(VTKFileWriter& File, // write elements of this piece try{ - write_cells(File, aaVrtIndex, grid, iterContainer, si, dim, numElem, numConn); + write_cells(File, aaVrtIndex, grid, iterContainer, si, dim, numElem, numConn, sh); } UG_CATCH_THROW("VTK::write_piece: Can not write Elements."); } @@ -507,7 +514,7 @@ void VTKOutput:: write_grid_piece(VTKFileWriter& File, Grid::VertexAttachmentAccessor >& aaVrtIndex, const Grid::VertexAttachmentAccessor > >& aaPos, - Grid& grid, const T& iterContainer, int si, int dim) + Grid& grid, const T& iterContainer, int si, int dim, MGSubsetHandler& sh) { // counters int numVert = 0, numElem = 0, numConn = 0; @@ -526,7 +533,7 @@ write_grid_piece(VTKFileWriter& File, // write grid write_points_cells_piece - (File, aaVrtIndex, aaPos, grid, iterContainer, si, dim, numVert, numElem, numConn); + (File, aaVrtIndex, aaPos, grid, iterContainer, si, dim, numVert, numElem, numConn, sh); // write closing tag File << VTKFileWriter::normal; @@ -556,9 +563,11 @@ write_grid_solution_piece(VTKFileWriter& File, File << " \n"; + MGSubsetHandler& sh = *u.domain()->subset_handler(); + // write grid write_points_cells_piece - (File, aaVrtIndex, u.domain()->position_accessor(), grid, u, si, dim, numVert, numElem, numConn); + (File, aaVrtIndex, u.domain()->position_accessor(), grid, u, si, dim, numVert, numElem, numConn, sh); // add all components if 'selectAll' chosen if(m_bSelectAll){ @@ -708,9 +717,12 @@ count_piece_sizes(Grid& grid, const T& iterContainer, int si, int dim, switch(dim) { case 0: count_sizes(grid, iterContainer, si, numVert, numElem, numConn); break; - case 1: count_sizes(grid, iterContainer, si, numVert, numElem, numConn); break; + case 1: count_sizes(grid, iterContainer, si, numVert, numElem, numConn); + count_sizes(grid, iterContainer, si, numVert, numElem, numConn); break; case 2: count_sizes(grid, iterContainer, si, numVert, numElem, numConn); - count_sizes(grid, iterContainer, si, numVert, numElem, numConn); break; + count_sizes(grid, iterContainer, si, numVert, numElem, numConn); + count_sizes(grid, iterContainer, si, numVert, numElem, numConn); + count_sizes(grid, iterContainer, si, numVert, numElem, numConn); break; case 3: count_sizes(grid, iterContainer, si, numVert, numElem, numConn); count_sizes(grid, iterContainer, si, numVert, numElem, numConn); count_sizes(grid, iterContainer, si, numVert, numElem, numConn); @@ -776,6 +788,44 @@ write_points_elementwise(VTKFileWriter& File, } } +template +void VTKOutput:: +write_comment(VTKFileWriter& File) +{ + if (!m_sComment.size()){ + return; + } + + File << VTKFileWriter::normal; + File << "\n"; +} + +template +void VTKOutput:: +write_comment_printf(FILE* File) +{ + if (!m_sComment.size()){ + return; + } + + fprintf(File, "\n"); +} + +template +void VTKOutput:: +write_cell_subset_names(VTKFileWriter& File, MGSubsetHandler &sh) +{ + File << VTKFileWriter::normal; + File << " \n"; + for(int i = 0; i < sh.num_subsets(); ++i){ + File << " \n"; + } + File << " \n"; +} template template @@ -786,6 +836,10 @@ write_points(VTKFileWriter& File, Grid& grid, const T& iterContainer, int si, int dim, int numVert) { + if(!m_bWriteGrid){ + return; + } + // write starting xml tag for points File << VTKFileWriter::normal; File << " \n"; @@ -805,9 +859,12 @@ write_points(VTKFileWriter& File, if(numVert > 0){ switch(dim){ case 0: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); break; - case 1: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); break; + case 1: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); + write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); break; case 2: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); - write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); break; + write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); + write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); + write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); break; case 3: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, si, n); @@ -836,6 +893,10 @@ write_points(VTKFileWriter& File, Grid& grid, const T& iterContainer, SubsetGroup& ssGrp, int dim, int numVert) { + if(!m_bWriteGrid){ + return; + } + // write starting xml tag for points File << VTKFileWriter::normal; File << " \n"; @@ -856,9 +917,12 @@ write_points(VTKFileWriter& File, for(size_t i = 0; i < ssGrp.size(); i++){ switch(dim){ case 0: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); break; - case 1: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); break; + case 1: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); + write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); break; case 2: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); - write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); break; + write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); + write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); + write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); break; case 3: write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); write_points_elementwise(File, aaVrtIndex, aaPos, grid, iterContainer, ssGrp[i], n); @@ -889,8 +953,12 @@ void VTKOutput:: write_cells(VTKFileWriter& File, Grid::VertexAttachmentAccessor >& aaVrtIndex, Grid& grid, const T& iterContainer, int si, int dim, - int numElem, int numConn) + int numElem, int numConn, MGSubsetHandler& sh) { + if(!m_bWriteGrid){ + return; + } + File << VTKFileWriter::normal; // write opening tag to indicate that elements will be written @@ -908,6 +976,24 @@ write_cells(VTKFileWriter& File, // write closing tag File << VTKFileWriter::normal; File << " \n"; + + //TODO: move to place dealing with CellData + if(m_bWriteSubsetIndices || m_bWriteProcRanks){ + File << " \n"; + } + if(m_bWriteSubsetIndices){ + write_cell_subsets(File, iterContainer, si, dim, numElem, sh); + } + if(m_bWriteProcRanks){ + write_cell_proc_ranks(File, iterContainer, si, dim, numElem, sh); + } + if(m_bWriteSubsetIndices || m_bWriteProcRanks){ + File << VTKFileWriter::normal; + File << " \n"; + } + if(m_bWriteSubsetIndices){ + write_cell_subset_names(File, sh); + } } template @@ -1051,9 +1137,12 @@ write_cell_connectivity(VTKFileWriter& File, switch(dim) { case 0: break; // no elements -> nothing to do - case 1: write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); break; + case 1: write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); + write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); break; case 2: write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); - write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); break; + write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); + write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); + write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); break; case 3: write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, si); @@ -1091,9 +1180,12 @@ write_cell_connectivity(VTKFileWriter& File, switch(dim) { case 0: break; // no elements -> nothing to do - case 1: write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); break; + case 1: write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); + write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); break; case 2: write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); - write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); break; + write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); + write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); + write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); break; case 3: write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); write_cell_connectivity(File, aaVrtIndex, grid, iterContainer, ssGrp[i]); @@ -1189,9 +1281,12 @@ write_cell_offsets(VTKFileWriter& File, const T& iterContainer, int si, int dim, switch(dim) { case 0: break; // no elements -> nothing to do - case 1: write_cell_offsets(File, iterContainer, si, n); break; + case 1: write_cell_offsets(File, iterContainer, si, n); + write_cell_offsets(File, iterContainer, si, n); break; case 2: write_cell_offsets(File, iterContainer, si, n); - write_cell_offsets(File, iterContainer, si, n); break; + write_cell_offsets(File, iterContainer, si, n); + write_cell_offsets(File, iterContainer, si, n); + write_cell_offsets(File, iterContainer, si, n); break; case 3: write_cell_offsets(File, iterContainer, si, n); write_cell_offsets(File, iterContainer, si, n); write_cell_offsets(File, iterContainer, si, n); @@ -1228,9 +1323,12 @@ write_cell_offsets(VTKFileWriter& File, const T& iterContainer, SubsetGroup& ssG switch(dim) { case 0: break; // no elements -> nothing to do - case 1: write_cell_offsets(File, iterContainer, ssGrp[i], n); break; + case 1: write_cell_offsets(File, iterContainer, ssGrp[i], n); + write_cell_offsets(File, iterContainer, ssGrp[i], n); break; case 2: write_cell_offsets(File, iterContainer, ssGrp[i], n); - write_cell_offsets(File, iterContainer, ssGrp[i], n); break; + write_cell_offsets(File, iterContainer, ssGrp[i], n); + write_cell_offsets(File, iterContainer, ssGrp[i], n); + write_cell_offsets(File, iterContainer, ssGrp[i], n); break; case 3: write_cell_offsets(File, iterContainer, ssGrp[i], n); write_cell_offsets(File, iterContainer, ssGrp[i], n); write_cell_offsets(File, iterContainer, ssGrp[i], n); @@ -1335,14 +1433,17 @@ write_cell_types(VTKFileWriter& File, const T& iterContainer, int si, int dim, switch(dim) { case 0: break; // no elements -> nothing to do - case 1: write_cell_types(File, iterContainer, si); break; + case 1: write_cell_types(File, iterContainer, si); + write_cell_types(File, iterContainer, si); break; case 2: write_cell_types(File, iterContainer, si); - write_cell_types(File, iterContainer, si);break; + write_cell_types(File, iterContainer, si); + write_cell_types(File, iterContainer, si); + write_cell_types(File, iterContainer, si); break; case 3: write_cell_types(File, iterContainer, si); write_cell_types(File, iterContainer, si); write_cell_types(File, iterContainer, si); write_cell_types(File, iterContainer, si); - write_cell_types(File, iterContainer, si);break; + write_cell_types(File, iterContainer, si); break; default: UG_THROW("VTK::write_cell_types: Dimension " << dim << " is not supported."); } @@ -1373,9 +1474,12 @@ write_cell_types(VTKFileWriter& File, const T& iterContainer, SubsetGroup& ssGrp switch(dim) { case 0: break; // no elements -> nothing to do - case 1: write_cell_types(File, iterContainer, ssGrp[i]); break; + case 1: write_cell_types(File, iterContainer, ssGrp[i]); + write_cell_types(File, iterContainer, ssGrp[i]); break; case 2: write_cell_types(File, iterContainer, ssGrp[i]); - write_cell_types(File, iterContainer, ssGrp[i]); break; + write_cell_types(File, iterContainer, ssGrp[i]); + write_cell_types(File, iterContainer, ssGrp[i]); + write_cell_types(File, iterContainer, ssGrp[i]); break; case 3: write_cell_types(File, iterContainer, ssGrp[i]); write_cell_types(File, iterContainer, ssGrp[i]); write_cell_types(File, iterContainer, ssGrp[i]); @@ -1391,6 +1495,246 @@ write_cell_types(VTKFileWriter& File, const T& iterContainer, SubsetGroup& ssGrp File << "\n \n"; } +//////////////////////////////////////////////////////////////////////////////// +// Subset Indices +//////////////////////////////////////////////////////////////////////////////// + + +template +template +void VTKOutput:: +write_cell_subsets(VTKFileWriter& File, const T& iterContainer, int si, MGSubsetHandler& sh) +{ +// subset + int subset; + +// get iterators + typedef typename IteratorProvider::template traits::const_iterator const_iterator; + const_iterator iterBegin = IteratorProvider::template begin(iterContainer, si); + const_iterator iterEnd = IteratorProvider::template end(iterContainer, si); + + if(m_bBinary) + File << VTKFileWriter::base64_binary; + else + File << VTKFileWriter::normal; +// loop all elements, write type for each element to stream + for( ; iterBegin != iterEnd; ++iterBegin) + { + subset = (char)sh.get_subset_index(*iterBegin); + //iterContainer.get_subset_name(2); + + if(m_bBinary){ + File << (char) subset << ' '; + } + else{ + File << subset << ' '; + } + } +} + + +template +template +void VTKOutput:: +write_cell_subsets(VTKFileWriter& File, const T& iterContainer, int si, int dim, + int numElem, MGSubsetHandler& sh) +{ + File << VTKFileWriter::normal; +// write opening tag to indicate that types will be written + File << " \n"; + if(m_bBinary) + File << VTKFileWriter::base64_binary << numElem; + +// switch dimension + if(numElem > 0) + { + switch(dim) + { + case 0: break; // no elements -> nothing to do + case 1: write_cell_subsets(File, iterContainer, si, sh); + write_cell_subsets(File, iterContainer, si, sh); break; + case 2: write_cell_subsets(File, iterContainer, si, sh); + write_cell_subsets(File, iterContainer, si, sh); + write_cell_subsets(File, iterContainer, si, sh); + write_cell_subsets(File, iterContainer, si, sh); break; + case 3: write_cell_subsets(File, iterContainer, si, sh); + write_cell_subsets(File, iterContainer, si, sh); + write_cell_subsets(File, iterContainer, si, sh); + write_cell_subsets(File, iterContainer, si, sh); + write_cell_subsets(File, iterContainer, si, sh); break; + default: UG_THROW("VTK::write_cell_subsets: Dimension " << dim << + " is not supported."); + } + } + +// write closing tag + File << VTKFileWriter::normal; + File << "\n \n"; +} + +template +template +void VTKOutput:: +write_cell_subsets(VTKFileWriter& File, const T& iterContainer, SubsetGroup& ssGrp, int dim, + int numElem, MGSubsetHandler& sh) +{ + File << VTKFileWriter::normal; +// write opening tag to indicate that types will be written + File << " \n"; + if(m_bBinary) + File << VTKFileWriter::base64_binary << numElem; + +// switch dimension + if(numElem > 0) + for(size_t i = 0; i < ssGrp.size(); i++) + { + switch(dim) + { + case 0: break; // no elements -> nothing to do + case 1: write_cell_subsets(File, iterContainer, ssGrp[i], sh); + write_cell_subsets(File, iterContainer, ssGrp[i], sh); break; + case 2: write_cell_subsets(File, iterContainer, ssGrp[i], sh); + write_cell_subsets(File, iterContainer, ssGrp[i], sh); + write_cell_subsets(File, iterContainer, ssGrp[i], sh); + write_cell_subsets(File, iterContainer, ssGrp[i], sh); break; + case 3: write_cell_subsets(File, iterContainer, ssGrp[i], sh); + write_cell_subsets(File, iterContainer, ssGrp[i], sh); + write_cell_subsets(File, iterContainer, ssGrp[i], sh); + write_cell_subsets(File, iterContainer, ssGrp[i], sh); + write_cell_subsets(File, iterContainer, ssGrp[i], sh); break; + default: UG_THROW("VTK::write_cell_subsets: Dimension " << dim << + " is not supported."); + } + } + +// write closing tag + File << VTKFileWriter::normal; + File << "\n \n"; +} + +//////////////////////////////////////////////////////////////////////////////// +// Subset Indices +//////////////////////////////////////////////////////////////////////////////// + + +template +template +void VTKOutput:: +write_cell_proc_ranks(VTKFileWriter& File, const T& iterContainer, int si, MGSubsetHandler& sh) +{ +// subset + int rank = 0; + +#ifdef UG_PARALLEL + rank = pcl::ProcRank(); +#endif + +// get iterators + typedef typename IteratorProvider::template traits::const_iterator const_iterator; + const_iterator iterBegin = IteratorProvider::template begin(iterContainer, si); + const_iterator iterEnd = IteratorProvider::template end(iterContainer, si); + + if(m_bBinary) + File << VTKFileWriter::base64_binary; + else + File << VTKFileWriter::normal; +// loop all elements, write type for each element to stream + for( ; iterBegin != iterEnd; ++iterBegin) + { + + if(m_bBinary){ + File << (char) rank << ' '; + } + else{ + File << rank << ' '; + } + } +} + + +template +template +void VTKOutput:: +write_cell_proc_ranks(VTKFileWriter& File, const T& iterContainer, int si, int dim, + int numElem, MGSubsetHandler& sh) +{ + File << VTKFileWriter::normal; +// write opening tag to indicate that types will be written + File << " \n"; + if(m_bBinary) + File << VTKFileWriter::base64_binary << numElem; + +// switch dimension + if(numElem > 0) + { + switch(dim) + { + case 0: break; // no elements -> nothing to do + case 1: write_cell_proc_ranks(File, iterContainer, si, sh); + write_cell_proc_ranks(File, iterContainer, si, sh); break; + case 2: write_cell_proc_ranks(File, iterContainer, si, sh); + write_cell_proc_ranks(File, iterContainer, si, sh); + write_cell_proc_ranks(File, iterContainer, si, sh); + write_cell_proc_ranks(File, iterContainer, si, sh); break; + case 3: write_cell_proc_ranks(File, iterContainer, si, sh); + write_cell_proc_ranks(File, iterContainer, si, sh); + write_cell_proc_ranks(File, iterContainer, si, sh); + write_cell_proc_ranks(File, iterContainer, si, sh); + write_cell_proc_ranks(File, iterContainer, si, sh); break; + default: UG_THROW("VTK::write_cell_proc_ranks: Dimension " << dim << + " is not supported."); + } + } + +// write closing tag + File << VTKFileWriter::normal; + File << "\n \n"; +} + +template +template +void VTKOutput:: +write_cell_proc_ranks(VTKFileWriter& File, const T& iterContainer, SubsetGroup& ssGrp, int dim, + int numElem, MGSubsetHandler& sh) +{ + File << VTKFileWriter::normal; +// write opening tag to indicate that types will be written + File << " \n"; + if(m_bBinary) + File << VTKFileWriter::base64_binary << numElem; + +// switch dimension + if(numElem > 0) + for(size_t i = 0; i < ssGrp.size(); i++) + { + switch(dim) + { + case 0: break; // no elements -> nothing to do + case 1: write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); + write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); break; + case 2: write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); + write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); + write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); + write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); break; + case 3: write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); + write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); + write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); + write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); + write_cell_proc_ranks(File, iterContainer, ssGrp[i], sh); break; + default: UG_THROW("VTK::write_cell_proc_ranks: Dimension " << dim << + " is not supported."); + } + } + +// write closing tag + File << VTKFileWriter::normal; + File << "\n \n"; +} + //////////////////////////////////////////////////////////////////////////////// // Nodal Value //////////////////////////////////////////////////////////////////////////////// @@ -1521,14 +1865,17 @@ write_nodal_data(VTKFileWriter& File, TFunction& u, number time, // switch dimension switch(dim) { - case 1: write_nodal_data_elementwise(File, u, time, spData, grid, si);break; + case 1: write_nodal_data_elementwise(File, u, time, spData, grid, si); + write_nodal_data_elementwise(File, u, time, spData, grid, si); break; case 2: write_nodal_data_elementwise(File, u, time, spData, grid, si); - write_nodal_data_elementwise(File, u, time, spData, grid, si);break; + write_nodal_data_elementwise(File, u, time, spData, grid, si); + write_nodal_data_elementwise(File, u, time, spData, grid, si); + write_nodal_data_elementwise(File, u, time, spData, grid, si); break; case 3: write_nodal_data_elementwise(File, u, time, spData, grid, si); write_nodal_data_elementwise(File, u, time, spData, grid, si); write_nodal_data_elementwise(File, u, time, spData, grid, si); write_nodal_data_elementwise(File, u, time, spData, grid, si); - write_nodal_data_elementwise(File, u, time, spData, grid, si);break; + write_nodal_data_elementwise(File, u, time, spData, grid, si); break; default: UG_THROW("VTK::write_nodal_data: Dimension " << dim << " is not supported."); } @@ -1574,14 +1921,17 @@ write_nodal_data(VTKFileWriter& File, TFunction& u, number time, for(size_t i = 0; i < ssGrp.size(); i++) switch(dim) { - case 1: write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]);break; + case 1: write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); + write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); break; case 2: write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); - write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]);break; + write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); + write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); + write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); break; case 3: write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); - write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]);break; + write_nodal_data_elementwise(File, u, time, spData, grid, ssGrp[i]); break; default: UG_THROW("VTK::write_nodal_data: Dimension " << dim << " is not supported."); } @@ -1691,14 +2041,17 @@ write_nodal_values(VTKFileWriter& File, TFunction& u, switch(dim) { case 0: write_nodal_values_elementwise(File, u, vFct, grid, si); break; - case 1: write_nodal_values_elementwise(File, u, vFct, grid, si);break; + case 1: write_nodal_values_elementwise(File, u, vFct, grid, si); + write_nodal_values_elementwise(File, u, vFct, grid, si); break; case 2: write_nodal_values_elementwise(File, u, vFct, grid, si); - write_nodal_values_elementwise(File, u, vFct, grid, si);break; + write_nodal_values_elementwise(File, u, vFct, grid, si); + write_nodal_values_elementwise(File, u, vFct, grid, si); + write_nodal_values_elementwise(File, u, vFct, grid, si); break; case 3: write_nodal_values_elementwise(File, u, vFct, grid, si); write_nodal_values_elementwise(File, u, vFct, grid, si); write_nodal_values_elementwise(File, u, vFct, grid, si); write_nodal_values_elementwise(File, u, vFct, grid, si); - write_nodal_values_elementwise(File, u, vFct, grid, si);break; + write_nodal_values_elementwise(File, u, vFct, grid, si); break; default: UG_THROW("VTK::write_nodal_values: Dimension " << dim << " is not supported."); } @@ -1735,15 +2088,18 @@ write_nodal_values(VTKFileWriter& File, TFunction& u, for(size_t i = 0; i < ssGrp.size(); i++) switch(dim) { - case 0: write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]);break; - case 1: write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]);break; + case 0: write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); break; + case 1: write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); + write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); break; case 2: write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); - write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]);break; + write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); + write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); + write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); break; case 3: write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); - write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]);break; + write_nodal_values_elementwise(File, u, vFct, grid, ssGrp[i]); break; default: UG_THROW("VTK::write_nodal_values: Dimension " << dim << " is not supported."); } @@ -2080,14 +2436,17 @@ write_cell_data(VTKFileWriter& File, TFunction& u, number time, // switch dimension switch(dim) { - case 1: write_cell_data_elementwise(File, u, time, spData, grid, si);break; + case 1: write_cell_data_elementwise(File, u, time, spData, grid, si); + write_cell_data_elementwise(File, u, time, spData, grid, si); break; case 2: write_cell_data_elementwise(File, u, time, spData, grid, si); - write_cell_data_elementwise(File, u, time, spData, grid, si);break; + write_cell_data_elementwise(File, u, time, spData, grid, si); + write_cell_data_elementwise(File, u, time, spData, grid, si); + write_cell_data_elementwise(File, u, time, spData, grid, si); break; case 3: write_cell_data_elementwise(File, u, time, spData, grid, si); write_cell_data_elementwise(File, u, time, spData, grid, si); write_cell_data_elementwise(File, u, time, spData, grid, si); write_cell_data_elementwise(File, u, time, spData, grid, si); - write_cell_data_elementwise(File, u, time, spData, grid, si);break; + write_cell_data_elementwise(File, u, time, spData, grid, si); break; default: UG_THROW("VTK::write_cell_data: Dimension " << dim << " is not supported."); } @@ -2122,14 +2481,17 @@ write_cell_data(VTKFileWriter& File, TFunction& u, number time, for(size_t i = 0; i < ssGrp.size(); i++) switch(dim) { - case 1: write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]);break; + case 1: write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); + write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); break; case 2: write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); - write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]);break; + write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); + write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); + write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); break; case 3: write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); - write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]);break; + write_cell_data_elementwise(File, u, time, spData, grid, ssGrp[i]); break; default: UG_THROW("VTK::write_cell_data: Dimension " << dim << " is not supported."); } @@ -2257,14 +2619,17 @@ write_cell_values(VTKFileWriter& File, TFunction& u, // switch dimension switch(dim) { - case 1: write_cell_values_elementwise(File, u, vFct, grid, si);break; + case 1: write_cell_values_elementwise(File, u, vFct, grid, si); + write_cell_values_elementwise(File, u, vFct, grid, si); break; case 2: write_cell_values_elementwise(File, u, vFct, grid, si); - write_cell_values_elementwise(File, u, vFct, grid, si);break; + write_cell_values_elementwise(File, u, vFct, grid, si); + write_cell_values_elementwise(File, u, vFct, grid, si); + write_cell_values_elementwise(File, u, vFct, grid, si); break; case 3: write_cell_values_elementwise(File, u, vFct, grid, si); write_cell_values_elementwise(File, u, vFct, grid, si); write_cell_values_elementwise(File, u, vFct, grid, si); write_cell_values_elementwise(File, u, vFct, grid, si); - write_cell_values_elementwise(File, u, vFct, grid, si);break; + write_cell_values_elementwise(File, u, vFct, grid, si); break; default: UG_THROW("VTK::write_cell_values: Dimension " << dim << " is not supported."); } @@ -2295,14 +2660,17 @@ write_cell_values(VTKFileWriter& File, TFunction& u, for(size_t i = 0; i < ssGrp.size(); i++) switch(dim) { - case 1: write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]);break; + case 1: write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); + write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); break; case 2: write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); - write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]);break; + write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); + write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); + write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); break; case 3: write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); - write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]);break; + write_cell_values_elementwise(File, u, vFct, grid, ssGrp[i]); break; default: UG_THROW("VTK::write_cell_values: Dimension " << dim << " is not supported."); } @@ -2551,8 +2919,12 @@ write_pvtu(TFunction& u, const std::string& filename, // Write to file fprintf(file, "\n"); + + // Write comment + write_comment_printf(file); + fprintf(file, "\n"); - fprintf(file, "

k&B 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 z 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