54InterpolatingFuction :: evaluate(
FloatArray &answer,
const std :: map< std :: string, FunctionArgument > &valDict,
GaussPoint *gp,
double param)
56 double randomVariable = 0.;
58 auto it = valDict.find(
"x");
59 if ( it == valDict.end() ) {
60 OOFEM_ERROR(
"Coordinate needed for evaluating function");
62 const FloatArray &globalCoordinates = it->second.val1;
66 int countXDown = 0, countXUp = 0, countYDown = 0, countYUp = 0;
68 double helpX = 0., helpY = 0.;
69 int i = 0, exitFlag = 0;
72 double randomXStart =
field(0);
74 double randomYStart =
field(1);
77 if ( !( globalCoordinates.
at(1) > randomXStart && globalCoordinates.
at(1) < randomXEnd &&
78 globalCoordinates.
at(2) > randomYStart && globalCoordinates.
at(2) < randomYEnd ) ) {
82 while ( exitFlag == 0 ) {
102 while ( exitFlag == 0 ) {
103 if (
field(3 * i + 1) > globalCoordinates.
at(2) ) {
113 helpY = ( globalCoordinates.
at(2) -
field(3 * countYDown + 1) )
114 / (
field(3 * countYUp + 1) -
field(3 * countYDown + 1) );
121 if ( randomVariable == 0. ) {
123 ( 1. - helpX ) * ( 1. - helpY ) *
field(3 * ( countXDown *
numberReal(1) + countYDown ) + 2) +
124 helpX * ( 1. - helpY ) *
field(3 * ( countXUp *
numberReal(1) + countYDown ) + 2) +
125 helpX *helpY *
field(3 * ( countXUp *
numberReal ( 1 ) + countYUp ) + 2) +
126 ( 1. - helpX ) * helpY *
field(3 * ( countXDown *
numberReal(1) + countYUp ) + 2);
132 int countXDown = 0, countXUp = 0, countYDown = 0, countYUp = 0, countZDown = 0, countZUp = 0;
134 double helpX = 0., helpY = 0., helpZ = 0.;
135 int i = 0, exitFlag = 0;
138 double randomXStart =
field.at(1);
140 double randomYStart =
field.at(2);
142 double randomZStart =
field.at(3);
145 double fieldX0Y0Z0, fieldX1Y0Z0, fieldX0Y1Z0, fieldX0Y0Z1, fieldX1Y1Z0, fieldX1Y1Z1, fieldX0Y1Z1, fieldX1Y0Z1;
146 double field00, field01, field10, field11;
147 double field0,field1;
149 if ( !( globalCoordinates.
at(1) >= randomXStart && globalCoordinates.
at(1) <= randomXEnd &&
150 globalCoordinates.
at(2) >= randomYStart && globalCoordinates.
at(2) <= randomYEnd &&
151 globalCoordinates.
at(3) >= randomZStart && globalCoordinates.
at(3) <= randomZEnd ) ) {
153 printf(
"Warning: External field too small\n");
157 while ( exitFlag == 0 ) {
160 OOFEM_ERROR(
"error in externalfieldgenerator.C: i is zero");
162 OOFEM_ERROR(
"error in externalfieldgenerator.C: i is greater than realNumber1");
177 while ( exitFlag == 0 ) {
180 OOFEM_ERROR(
"error in externalfieldgenerator.C: i is zero");
182 OOFEM_ERROR(
"error in externalfieldgenerator.C: i is greater than realNumber2");
188 helpY = ( globalCoordinates.
at(2) -
field.at(4 * countYDown*
numberReal.at(3) + 2) )
198 while ( exitFlag == 0 ) {
199 if (
field.at(4 * i + 3) > globalCoordinates.
at(3) ) {
201 OOFEM_ERROR(
"error in externalfieldgenerator.C: i is zero");
203 OOFEM_ERROR(
"error in externalfieldgenerator.C: i is equal to realNumber");
209 helpZ = ( globalCoordinates.
at(3) -
field.at(4 * countZDown + 3) )
210 / (
field.at(4 * countZUp + 3) -
field.at(4 * countZDown + 3) );
218 if ( randomVariable == 0. ) {
229 field00 = fieldX0Y0Z0 * (1. - helpX) + fieldX1Y0Z0 * helpX;
230 field10 = fieldX0Y1Z0 * (1. - helpX) + fieldX1Y1Z0 * helpX;
231 field01 = fieldX0Y0Z1 * (1. - helpX) + fieldX1Y0Z1 * helpX;
232 field11 = fieldX0Y1Z1 * (1. - helpX) + fieldX1Y1Z1 * helpX;
234 field0 = field00 * (1.-helpY) + field10*helpY;
235 field1 = field01 * (1.-helpY) + field11*helpY;
237 randomVariable = field0*(1. - helpZ) + field1*helpZ;
245 answer =
Vec1(randomVariable);