51 typedef typename gf_type::template traits<Vertex>::const_iterator vrt_iter_t;
54 num_aa_type aa_vrt_num (* m_spLSF->domain()->grid (), m_a_vrt_num);
56 for (
size_t i = 0; i < m_SsGrp.size (); i++)
59 for (vrt_iter_t iter = m_spLSF->template begin<Vertex> (si);
60 iter != m_spLSF->template end<Vertex> (si); ++iter)
61 aa_vrt_num [*iter] = vrt_num++;
67 m_vrt_val.resize (vrt_num);
68 const pos_acc_type aa_pos = m_spLSF->domain()->position_accessor ();
69 for (
size_t i = 0; i < m_SsGrp.size (); i++)
72 for (vrt_iter_t iter = m_spLSF->template begin<Vertex> (si);
73 iter != m_spLSF->template end<Vertex> (si); ++iter)
78 for (
size_t k = 0; k < dim - 1; k++) the_pos[k] = pos[k];
79 the_pos[dim-1] = m_z_coord;
80 if (! m_glob_userdata.evaluate (m_vrt_val [aa_vrt_num [vrt]], the_pos))
81 m_vrt_val [aa_vrt_num [vrt]] = m_default_value;
91 std::vector<MathVector<dim> > proc_pos (vrt_num);
92 pos_acc_type aa_pos = m_spLSF->domain()->position_accessor ();
93 for (
size_t i = 0; i < m_SsGrp.size (); i++)
96 for (vrt_iter_t iter = m_spLSF->template begin<Vertex> (si);
97 iter != m_spLSF->template end<Vertex> (si); ++iter)
102 for (
size_t k = 0; k < dim - 1; k++) the_pos[k] = pos[k];
103 the_pos[dim-1] = m_z_coord;
106 std::vector<MathVector<dim> > all_pos;
107 std::vector<int> offset;
108 proc_comm.
allgatherv (all_pos, proc_pos, NULL, &offset);
111 std::vector<number> tmp_vrt_val (all_pos.size ());
112 for (
size_t j = 0; j < tmp_vrt_val.size (); j++)
113 if (! m_glob_userdata.evaluate (tmp_vrt_val [j], all_pos[j]))
114 tmp_vrt_val [j] = - std::numeric_limits<number>::max ();
117 std::vector<number> all_vrt_val (tmp_vrt_val.size ());
121 m_vrt_val.resize (vrt_num);
123 for (
size_t j = 0; j < vrt_num; j++)
125 number val = all_vrt_val [my_offset + j];
126 if (val == - std::numeric_limits<number>::max ())
127 m_vrt_val [j] = m_default_value;
129 m_vrt_val [j] = all_vrt_val [my_offset + j];
154 std::vector<std::vector<number> > vvvDeriv[],
158 typedef typename gf_type::template dim_traits<refDim>::grid_base_object elem_type;
161 if (! m_SsGrp.contains (si))
162 UG_THROW (
"ValSurfProjData: Attempt to get the value for a subset that has not been specified.");
167 const elem_type * elem =
dynamic_cast<elem_type *
> (grid_obj);
172 num_aa_type aa_vrt_num (* m_spLSF->domain()->grid (), m_a_vrt_num);
174 std::vector<number> shape;
176 for (
size_t ip = 0; ip < nip; ip++)
179 rTrialSpace.
shapes (shape, vLocIP [ip]);
180 UG_ASSERT (shape.size () == elem->num_vertices (),
"ValSurfProjData: Hanging nodes are not supported!");
184 for(
size_t sh = 0; sh < shape.size (); sh++)
186 const Vertex * vrt = elem->vertex (sh);
187 size_t vrt_no = aa_vrt_num [vrt];
188 if (vrt_no == (
size_t) -1)
189 UG_THROW (
"ValSurfProjData: The object is not properly initialized.");
190 vValue [ip] += m_vrt_val [vrt_no] * shape [sh];
196 for (
size_t ip = 0; ip < nip; ip++)
198 rTrialSpace.
shapes(shape, vLocIP [ip]);
199 for (
size_t sh = 0; sh < shape.size(); sh++) vvvDeriv [ip] [0] [sh] = shape [sh];
void allgatherv(const void *sendBuf, int sendCount, DataType sendType, void *recBuf, int *recCounts, int *displs, DataType recType) const
void eval_and_deriv(number vValue[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocIP[], const size_t nip, LocalVector *u, bool bDeriv, int s, std::vector< std::vector< number > > vvvDeriv[], const MathMatrix< refDim, dim > *vJT=NULL)
Performs the main computations:
Definition val_surf_proj_impl.h:142
ValSurfProjData(SmartPtr< gf_type > spLSF, const char *cmp, number z_coord, const char *subsets)
Constructor.
Definition val_surf_proj_impl.h:32