/[escript]/trunk/escript/src/FunctionSpace.cpp
ViewVC logotype

Contents of /trunk/escript/src/FunctionSpace.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1137 - (show annotations)
Thu May 10 08:11:31 2007 UTC (12 years, 6 months ago) by gross
File size: 4614 byte(s)
This version passes the tests on windows except for 

   * vtk
   * netCDF

The version needs to be tested on altix and linux
1 /* $Id$ */
2 /*
3 ************************************************************
4 * Copyright 2006 by ACcESS MNRF *
5 * *
6 * http://www.access.edu.au *
7 * Primary Business: Queensland, Australia *
8 * Licensed under the Open Software License version 3.0 *
9 * http://www.opensource.org/licenses/osl-3.0.php *
10 * *
11 ************************************************************
12 */
13
14 #include "FunctionSpace.h"
15 #include "FunctionSpaceException.h"
16 #include "Data.h"
17 #include "DataFactory.h"
18
19 #include <iostream>
20 #include <sstream>
21
22 using namespace std;
23
24 namespace escript {
25
26 //
27 // Create a null domain for use with any default-constructed function space
28 ESCRIPT_DLL_API NullDomain FunctionSpace::m_nullDomainValue;
29
30 FunctionSpace::FunctionSpace():
31 m_domain(static_cast<AbstractDomain*>(&m_nullDomainValue)),
32 m_functionSpaceType(m_nullDomainValue.getFunctionCode())
33 {
34 }
35
36 FunctionSpace::FunctionSpace(const AbstractDomain& domain,
37 int functionSpaceType):
38 m_domain(dynamic_cast<const AbstractDomain*>(&domain)),
39 m_functionSpaceType(functionSpaceType)
40 {
41 if (!m_domain->isValidFunctionSpaceType(functionSpaceType)) {
42 std::stringstream temp;
43 temp << "Invalid function space type: " << functionSpaceType
44 << " for domain: " << m_domain->getDescription();
45 throw FunctionSpaceException(temp.str());
46 }
47 }
48
49 std::pair<int,int>
50 FunctionSpace::getDataShape() const
51 {
52 return m_domain->getDataShape(m_functionSpaceType);
53 }
54
55 int
56 FunctionSpace::getTypeCode() const
57 {
58 return m_functionSpaceType;
59 }
60
61 const
62 AbstractDomain&
63 FunctionSpace::getDomain() const
64 {
65 return *m_domain;
66 }
67
68 std::string
69 FunctionSpace::toString() const
70 {
71 std::stringstream temp;
72 temp << m_domain->functionSpaceTypeAsString(m_functionSpaceType) << " on " << m_domain->getDescription();
73 return temp.str();
74 }
75
76 const
77 boost::python::str
78 FunctionSpace::str() const
79 {
80 return boost::python::str(toString().c_str());
81 }
82
83
84 int
85 FunctionSpace::getTagFromSampleNo(int sampleNo) const
86 {
87 return m_domain->getTagFromSampleNo(m_functionSpaceType,sampleNo);
88 }
89
90 int
91 FunctionSpace::getTagFromDataPointNo(int dataPointNo) const
92 {
93 //
94 // Get the number of samples and data-points per sample
95 int numSamples = getNumSamples();
96 int numDataPointsPerSample = getNumDPPSample();
97 int numDataPoints = numSamples * numDataPointsPerSample;
98
99 if (numDataPointsPerSample==0) {
100 throw DataException("FunctionSpace::getTagFromDataPointNo error: no data-points associated with this object.");
101 }
102
103 if (dataPointNo<0 || dataPointNo>numDataPoints) {
104 throw DataException("FunctionSpace::getTagFromDataPointNo error: invalid data-point number supplied.");
105 }
106
107 //
108 // Determine the sample number which corresponds to this data-point number
109 int sampleNo = dataPointNo / numDataPointsPerSample;
110
111 //
112 // Determine the tag number which corresponds to this sample number
113 int tagNo = getTagFromSampleNo(sampleNo);
114
115 //
116 // return the tag number
117 return(tagNo);
118 }
119
120 int*
121 FunctionSpace::borrowSampleReferenceIDs() const
122 {
123 return m_domain->borrowSampleReferenceIDs(m_functionSpaceType);
124 }
125
126 FunctionSpace&
127 FunctionSpace::operator=(const FunctionSpace& other)
128 {
129 // explicitly defined assignment operator to emphasise pointer copy
130 m_nullDomainValue=other.m_nullDomainValue;
131 m_functionSpaceType=other.m_functionSpaceType;
132 m_domain=other.m_domain;
133 return *this;
134 }
135
136 bool
137 FunctionSpace::operator==(const FunctionSpace& other) const
138 {
139 return ((*(other.m_domain)==*(m_domain)) && (other.m_functionSpaceType==m_functionSpaceType));
140 }
141
142 bool
143 FunctionSpace::operator!=(const FunctionSpace& other) const
144 {
145 return !(operator==(other));
146 }
147
148 escript::Data
149 FunctionSpace::getX() const
150 {
151 Data out=escript::Vector(0,*this,true);
152 getDomain().setToX(out);
153 out.setProtection();
154 return out;
155 }
156
157 escript::Data
158 FunctionSpace::getNormal() const
159 {
160 Data out=escript::Vector(0,*this,true);
161 getDomain().setToNormal(out);
162 out.setProtection();
163 return out;
164 }
165
166 escript::Data
167 FunctionSpace::getSize() const
168 {
169 Data out=escript::Scalar(0,*this,true);
170 getDomain().setToSize(out);
171 out.setProtection();
172 return out;
173 }
174
175 void
176 FunctionSpace::setTags(const int newTag, const escript::Data& mask) const
177 {
178 if (mask.getFunctionSpace()== *this) {
179 m_domain->setTags(m_functionSpaceType,newTag,mask);
180 } else {
181 throw FunctionSpaceException("illegal function space of mask.");
182 }
183 }
184
185 } // end of namespace

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.26