1
// Copyright (C) 2007 Anders Logg.
2
// Licensed under the GNU LGPL Version 2.1.
4
// First added: 2007-01-17
5
// Last changed: 2007-05-15
7
#include <dolfin/constants.h>
8
#include <dolfin/DofMapSet.h>
9
#include <dolfin/DofMap.h>
10
#include <dolfin/UFC.h>
12
using namespace dolfin;
14
//-----------------------------------------------------------------------------
15
UFC::UFC(const ufc::form& form, Mesh& mesh, const DofMapSet& dof_map_set) : form(form)
17
// Create finite elements
18
finite_elements = new ufc::finite_element*[form.rank()];
19
for (uint i = 0; i < form.rank(); i++)
20
finite_elements[i] = form.create_finite_element(i);
22
// Create finite elements for coefficients
23
coefficient_elements = new ufc::finite_element*[form.num_coefficients()];
24
for (uint i = 0; i < form.num_coefficients(); i++)
25
coefficient_elements[i] = form.create_finite_element(form.rank() + i);
27
// Create cell integrals
28
cell_integrals = new ufc::cell_integral*[form.num_cell_integrals()];
29
for (uint i = 0; i < form.num_cell_integrals(); i++)
30
cell_integrals[i] = form.create_cell_integral(i);
32
// Create exterior facet integrals
33
exterior_facet_integrals = new ufc::exterior_facet_integral*[form.num_exterior_facet_integrals()];
34
for (uint i = 0; i < form.num_exterior_facet_integrals(); i++)
35
exterior_facet_integrals[i] = form.create_exterior_facet_integral(i);
37
// Create interior facet integrals
38
interior_facet_integrals = new ufc::interior_facet_integral*[form.num_interior_facet_integrals()];
39
for (uint i = 0; i < form.num_interior_facet_integrals(); i++)
40
interior_facet_integrals[i] = form.create_interior_facet_integral(i);
43
this->mesh.init(mesh);
45
// Initialize cells with first cell in mesh
46
CellIterator cell(mesh);
47
this->cell.init(*cell);
48
this->cell0.init(*cell);
49
this->cell1.init(*cell);
51
// Initialize local tensor
53
for (uint i = 0; i < form.rank(); i++)
54
num_entries *= dof_map_set[i].local_dimension();
55
A = new real[num_entries];
56
for (uint i = 0; i < num_entries; i++)
59
// Initialize local tensor for macro element
61
for (uint i = 0; i < form.rank(); i++)
62
num_entries *= 2*dof_map_set[i].local_dimension();
63
macro_A = new real[num_entries];
64
for (uint i = 0; i < num_entries; i++)
67
// Initialize local dimensions
68
local_dimensions = new uint[form.rank()];
69
for (uint i = 0; i < form.rank(); i++)
70
local_dimensions[i] = dof_map_set[i].local_dimension();
72
// Initialize local dimensions for macro element
73
macro_local_dimensions = new uint[form.rank()];
74
for (uint i = 0; i < form.rank(); i++)
75
macro_local_dimensions[i] = 2*dof_map_set[i].local_dimension();
77
// Initialize global dimensions
78
global_dimensions = new uint[form.rank()];
79
for (uint i = 0; i < form.rank(); i++)
80
global_dimensions[i] = dof_map_set[i].global_dimension();
83
dofs = new uint*[form.rank()];
84
for (uint i = 0; i < form.rank(); i++)
86
dofs[i] = new uint[local_dimensions[i]];
87
for (uint j = 0; j < local_dimensions[i]; j++)
91
// Initialize dofs on macro element
92
macro_dofs = new uint*[form.rank()];
93
for (uint i = 0; i < form.rank(); i++)
95
macro_dofs[i] = new uint[macro_local_dimensions[i]];
96
for (uint j = 0; j < macro_local_dimensions[i]; j++)
100
// Initialize coefficients
101
w = new real*[form.num_coefficients()];
102
for (uint i = 0; i < form.num_coefficients(); i++)
104
const uint n = coefficient_elements[i]->space_dimension();
106
for (uint j = 0; j < n; j++)
110
// Initialize coefficients on macro element
111
macro_w = new real*[form.num_coefficients()];
112
for (uint i = 0; i < form.num_coefficients(); i++)
114
const uint n = 2*coefficient_elements[i]->space_dimension();
115
macro_w[i] = new real[n];
116
for (uint j = 0; j < n; j++)
120
//-----------------------------------------------------------------------------
123
// Delete finite elements
124
for (uint i = 0; i < form.rank(); i++)
125
delete finite_elements[i];
126
delete [] finite_elements;
128
// Delete coefficient finite elements
129
for (uint i = 0; i < form.num_coefficients(); i++)
130
delete coefficient_elements[i];
131
delete [] coefficient_elements;
133
// Delete cell integrals
134
for (uint i = 0; i < form.num_cell_integrals(); i++)
135
delete cell_integrals[i];
136
delete [] cell_integrals;
138
// Delete exterior facet integrals
139
for (uint i = 0; i < form.num_exterior_facet_integrals(); i++)
140
delete exterior_facet_integrals[i];
141
delete [] exterior_facet_integrals;
143
// Delete interior facet integrals
144
for (uint i = 0; i < form.num_interior_facet_integrals(); i++)
145
delete interior_facet_integrals[i];
146
delete [] interior_facet_integrals;
148
// Delete local tensor
151
// Delete local tensor for macro element
154
// Delete local dimensions
155
delete [] local_dimensions;
157
// Delete global dimensions
158
delete [] global_dimensions;
160
// Delete local dimensions for macro element
161
delete [] macro_local_dimensions;
164
for (uint i = 0; i < form.rank(); i++)
169
for (uint i = 0; i < form.rank(); i++)
170
delete [] macro_dofs[i];
171
delete [] macro_dofs;
173
// Delete coefficients
174
for (uint i = 0; i < form.num_coefficients(); i++)
178
// Delete macro coefficients
179
for (uint i = 0; i < form.num_coefficients(); i++)
180
delete [] macro_w[i];
183
//-----------------------------------------------------------------------------
184
void UFC::update(Cell& cell)
187
this->cell.update(cell);
189
// FIXME: Update coefficients
191
//-----------------------------------------------------------------------------
192
void UFC::update(Cell& cell0, Cell& cell1)
195
this->cell0.update(cell0);
196
this->cell1.update(cell1);
198
// FIXME: Update coefficients
200
//-----------------------------------------------------------------------------