Flow123d  master-27b3058
generic_field.impl.hh
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file generic_field.impl.hh
15  * @brief
16  */
17 
18 #ifndef GENERIC_FIELD_IMPL_HH_
19 #define GENERIC_FIELD_IMPL_HH_
20 
21 #include <memory>
22 #include "mesh/mesh.h"
23 #include "mesh/partitioning.hh"
24 #include "mesh/accessors.hh"
25 
26 #include "fields/generic_field.hh"
27 #include "fields/field_fe.hh"
28 #include "la/vector_mpi.hh"
29 #include "fields/field_constant.hh"
30 
31 #include "fem/mapping_p1.hh"
32 #include "fem/fe_p.hh"
33 #include "fem/dofhandler.hh"
34 #include "fem/discrete_space.hh"
35 
36 
37 template <int spacedim>
39  IndexField region_id;
40  region_id.name("region_id");
41  region_id.units( UnitSI::dimensionless() );
42  region_id.set_mesh(mesh);
43 
44  RegionSet all_regions=mesh.region_db().get_region_set("ALL");
45  for(Region reg : all_regions) {
46  auto field_algo=std::make_shared<FieldConstant<spacedim, DoubleScalar>>();
47  field_algo->set_value(reg.id());
48  region_id.set(
49  field_algo,
50  0.0, // time=0.0
51  { reg.label() }); // set to region by its name
52  }
53  return region_id;
54 }
55 
56 template <int spacedim>
58  MixedPtr<FE_P_disc> fe(0);
59  std::shared_ptr<DOFHandlerMultiDim> dh = std::make_shared<DOFHandlerMultiDim>(mesh);
60  std::shared_ptr<DiscreteSpace> ds = std::make_shared<EqualOrderDiscreteSpace>( &mesh, fe);
61  dh->distribute_dofs(ds);
62 
63  auto field_subdomain_data = mesh.get_part()->subdomain_id_field_data();
64  unsigned int data_size = field_subdomain_data->size();
65  VectorMPI data_vec(data_size);
66  ASSERT_EQ(dh->max_elem_dofs(), 1);
67  unsigned int i_ele=0;
68  for (auto cell : dh->own_range()) {
69  data_vec.set( cell.get_loc_dof_indices()(0), (*field_subdomain_data)[i_ele] );
70  ++i_ele;
71  }
72  std::shared_ptr< FieldFE<spacedim, DoubleScalar> > field_ptr = std::make_shared< FieldFE<spacedim, DoubleScalar> >();
73  field_ptr->set_fe_data(dh, data_vec);
74 
75  IndexField subdomain;
76  subdomain.name("subdomain");
77  subdomain.units( UnitSI::dimensionless() );
78  subdomain.set_mesh(mesh);
79 
80  subdomain.set(
81  field_ptr,
82  0.0, // time=0.0
83  { "ALL" }); // ALL regions
84 
85  return subdomain;
86 }
87 
88 
89 
90 #endif /* GENERAL_FIELD_IMPL_HH_ */
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual) only for debug mode.
Definition: asserts.hh:333
FieldCommon & name(const string &name)
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
Class template representing a field with values dependent on: point, element, and region.
Definition: field.hh:92
void set(FieldBasePtr field, double time, std::vector< std::string > region_set_names={"ALL"})
Definition: field.impl.hh:242
void set_mesh(const Mesh &mesh) override
Definition: field.impl.hh:203
static auto region_id(Mesh &mesh) -> IndexField
static auto subdomain(Mesh &mesh) -> IndexField
Definition: mesh.h:362
static UnitSI & dimensionless()
Returns dimensionless unit.
Definition: unit_si.cc:55
void set(unsigned int pos, double val)
Set value on given position.
Definition: vector_mpi.hh:111
Declaration of class which provides the finite element for every mesh cell.
Declaration of class which handles the ordering of degrees of freedom (dof) and mappings between loca...
Definitions of basic Lagrangean finite elements with polynomial shape functions.
Class MappingP1 implements the affine transformation of the unit cell onto the actual cell.