~njansson/dolfin/hpc

« back to all changes in this revision

Viewing changes to src/kernel/fem/UFC.cpp

  • Committer: Johannes Ring
  • Date: 2008-03-05 22:43:06 UTC
  • Revision ID: johannr@simula.no-20080305224306-2npsdyhfdpl2esji
The BIG commit!

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Copyright (C) 2007 Anders Logg.
2
 
// Licensed under the GNU LGPL Version 2.1.
3
 
//
4
 
// First added:  2007-01-17
5
 
// Last changed: 2007-05-15
6
 
 
7
 
#include <dolfin/constants.h>
8
 
#include <dolfin/DofMapSet.h>
9
 
#include <dolfin/DofMap.h>
10
 
#include <dolfin/UFC.h>
11
 
 
12
 
using namespace dolfin;
13
 
 
14
 
//-----------------------------------------------------------------------------
15
 
UFC::UFC(const ufc::form& form, Mesh& mesh, const DofMapSet& dof_map_set) : form(form)
16
 
{
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);
21
 
 
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);
26
 
 
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);
31
 
 
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);
36
 
 
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);
41
 
 
42
 
  // Initialize mesh
43
 
  this->mesh.init(mesh);
44
 
 
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);
50
 
 
51
 
  // Initialize local tensor
52
 
  uint num_entries = 1;
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++)
57
 
    A[i] = 0.0;
58
 
 
59
 
  // Initialize local tensor for macro element
60
 
  num_entries = 1;
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++)
65
 
    macro_A[i] = 0.0;  
66
 
 
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();
71
 
 
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();
76
 
 
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();
81
 
 
82
 
  // Initialize dofs
83
 
  dofs = new uint*[form.rank()];
84
 
  for (uint i = 0; i < form.rank(); i++)
85
 
  {
86
 
    dofs[i] = new uint[local_dimensions[i]];
87
 
    for (uint j = 0; j < local_dimensions[i]; j++)
88
 
      dofs[i][j] = 0;
89
 
  }
90
 
 
91
 
  // Initialize dofs on macro element
92
 
  macro_dofs = new uint*[form.rank()];
93
 
  for (uint i = 0; i < form.rank(); i++)
94
 
  {
95
 
    macro_dofs[i] = new uint[macro_local_dimensions[i]];
96
 
    for (uint j = 0; j < macro_local_dimensions[i]; j++)
97
 
      macro_dofs[i][j] = 0;
98
 
  }
99
 
 
100
 
  // Initialize coefficients
101
 
  w = new real*[form.num_coefficients()];
102
 
  for (uint i = 0; i < form.num_coefficients(); i++)
103
 
  {
104
 
    const uint n = coefficient_elements[i]->space_dimension();
105
 
    w[i] = new real[n];
106
 
    for (uint j = 0; j < n; j++)
107
 
      w[i][j] = 0.0;
108
 
  }
109
 
 
110
 
  // Initialize coefficients on macro element
111
 
  macro_w = new real*[form.num_coefficients()];
112
 
  for (uint i = 0; i < form.num_coefficients(); i++)
113
 
  {
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++)
117
 
      macro_w[i][j] = 0.0;
118
 
  }
119
 
}
120
 
//-----------------------------------------------------------------------------
121
 
UFC::~UFC()
122
 
{
123
 
  // Delete finite elements
124
 
  for (uint i = 0; i < form.rank(); i++)
125
 
    delete finite_elements[i];
126
 
  delete [] finite_elements;
127
 
 
128
 
  // Delete coefficient finite elements
129
 
  for (uint i = 0; i < form.num_coefficients(); i++)
130
 
    delete coefficient_elements[i];
131
 
  delete [] coefficient_elements;
132
 
 
133
 
  // Delete cell integrals
134
 
  for (uint i = 0; i < form.num_cell_integrals(); i++)
135
 
    delete cell_integrals[i];
136
 
  delete [] cell_integrals;
137
 
 
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;
142
 
 
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;
147
 
 
148
 
  // Delete local tensor
149
 
  delete [] A;
150
 
 
151
 
  // Delete local tensor for macro element
152
 
  delete [] macro_A;
153
 
 
154
 
  // Delete local dimensions
155
 
  delete [] local_dimensions;
156
 
 
157
 
  // Delete global dimensions
158
 
  delete [] global_dimensions;
159
 
 
160
 
  // Delete local dimensions for macro element
161
 
  delete [] macro_local_dimensions;
162
 
 
163
 
  // Delete dofs
164
 
  for (uint i = 0; i < form.rank(); i++)
165
 
    delete [] dofs[i];
166
 
  delete [] dofs;
167
 
 
168
 
  // Delete macro dofs
169
 
  for (uint i = 0; i < form.rank(); i++)
170
 
    delete [] macro_dofs[i];
171
 
  delete [] macro_dofs;
172
 
 
173
 
  // Delete coefficients
174
 
  for (uint i = 0; i < form.num_coefficients(); i++)
175
 
    delete [] w[i];
176
 
  delete [] w;
177
 
 
178
 
  // Delete macro coefficients
179
 
  for (uint i = 0; i < form.num_coefficients(); i++)
180
 
    delete [] macro_w[i];
181
 
  delete [] macro_w;
182
 
}
183
 
//-----------------------------------------------------------------------------
184
 
void UFC::update(Cell& cell)
185
 
{
186
 
  // Update UFC cell
187
 
  this->cell.update(cell);
188
 
 
189
 
  // FIXME: Update coefficients
190
 
}
191
 
//-----------------------------------------------------------------------------
192
 
void UFC::update(Cell& cell0, Cell& cell1)
193
 
{
194
 
  // Update UFC cells
195
 
  this->cell0.update(cell0);
196
 
  this->cell1.update(cell1);
197
 
 
198
 
  // FIXME: Update coefficients
199
 
}
200
 
//-----------------------------------------------------------------------------