765
918
values[r] = 0.00000000;
766
919
}// end loop over 'r'
768
// Map degree of freedom to element degree of freedom
769
const unsigned int dof = i;
771
// Array of basisvalues.
772
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
774
// Declare helper variables.
777
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
779
// Compute basisvalues.
780
basisvalues[0] = 1.00000000;
781
basisvalues[1] = tmp0;
782
for (unsigned int r = 0; r < 1; r++)
784
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
785
ss = r*(r + 1)*(r + 2)/6;
786
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
787
}// end loop over 'r'
788
for (unsigned int r = 0; r < 1; r++)
790
for (unsigned int s = 0; s < 1 - r; s++)
792
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
793
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
794
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
795
}// end loop over 's'
796
}// end loop over 'r'
797
for (unsigned int r = 0; r < 2; r++)
799
for (unsigned int s = 0; s < 2 - r; s++)
801
for (unsigned int t = 0; t < 2 - r - s; t++)
803
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
804
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
805
}// end loop over 't'
806
}// end loop over 's'
807
}// end loop over 'r'
809
// Table(s) of coefficients.
810
static const double coefficients0[4][4] = \
811
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
812
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
813
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
814
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
816
// Tables of derivatives of the polynomial base (transpose).
817
static const double dmats0[4][4] = \
818
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
819
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
820
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
821
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
823
static const double dmats1[4][4] = \
824
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
825
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
826
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
827
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
829
static const double dmats2[4][4] = \
830
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
831
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
832
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
833
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
835
// Compute reference derivatives.
836
// Declare pointer to array of derivatives on FIAT element.
837
double *derivatives = new double[num_derivatives];
838
for (unsigned int r = 0; r < num_derivatives; r++)
840
derivatives[r] = 0.00000000;
841
}// end loop over 'r'
843
// Declare derivative matrix (of polynomial basis).
844
double dmats[4][4] = \
845
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
846
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
847
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
848
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
850
// Declare (auxiliary) derivative matrix (of polynomial basis).
851
double dmats_old[4][4] = \
852
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
853
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
854
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
855
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
857
// Loop possible derivatives.
858
for (unsigned int r = 0; r < num_derivatives; r++)
860
// Resetting dmats values to compute next derivative.
861
for (unsigned int t = 0; t < 4; t++)
863
for (unsigned int u = 0; u < 4; u++)
865
dmats[t][u] = 0.00000000;
868
dmats[t][u] = 1.00000000;
871
}// end loop over 'u'
872
}// end loop over 't'
874
// Looping derivative order to generate dmats.
875
for (unsigned int s = 0; s < n; s++)
877
// Updating dmats_old with new values and resetting dmats.
878
for (unsigned int t = 0; t < 4; t++)
880
for (unsigned int u = 0; u < 4; u++)
882
dmats_old[t][u] = dmats[t][u];
883
dmats[t][u] = 0.00000000;
884
}// end loop over 'u'
885
}// end loop over 't'
887
// Update dmats using an inner product.
888
if (combinations[r][s] == 0)
890
for (unsigned int t = 0; t < 4; t++)
892
for (unsigned int u = 0; u < 4; u++)
894
for (unsigned int tu = 0; tu < 4; tu++)
896
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
897
}// end loop over 'tu'
898
}// end loop over 'u'
899
}// end loop over 't'
902
if (combinations[r][s] == 1)
904
for (unsigned int t = 0; t < 4; t++)
906
for (unsigned int u = 0; u < 4; u++)
908
for (unsigned int tu = 0; tu < 4; tu++)
910
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
911
}// end loop over 'tu'
912
}// end loop over 'u'
913
}// end loop over 't'
916
if (combinations[r][s] == 2)
918
for (unsigned int t = 0; t < 4; t++)
920
for (unsigned int u = 0; u < 4; u++)
922
for (unsigned int tu = 0; tu < 4; tu++)
924
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
925
}// end loop over 'tu'
926
}// end loop over 'u'
927
}// end loop over 't'
930
}// end loop over 's'
931
for (unsigned int s = 0; s < 4; s++)
933
for (unsigned int t = 0; t < 4; t++)
935
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
936
}// end loop over 't'
937
}// end loop over 's'
938
}// end loop over 'r'
940
// Transform derivatives back to physical element
941
for (unsigned int r = 0; r < num_derivatives; r++)
943
for (unsigned int s = 0; s < num_derivatives; s++)
945
values[r] += transform[r][s]*derivatives[s];
946
}// end loop over 's'
947
}// end loop over 'r'
949
// Delete pointer to array of derivatives on FIAT element
950
delete [] derivatives;
952
// Delete pointer to array of combinations of derivatives and transform
953
for (unsigned int r = 0; r < num_derivatives; r++)
955
delete [] combinations[r];
956
}// end loop over 'r'
957
delete [] combinations;
958
for (unsigned int r = 0; r < num_derivatives; r++)
960
delete [] transform[r];
961
}// end loop over 'r'
926
// Array of basisvalues.
927
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
929
// Declare helper variables.
932
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
934
// Compute basisvalues.
935
basisvalues[0] = 1.00000000;
936
basisvalues[1] = tmp0;
937
for (unsigned int r = 0; r < 1; r++)
939
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
940
ss = r*(r + 1)*(r + 2)/6;
941
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
942
}// end loop over 'r'
943
for (unsigned int r = 0; r < 1; r++)
945
for (unsigned int s = 0; s < 1 - r; s++)
947
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
948
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
949
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
950
}// end loop over 's'
951
}// end loop over 'r'
952
for (unsigned int r = 0; r < 2; r++)
954
for (unsigned int s = 0; s < 2 - r; s++)
956
for (unsigned int t = 0; t < 2 - r - s; t++)
958
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
959
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
960
}// end loop over 't'
961
}// end loop over 's'
962
}// end loop over 'r'
964
// Table(s) of coefficients.
965
static const double coefficients0[4] = \
966
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
968
// Tables of derivatives of the polynomial base (transpose).
969
static const double dmats0[4][4] = \
970
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
971
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
972
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
973
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
975
static const double dmats1[4][4] = \
976
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
977
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
978
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
979
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
981
static const double dmats2[4][4] = \
982
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
983
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
984
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
985
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
987
// Compute reference derivatives.
988
// Declare pointer to array of derivatives on FIAT element.
989
double *derivatives = new double[num_derivatives];
990
for (unsigned int r = 0; r < num_derivatives; r++)
992
derivatives[r] = 0.00000000;
993
}// end loop over 'r'
995
// Declare derivative matrix (of polynomial basis).
996
double dmats[4][4] = \
997
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
998
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
999
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1000
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1002
// Declare (auxiliary) derivative matrix (of polynomial basis).
1003
double dmats_old[4][4] = \
1004
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1005
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1006
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1007
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1009
// Loop possible derivatives.
1010
for (unsigned int r = 0; r < num_derivatives; r++)
1012
// Resetting dmats values to compute next derivative.
1013
for (unsigned int t = 0; t < 4; t++)
1015
for (unsigned int u = 0; u < 4; u++)
1017
dmats[t][u] = 0.00000000;
1020
dmats[t][u] = 1.00000000;
1023
}// end loop over 'u'
1024
}// end loop over 't'
1026
// Looping derivative order to generate dmats.
1027
for (unsigned int s = 0; s < n; s++)
1029
// Updating dmats_old with new values and resetting dmats.
1030
for (unsigned int t = 0; t < 4; t++)
1032
for (unsigned int u = 0; u < 4; u++)
1034
dmats_old[t][u] = dmats[t][u];
1035
dmats[t][u] = 0.00000000;
1036
}// end loop over 'u'
1037
}// end loop over 't'
1039
// Update dmats using an inner product.
1040
if (combinations[r][s] == 0)
1042
for (unsigned int t = 0; t < 4; t++)
1044
for (unsigned int u = 0; u < 4; u++)
1046
for (unsigned int tu = 0; tu < 4; tu++)
1048
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1049
}// end loop over 'tu'
1050
}// end loop over 'u'
1051
}// end loop over 't'
1054
if (combinations[r][s] == 1)
1056
for (unsigned int t = 0; t < 4; t++)
1058
for (unsigned int u = 0; u < 4; u++)
1060
for (unsigned int tu = 0; tu < 4; tu++)
1062
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1063
}// end loop over 'tu'
1064
}// end loop over 'u'
1065
}// end loop over 't'
1068
if (combinations[r][s] == 2)
1070
for (unsigned int t = 0; t < 4; t++)
1072
for (unsigned int u = 0; u < 4; u++)
1074
for (unsigned int tu = 0; tu < 4; tu++)
1076
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1077
}// end loop over 'tu'
1078
}// end loop over 'u'
1079
}// end loop over 't'
1082
}// end loop over 's'
1083
for (unsigned int s = 0; s < 4; s++)
1085
for (unsigned int t = 0; t < 4; t++)
1087
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1088
}// end loop over 't'
1089
}// end loop over 's'
1090
}// end loop over 'r'
1092
// Transform derivatives back to physical element
1093
for (unsigned int r = 0; r < num_derivatives; r++)
1095
for (unsigned int s = 0; s < num_derivatives; s++)
1097
values[r] += transform[r][s]*derivatives[s];
1098
}// end loop over 's'
1099
}// end loop over 'r'
1101
// Delete pointer to array of derivatives on FIAT element
1102
delete [] derivatives;
1104
// Delete pointer to array of combinations of derivatives and transform
1105
for (unsigned int r = 0; r < num_derivatives; r++)
1107
delete [] combinations[r];
1108
}// end loop over 'r'
1109
delete [] combinations;
1110
for (unsigned int r = 0; r < num_derivatives; r++)
1112
delete [] transform[r];
1113
}// end loop over 'r'
1114
delete [] transform;
1120
// Array of basisvalues.
1121
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1123
// Declare helper variables.
1124
unsigned int rr = 0;
1125
unsigned int ss = 0;
1126
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1128
// Compute basisvalues.
1129
basisvalues[0] = 1.00000000;
1130
basisvalues[1] = tmp0;
1131
for (unsigned int r = 0; r < 1; r++)
1133
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1134
ss = r*(r + 1)*(r + 2)/6;
1135
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1136
}// end loop over 'r'
1137
for (unsigned int r = 0; r < 1; r++)
1139
for (unsigned int s = 0; s < 1 - r; s++)
1141
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1142
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1143
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1144
}// end loop over 's'
1145
}// end loop over 'r'
1146
for (unsigned int r = 0; r < 2; r++)
1148
for (unsigned int s = 0; s < 2 - r; s++)
1150
for (unsigned int t = 0; t < 2 - r - s; t++)
1152
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1153
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1154
}// end loop over 't'
1155
}// end loop over 's'
1156
}// end loop over 'r'
1158
// Table(s) of coefficients.
1159
static const double coefficients0[4] = \
1160
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
1162
// Tables of derivatives of the polynomial base (transpose).
1163
static const double dmats0[4][4] = \
1164
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1165
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
1166
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1167
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1169
static const double dmats1[4][4] = \
1170
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1171
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1172
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
1173
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1175
static const double dmats2[4][4] = \
1176
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1177
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1178
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
1179
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
1181
// Compute reference derivatives.
1182
// Declare pointer to array of derivatives on FIAT element.
1183
double *derivatives = new double[num_derivatives];
1184
for (unsigned int r = 0; r < num_derivatives; r++)
1186
derivatives[r] = 0.00000000;
1187
}// end loop over 'r'
1189
// Declare derivative matrix (of polynomial basis).
1190
double dmats[4][4] = \
1191
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1192
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1193
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1194
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1196
// Declare (auxiliary) derivative matrix (of polynomial basis).
1197
double dmats_old[4][4] = \
1198
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1199
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1200
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1201
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1203
// Loop possible derivatives.
1204
for (unsigned int r = 0; r < num_derivatives; r++)
1206
// Resetting dmats values to compute next derivative.
1207
for (unsigned int t = 0; t < 4; t++)
1209
for (unsigned int u = 0; u < 4; u++)
1211
dmats[t][u] = 0.00000000;
1214
dmats[t][u] = 1.00000000;
1217
}// end loop over 'u'
1218
}// end loop over 't'
1220
// Looping derivative order to generate dmats.
1221
for (unsigned int s = 0; s < n; s++)
1223
// Updating dmats_old with new values and resetting dmats.
1224
for (unsigned int t = 0; t < 4; t++)
1226
for (unsigned int u = 0; u < 4; u++)
1228
dmats_old[t][u] = dmats[t][u];
1229
dmats[t][u] = 0.00000000;
1230
}// end loop over 'u'
1231
}// end loop over 't'
1233
// Update dmats using an inner product.
1234
if (combinations[r][s] == 0)
1236
for (unsigned int t = 0; t < 4; t++)
1238
for (unsigned int u = 0; u < 4; u++)
1240
for (unsigned int tu = 0; tu < 4; tu++)
1242
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1243
}// end loop over 'tu'
1244
}// end loop over 'u'
1245
}// end loop over 't'
1248
if (combinations[r][s] == 1)
1250
for (unsigned int t = 0; t < 4; t++)
1252
for (unsigned int u = 0; u < 4; u++)
1254
for (unsigned int tu = 0; tu < 4; tu++)
1256
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1257
}// end loop over 'tu'
1258
}// end loop over 'u'
1259
}// end loop over 't'
1262
if (combinations[r][s] == 2)
1264
for (unsigned int t = 0; t < 4; t++)
1266
for (unsigned int u = 0; u < 4; u++)
1268
for (unsigned int tu = 0; tu < 4; tu++)
1270
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1271
}// end loop over 'tu'
1272
}// end loop over 'u'
1273
}// end loop over 't'
1276
}// end loop over 's'
1277
for (unsigned int s = 0; s < 4; s++)
1279
for (unsigned int t = 0; t < 4; t++)
1281
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1282
}// end loop over 't'
1283
}// end loop over 's'
1284
}// end loop over 'r'
1286
// Transform derivatives back to physical element
1287
for (unsigned int r = 0; r < num_derivatives; r++)
1289
for (unsigned int s = 0; s < num_derivatives; s++)
1291
values[r] += transform[r][s]*derivatives[s];
1292
}// end loop over 's'
1293
}// end loop over 'r'
1295
// Delete pointer to array of derivatives on FIAT element
1296
delete [] derivatives;
1298
// Delete pointer to array of combinations of derivatives and transform
1299
for (unsigned int r = 0; r < num_derivatives; r++)
1301
delete [] combinations[r];
1302
}// end loop over 'r'
1303
delete [] combinations;
1304
for (unsigned int r = 0; r < num_derivatives; r++)
1306
delete [] transform[r];
1307
}// end loop over 'r'
1308
delete [] transform;
1314
// Array of basisvalues.
1315
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1317
// Declare helper variables.
1318
unsigned int rr = 0;
1319
unsigned int ss = 0;
1320
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1322
// Compute basisvalues.
1323
basisvalues[0] = 1.00000000;
1324
basisvalues[1] = tmp0;
1325
for (unsigned int r = 0; r < 1; r++)
1327
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1328
ss = r*(r + 1)*(r + 2)/6;
1329
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1330
}// end loop over 'r'
1331
for (unsigned int r = 0; r < 1; r++)
1333
for (unsigned int s = 0; s < 1 - r; s++)
1335
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1336
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1337
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1338
}// end loop over 's'
1339
}// end loop over 'r'
1340
for (unsigned int r = 0; r < 2; r++)
1342
for (unsigned int s = 0; s < 2 - r; s++)
1344
for (unsigned int t = 0; t < 2 - r - s; t++)
1346
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1347
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1348
}// end loop over 't'
1349
}// end loop over 's'
1350
}// end loop over 'r'
1352
// Table(s) of coefficients.
1353
static const double coefficients0[4] = \
1354
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
1356
// Tables of derivatives of the polynomial base (transpose).
1357
static const double dmats0[4][4] = \
1358
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1359
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
1360
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1361
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1363
static const double dmats1[4][4] = \
1364
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1365
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1366
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
1367
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1369
static const double dmats2[4][4] = \
1370
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1371
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1372
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
1373
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
1375
// Compute reference derivatives.
1376
// Declare pointer to array of derivatives on FIAT element.
1377
double *derivatives = new double[num_derivatives];
1378
for (unsigned int r = 0; r < num_derivatives; r++)
1380
derivatives[r] = 0.00000000;
1381
}// end loop over 'r'
1383
// Declare derivative matrix (of polynomial basis).
1384
double dmats[4][4] = \
1385
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1386
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1387
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1388
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1390
// Declare (auxiliary) derivative matrix (of polynomial basis).
1391
double dmats_old[4][4] = \
1392
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1393
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1394
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1395
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1397
// Loop possible derivatives.
1398
for (unsigned int r = 0; r < num_derivatives; r++)
1400
// Resetting dmats values to compute next derivative.
1401
for (unsigned int t = 0; t < 4; t++)
1403
for (unsigned int u = 0; u < 4; u++)
1405
dmats[t][u] = 0.00000000;
1408
dmats[t][u] = 1.00000000;
1411
}// end loop over 'u'
1412
}// end loop over 't'
1414
// Looping derivative order to generate dmats.
1415
for (unsigned int s = 0; s < n; s++)
1417
// Updating dmats_old with new values and resetting dmats.
1418
for (unsigned int t = 0; t < 4; t++)
1420
for (unsigned int u = 0; u < 4; u++)
1422
dmats_old[t][u] = dmats[t][u];
1423
dmats[t][u] = 0.00000000;
1424
}// end loop over 'u'
1425
}// end loop over 't'
1427
// Update dmats using an inner product.
1428
if (combinations[r][s] == 0)
1430
for (unsigned int t = 0; t < 4; t++)
1432
for (unsigned int u = 0; u < 4; u++)
1434
for (unsigned int tu = 0; tu < 4; tu++)
1436
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1437
}// end loop over 'tu'
1438
}// end loop over 'u'
1439
}// end loop over 't'
1442
if (combinations[r][s] == 1)
1444
for (unsigned int t = 0; t < 4; t++)
1446
for (unsigned int u = 0; u < 4; u++)
1448
for (unsigned int tu = 0; tu < 4; tu++)
1450
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1451
}// end loop over 'tu'
1452
}// end loop over 'u'
1453
}// end loop over 't'
1456
if (combinations[r][s] == 2)
1458
for (unsigned int t = 0; t < 4; t++)
1460
for (unsigned int u = 0; u < 4; u++)
1462
for (unsigned int tu = 0; tu < 4; tu++)
1464
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1465
}// end loop over 'tu'
1466
}// end loop over 'u'
1467
}// end loop over 't'
1470
}// end loop over 's'
1471
for (unsigned int s = 0; s < 4; s++)
1473
for (unsigned int t = 0; t < 4; t++)
1475
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1476
}// end loop over 't'
1477
}// end loop over 's'
1478
}// end loop over 'r'
1480
// Transform derivatives back to physical element
1481
for (unsigned int r = 0; r < num_derivatives; r++)
1483
for (unsigned int s = 0; s < num_derivatives; s++)
1485
values[r] += transform[r][s]*derivatives[s];
1486
}// end loop over 's'
1487
}// end loop over 'r'
1489
// Delete pointer to array of derivatives on FIAT element
1490
delete [] derivatives;
1492
// Delete pointer to array of combinations of derivatives and transform
1493
for (unsigned int r = 0; r < num_derivatives; r++)
1495
delete [] combinations[r];
1496
}// end loop over 'r'
1497
delete [] combinations;
1498
for (unsigned int r = 0; r < num_derivatives; r++)
1500
delete [] transform[r];
1501
}// end loop over 'r'
1502
delete [] transform;
1508
// Array of basisvalues.
1509
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1511
// Declare helper variables.
1512
unsigned int rr = 0;
1513
unsigned int ss = 0;
1514
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1516
// Compute basisvalues.
1517
basisvalues[0] = 1.00000000;
1518
basisvalues[1] = tmp0;
1519
for (unsigned int r = 0; r < 1; r++)
1521
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1522
ss = r*(r + 1)*(r + 2)/6;
1523
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1524
}// end loop over 'r'
1525
for (unsigned int r = 0; r < 1; r++)
1527
for (unsigned int s = 0; s < 1 - r; s++)
1529
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1530
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1531
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1532
}// end loop over 's'
1533
}// end loop over 'r'
1534
for (unsigned int r = 0; r < 2; r++)
1536
for (unsigned int s = 0; s < 2 - r; s++)
1538
for (unsigned int t = 0; t < 2 - r - s; t++)
1540
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1541
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1542
}// end loop over 't'
1543
}// end loop over 's'
1544
}// end loop over 'r'
1546
// Table(s) of coefficients.
1547
static const double coefficients0[4] = \
1548
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
1550
// Tables of derivatives of the polynomial base (transpose).
1551
static const double dmats0[4][4] = \
1552
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1553
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
1554
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1555
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1557
static const double dmats1[4][4] = \
1558
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1559
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1560
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
1561
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1563
static const double dmats2[4][4] = \
1564
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1565
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1566
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
1567
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
1569
// Compute reference derivatives.
1570
// Declare pointer to array of derivatives on FIAT element.
1571
double *derivatives = new double[num_derivatives];
1572
for (unsigned int r = 0; r < num_derivatives; r++)
1574
derivatives[r] = 0.00000000;
1575
}// end loop over 'r'
1577
// Declare derivative matrix (of polynomial basis).
1578
double dmats[4][4] = \
1579
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1580
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1581
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1582
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1584
// Declare (auxiliary) derivative matrix (of polynomial basis).
1585
double dmats_old[4][4] = \
1586
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1587
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1588
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1589
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1591
// Loop possible derivatives.
1592
for (unsigned int r = 0; r < num_derivatives; r++)
1594
// Resetting dmats values to compute next derivative.
1595
for (unsigned int t = 0; t < 4; t++)
1597
for (unsigned int u = 0; u < 4; u++)
1599
dmats[t][u] = 0.00000000;
1602
dmats[t][u] = 1.00000000;
1605
}// end loop over 'u'
1606
}// end loop over 't'
1608
// Looping derivative order to generate dmats.
1609
for (unsigned int s = 0; s < n; s++)
1611
// Updating dmats_old with new values and resetting dmats.
1612
for (unsigned int t = 0; t < 4; t++)
1614
for (unsigned int u = 0; u < 4; u++)
1616
dmats_old[t][u] = dmats[t][u];
1617
dmats[t][u] = 0.00000000;
1618
}// end loop over 'u'
1619
}// end loop over 't'
1621
// Update dmats using an inner product.
1622
if (combinations[r][s] == 0)
1624
for (unsigned int t = 0; t < 4; t++)
1626
for (unsigned int u = 0; u < 4; u++)
1628
for (unsigned int tu = 0; tu < 4; tu++)
1630
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1631
}// end loop over 'tu'
1632
}// end loop over 'u'
1633
}// end loop over 't'
1636
if (combinations[r][s] == 1)
1638
for (unsigned int t = 0; t < 4; t++)
1640
for (unsigned int u = 0; u < 4; u++)
1642
for (unsigned int tu = 0; tu < 4; tu++)
1644
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1645
}// end loop over 'tu'
1646
}// end loop over 'u'
1647
}// end loop over 't'
1650
if (combinations[r][s] == 2)
1652
for (unsigned int t = 0; t < 4; t++)
1654
for (unsigned int u = 0; u < 4; u++)
1656
for (unsigned int tu = 0; tu < 4; tu++)
1658
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1659
}// end loop over 'tu'
1660
}// end loop over 'u'
1661
}// end loop over 't'
1664
}// end loop over 's'
1665
for (unsigned int s = 0; s < 4; s++)
1667
for (unsigned int t = 0; t < 4; t++)
1669
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1670
}// end loop over 't'
1671
}// end loop over 's'
1672
}// end loop over 'r'
1674
// Transform derivatives back to physical element
1675
for (unsigned int r = 0; r < num_derivatives; r++)
1677
for (unsigned int s = 0; s < num_derivatives; s++)
1679
values[r] += transform[r][s]*derivatives[s];
1680
}// end loop over 's'
1681
}// end loop over 'r'
1683
// Delete pointer to array of derivatives on FIAT element
1684
delete [] derivatives;
1686
// Delete pointer to array of combinations of derivatives and transform
1687
for (unsigned int r = 0; r < num_derivatives; r++)
1689
delete [] combinations[r];
1690
}// end loop over 'r'
1691
delete [] combinations;
1692
for (unsigned int r = 0; r < num_derivatives; r++)
1694
delete [] transform[r];
1695
}// end loop over 'r'
1696
delete [] transform;
965
1703
/// Evaluate order n derivatives of all basis functions at given point in cell
1217
1955
values[0] = 0.00000000;
1218
1956
values[1] = 0.00000000;
1219
1957
values[2] = 0.00000000;
1220
if (0 <= i && i <= 3)
1222
// Map degree of freedom to element degree of freedom
1223
const unsigned int dof = i;
1225
// Array of basisvalues.
1226
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1228
// Declare helper variables.
1229
unsigned int rr = 0;
1230
unsigned int ss = 0;
1231
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1233
// Compute basisvalues.
1234
basisvalues[0] = 1.00000000;
1235
basisvalues[1] = tmp0;
1236
for (unsigned int r = 0; r < 1; r++)
1238
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1239
ss = r*(r + 1)*(r + 2)/6;
1240
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1241
}// end loop over 'r'
1242
for (unsigned int r = 0; r < 1; r++)
1244
for (unsigned int s = 0; s < 1 - r; s++)
1246
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1247
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1248
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1249
}// end loop over 's'
1250
}// end loop over 'r'
1251
for (unsigned int r = 0; r < 2; r++)
1253
for (unsigned int s = 0; s < 2 - r; s++)
1255
for (unsigned int t = 0; t < 2 - r - s; t++)
1257
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1258
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1259
}// end loop over 't'
1260
}// end loop over 's'
1261
}// end loop over 'r'
1263
// Table(s) of coefficients.
1264
static const double coefficients0[4][4] = \
1265
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
1266
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
1267
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
1268
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
1270
// Compute value(s).
1271
for (unsigned int r = 0; r < 4; r++)
1273
values[0] += coefficients0[dof][r]*basisvalues[r];
1274
}// end loop over 'r'
1277
if (4 <= i && i <= 7)
1279
// Map degree of freedom to element degree of freedom
1280
const unsigned int dof = i - 4;
1282
// Array of basisvalues.
1283
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1285
// Declare helper variables.
1286
unsigned int rr = 0;
1287
unsigned int ss = 0;
1288
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1290
// Compute basisvalues.
1291
basisvalues[0] = 1.00000000;
1292
basisvalues[1] = tmp0;
1293
for (unsigned int r = 0; r < 1; r++)
1295
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1296
ss = r*(r + 1)*(r + 2)/6;
1297
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1298
}// end loop over 'r'
1299
for (unsigned int r = 0; r < 1; r++)
1301
for (unsigned int s = 0; s < 1 - r; s++)
1303
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1304
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1305
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1306
}// end loop over 's'
1307
}// end loop over 'r'
1308
for (unsigned int r = 0; r < 2; r++)
1310
for (unsigned int s = 0; s < 2 - r; s++)
1312
for (unsigned int t = 0; t < 2 - r - s; t++)
1314
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1315
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1316
}// end loop over 't'
1317
}// end loop over 's'
1318
}// end loop over 'r'
1320
// Table(s) of coefficients.
1321
static const double coefficients0[4][4] = \
1322
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
1323
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
1324
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
1325
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
1327
// Compute value(s).
1328
for (unsigned int r = 0; r < 4; r++)
1330
values[1] += coefficients0[dof][r]*basisvalues[r];
1331
}// end loop over 'r'
1334
if (8 <= i && i <= 11)
1336
// Map degree of freedom to element degree of freedom
1337
const unsigned int dof = i - 8;
1339
// Array of basisvalues.
1340
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1342
// Declare helper variables.
1343
unsigned int rr = 0;
1344
unsigned int ss = 0;
1345
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1347
// Compute basisvalues.
1348
basisvalues[0] = 1.00000000;
1349
basisvalues[1] = tmp0;
1350
for (unsigned int r = 0; r < 1; r++)
1352
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1353
ss = r*(r + 1)*(r + 2)/6;
1354
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1355
}// end loop over 'r'
1356
for (unsigned int r = 0; r < 1; r++)
1358
for (unsigned int s = 0; s < 1 - r; s++)
1360
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1361
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1362
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1363
}// end loop over 's'
1364
}// end loop over 'r'
1365
for (unsigned int r = 0; r < 2; r++)
1367
for (unsigned int s = 0; s < 2 - r; s++)
1369
for (unsigned int t = 0; t < 2 - r - s; t++)
1371
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1372
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1373
}// end loop over 't'
1374
}// end loop over 's'
1375
}// end loop over 'r'
1377
// Table(s) of coefficients.
1378
static const double coefficients0[4][4] = \
1379
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
1380
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
1381
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
1382
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
1384
// Compute value(s).
1385
for (unsigned int r = 0; r < 4; r++)
1387
values[2] += coefficients0[dof][r]*basisvalues[r];
1388
}// end loop over 'r'
1963
// Array of basisvalues.
1964
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1966
// Declare helper variables.
1967
unsigned int rr = 0;
1968
unsigned int ss = 0;
1969
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1971
// Compute basisvalues.
1972
basisvalues[0] = 1.00000000;
1973
basisvalues[1] = tmp0;
1974
for (unsigned int r = 0; r < 1; r++)
1976
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1977
ss = r*(r + 1)*(r + 2)/6;
1978
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1979
}// end loop over 'r'
1980
for (unsigned int r = 0; r < 1; r++)
1982
for (unsigned int s = 0; s < 1 - r; s++)
1984
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1985
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1986
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1987
}// end loop over 's'
1988
}// end loop over 'r'
1989
for (unsigned int r = 0; r < 2; r++)
1991
for (unsigned int s = 0; s < 2 - r; s++)
1993
for (unsigned int t = 0; t < 2 - r - s; t++)
1995
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1996
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1997
}// end loop over 't'
1998
}// end loop over 's'
1999
}// end loop over 'r'
2001
// Table(s) of coefficients.
2002
static const double coefficients0[4] = \
2003
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
2005
// Compute value(s).
2006
for (unsigned int r = 0; r < 4; r++)
2008
values[0] += coefficients0[r]*basisvalues[r];
2009
}// end loop over 'r'
2015
// Array of basisvalues.
2016
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2018
// Declare helper variables.
2019
unsigned int rr = 0;
2020
unsigned int ss = 0;
2021
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2023
// Compute basisvalues.
2024
basisvalues[0] = 1.00000000;
2025
basisvalues[1] = tmp0;
2026
for (unsigned int r = 0; r < 1; r++)
2028
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2029
ss = r*(r + 1)*(r + 2)/6;
2030
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2031
}// end loop over 'r'
2032
for (unsigned int r = 0; r < 1; r++)
2034
for (unsigned int s = 0; s < 1 - r; s++)
2036
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2037
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2038
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2039
}// end loop over 's'
2040
}// end loop over 'r'
2041
for (unsigned int r = 0; r < 2; r++)
2043
for (unsigned int s = 0; s < 2 - r; s++)
2045
for (unsigned int t = 0; t < 2 - r - s; t++)
2047
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2048
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2049
}// end loop over 't'
2050
}// end loop over 's'
2051
}// end loop over 'r'
2053
// Table(s) of coefficients.
2054
static const double coefficients0[4] = \
2055
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
2057
// Compute value(s).
2058
for (unsigned int r = 0; r < 4; r++)
2060
values[0] += coefficients0[r]*basisvalues[r];
2061
}// end loop over 'r'
2067
// Array of basisvalues.
2068
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2070
// Declare helper variables.
2071
unsigned int rr = 0;
2072
unsigned int ss = 0;
2073
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2075
// Compute basisvalues.
2076
basisvalues[0] = 1.00000000;
2077
basisvalues[1] = tmp0;
2078
for (unsigned int r = 0; r < 1; r++)
2080
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2081
ss = r*(r + 1)*(r + 2)/6;
2082
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2083
}// end loop over 'r'
2084
for (unsigned int r = 0; r < 1; r++)
2086
for (unsigned int s = 0; s < 1 - r; s++)
2088
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2089
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2090
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2091
}// end loop over 's'
2092
}// end loop over 'r'
2093
for (unsigned int r = 0; r < 2; r++)
2095
for (unsigned int s = 0; s < 2 - r; s++)
2097
for (unsigned int t = 0; t < 2 - r - s; t++)
2099
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2100
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2101
}// end loop over 't'
2102
}// end loop over 's'
2103
}// end loop over 'r'
2105
// Table(s) of coefficients.
2106
static const double coefficients0[4] = \
2107
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
2109
// Compute value(s).
2110
for (unsigned int r = 0; r < 4; r++)
2112
values[0] += coefficients0[r]*basisvalues[r];
2113
}// end loop over 'r'
2119
// Array of basisvalues.
2120
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2122
// Declare helper variables.
2123
unsigned int rr = 0;
2124
unsigned int ss = 0;
2125
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2127
// Compute basisvalues.
2128
basisvalues[0] = 1.00000000;
2129
basisvalues[1] = tmp0;
2130
for (unsigned int r = 0; r < 1; r++)
2132
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2133
ss = r*(r + 1)*(r + 2)/6;
2134
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2135
}// end loop over 'r'
2136
for (unsigned int r = 0; r < 1; r++)
2138
for (unsigned int s = 0; s < 1 - r; s++)
2140
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2141
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2142
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2143
}// end loop over 's'
2144
}// end loop over 'r'
2145
for (unsigned int r = 0; r < 2; r++)
2147
for (unsigned int s = 0; s < 2 - r; s++)
2149
for (unsigned int t = 0; t < 2 - r - s; t++)
2151
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2152
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2153
}// end loop over 't'
2154
}// end loop over 's'
2155
}// end loop over 'r'
2157
// Table(s) of coefficients.
2158
static const double coefficients0[4] = \
2159
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
2161
// Compute value(s).
2162
for (unsigned int r = 0; r < 4; r++)
2164
values[0] += coefficients0[r]*basisvalues[r];
2165
}// end loop over 'r'
2171
// Array of basisvalues.
2172
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2174
// Declare helper variables.
2175
unsigned int rr = 0;
2176
unsigned int ss = 0;
2177
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2179
// Compute basisvalues.
2180
basisvalues[0] = 1.00000000;
2181
basisvalues[1] = tmp0;
2182
for (unsigned int r = 0; r < 1; r++)
2184
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2185
ss = r*(r + 1)*(r + 2)/6;
2186
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2187
}// end loop over 'r'
2188
for (unsigned int r = 0; r < 1; r++)
2190
for (unsigned int s = 0; s < 1 - r; s++)
2192
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2193
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2194
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2195
}// end loop over 's'
2196
}// end loop over 'r'
2197
for (unsigned int r = 0; r < 2; r++)
2199
for (unsigned int s = 0; s < 2 - r; s++)
2201
for (unsigned int t = 0; t < 2 - r - s; t++)
2203
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2204
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2205
}// end loop over 't'
2206
}// end loop over 's'
2207
}// end loop over 'r'
2209
// Table(s) of coefficients.
2210
static const double coefficients0[4] = \
2211
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
2213
// Compute value(s).
2214
for (unsigned int r = 0; r < 4; r++)
2216
values[1] += coefficients0[r]*basisvalues[r];
2217
}// end loop over 'r'
2223
// Array of basisvalues.
2224
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2226
// Declare helper variables.
2227
unsigned int rr = 0;
2228
unsigned int ss = 0;
2229
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2231
// Compute basisvalues.
2232
basisvalues[0] = 1.00000000;
2233
basisvalues[1] = tmp0;
2234
for (unsigned int r = 0; r < 1; r++)
2236
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2237
ss = r*(r + 1)*(r + 2)/6;
2238
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2239
}// end loop over 'r'
2240
for (unsigned int r = 0; r < 1; r++)
2242
for (unsigned int s = 0; s < 1 - r; s++)
2244
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2245
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2246
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2247
}// end loop over 's'
2248
}// end loop over 'r'
2249
for (unsigned int r = 0; r < 2; r++)
2251
for (unsigned int s = 0; s < 2 - r; s++)
2253
for (unsigned int t = 0; t < 2 - r - s; t++)
2255
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2256
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2257
}// end loop over 't'
2258
}// end loop over 's'
2259
}// end loop over 'r'
2261
// Table(s) of coefficients.
2262
static const double coefficients0[4] = \
2263
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
2265
// Compute value(s).
2266
for (unsigned int r = 0; r < 4; r++)
2268
values[1] += coefficients0[r]*basisvalues[r];
2269
}// end loop over 'r'
2275
// Array of basisvalues.
2276
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2278
// Declare helper variables.
2279
unsigned int rr = 0;
2280
unsigned int ss = 0;
2281
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2283
// Compute basisvalues.
2284
basisvalues[0] = 1.00000000;
2285
basisvalues[1] = tmp0;
2286
for (unsigned int r = 0; r < 1; r++)
2288
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2289
ss = r*(r + 1)*(r + 2)/6;
2290
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2291
}// end loop over 'r'
2292
for (unsigned int r = 0; r < 1; r++)
2294
for (unsigned int s = 0; s < 1 - r; s++)
2296
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2297
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2298
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2299
}// end loop over 's'
2300
}// end loop over 'r'
2301
for (unsigned int r = 0; r < 2; r++)
2303
for (unsigned int s = 0; s < 2 - r; s++)
2305
for (unsigned int t = 0; t < 2 - r - s; t++)
2307
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2308
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2309
}// end loop over 't'
2310
}// end loop over 's'
2311
}// end loop over 'r'
2313
// Table(s) of coefficients.
2314
static const double coefficients0[4] = \
2315
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
2317
// Compute value(s).
2318
for (unsigned int r = 0; r < 4; r++)
2320
values[1] += coefficients0[r]*basisvalues[r];
2321
}// end loop over 'r'
2327
// Array of basisvalues.
2328
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2330
// Declare helper variables.
2331
unsigned int rr = 0;
2332
unsigned int ss = 0;
2333
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2335
// Compute basisvalues.
2336
basisvalues[0] = 1.00000000;
2337
basisvalues[1] = tmp0;
2338
for (unsigned int r = 0; r < 1; r++)
2340
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2341
ss = r*(r + 1)*(r + 2)/6;
2342
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2343
}// end loop over 'r'
2344
for (unsigned int r = 0; r < 1; r++)
2346
for (unsigned int s = 0; s < 1 - r; s++)
2348
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2349
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2350
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2351
}// end loop over 's'
2352
}// end loop over 'r'
2353
for (unsigned int r = 0; r < 2; r++)
2355
for (unsigned int s = 0; s < 2 - r; s++)
2357
for (unsigned int t = 0; t < 2 - r - s; t++)
2359
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2360
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2361
}// end loop over 't'
2362
}// end loop over 's'
2363
}// end loop over 'r'
2365
// Table(s) of coefficients.
2366
static const double coefficients0[4] = \
2367
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
2369
// Compute value(s).
2370
for (unsigned int r = 0; r < 4; r++)
2372
values[1] += coefficients0[r]*basisvalues[r];
2373
}// end loop over 'r'
2379
// Array of basisvalues.
2380
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2382
// Declare helper variables.
2383
unsigned int rr = 0;
2384
unsigned int ss = 0;
2385
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2387
// Compute basisvalues.
2388
basisvalues[0] = 1.00000000;
2389
basisvalues[1] = tmp0;
2390
for (unsigned int r = 0; r < 1; r++)
2392
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2393
ss = r*(r + 1)*(r + 2)/6;
2394
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2395
}// end loop over 'r'
2396
for (unsigned int r = 0; r < 1; r++)
2398
for (unsigned int s = 0; s < 1 - r; s++)
2400
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2401
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2402
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2403
}// end loop over 's'
2404
}// end loop over 'r'
2405
for (unsigned int r = 0; r < 2; r++)
2407
for (unsigned int s = 0; s < 2 - r; s++)
2409
for (unsigned int t = 0; t < 2 - r - s; t++)
2411
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2412
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2413
}// end loop over 't'
2414
}// end loop over 's'
2415
}// end loop over 'r'
2417
// Table(s) of coefficients.
2418
static const double coefficients0[4] = \
2419
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
2421
// Compute value(s).
2422
for (unsigned int r = 0; r < 4; r++)
2424
values[2] += coefficients0[r]*basisvalues[r];
2425
}// end loop over 'r'
2431
// Array of basisvalues.
2432
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2434
// Declare helper variables.
2435
unsigned int rr = 0;
2436
unsigned int ss = 0;
2437
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2439
// Compute basisvalues.
2440
basisvalues[0] = 1.00000000;
2441
basisvalues[1] = tmp0;
2442
for (unsigned int r = 0; r < 1; r++)
2444
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2445
ss = r*(r + 1)*(r + 2)/6;
2446
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2447
}// end loop over 'r'
2448
for (unsigned int r = 0; r < 1; r++)
2450
for (unsigned int s = 0; s < 1 - r; s++)
2452
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2453
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2454
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2455
}// end loop over 's'
2456
}// end loop over 'r'
2457
for (unsigned int r = 0; r < 2; r++)
2459
for (unsigned int s = 0; s < 2 - r; s++)
2461
for (unsigned int t = 0; t < 2 - r - s; t++)
2463
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2464
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2465
}// end loop over 't'
2466
}// end loop over 's'
2467
}// end loop over 'r'
2469
// Table(s) of coefficients.
2470
static const double coefficients0[4] = \
2471
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
2473
// Compute value(s).
2474
for (unsigned int r = 0; r < 4; r++)
2476
values[2] += coefficients0[r]*basisvalues[r];
2477
}// end loop over 'r'
2483
// Array of basisvalues.
2484
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2486
// Declare helper variables.
2487
unsigned int rr = 0;
2488
unsigned int ss = 0;
2489
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2491
// Compute basisvalues.
2492
basisvalues[0] = 1.00000000;
2493
basisvalues[1] = tmp0;
2494
for (unsigned int r = 0; r < 1; r++)
2496
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2497
ss = r*(r + 1)*(r + 2)/6;
2498
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2499
}// end loop over 'r'
2500
for (unsigned int r = 0; r < 1; r++)
2502
for (unsigned int s = 0; s < 1 - r; s++)
2504
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2505
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2506
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2507
}// end loop over 's'
2508
}// end loop over 'r'
2509
for (unsigned int r = 0; r < 2; r++)
2511
for (unsigned int s = 0; s < 2 - r; s++)
2513
for (unsigned int t = 0; t < 2 - r - s; t++)
2515
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2516
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2517
}// end loop over 't'
2518
}// end loop over 's'
2519
}// end loop over 'r'
2521
// Table(s) of coefficients.
2522
static const double coefficients0[4] = \
2523
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
2525
// Compute value(s).
2526
for (unsigned int r = 0; r < 4; r++)
2528
values[2] += coefficients0[r]*basisvalues[r];
2529
}// end loop over 'r'
2535
// Array of basisvalues.
2536
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2538
// Declare helper variables.
2539
unsigned int rr = 0;
2540
unsigned int ss = 0;
2541
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2543
// Compute basisvalues.
2544
basisvalues[0] = 1.00000000;
2545
basisvalues[1] = tmp0;
2546
for (unsigned int r = 0; r < 1; r++)
2548
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2549
ss = r*(r + 1)*(r + 2)/6;
2550
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2551
}// end loop over 'r'
2552
for (unsigned int r = 0; r < 1; r++)
2554
for (unsigned int s = 0; s < 1 - r; s++)
2556
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2557
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2558
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2559
}// end loop over 's'
2560
}// end loop over 'r'
2561
for (unsigned int r = 0; r < 2; r++)
2563
for (unsigned int s = 0; s < 2 - r; s++)
2565
for (unsigned int t = 0; t < 2 - r - s; t++)
2567
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2568
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2569
}// end loop over 't'
2570
}// end loop over 's'
2571
}// end loop over 'r'
2573
// Table(s) of coefficients.
2574
static const double coefficients0[4] = \
2575
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
2577
// Compute value(s).
2578
for (unsigned int r = 0; r < 4; r++)
2580
values[2] += coefficients0[r]*basisvalues[r];
2581
}// end loop over 'r'
1530
2725
values[r] = 0.00000000;
1531
2726
}// end loop over 'r'
1533
if (0 <= i && i <= 3)
1535
// Map degree of freedom to element degree of freedom
1536
const unsigned int dof = i;
1538
// Array of basisvalues.
1539
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1541
// Declare helper variables.
1542
unsigned int rr = 0;
1543
unsigned int ss = 0;
1544
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1546
// Compute basisvalues.
1547
basisvalues[0] = 1.00000000;
1548
basisvalues[1] = tmp0;
1549
for (unsigned int r = 0; r < 1; r++)
1551
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1552
ss = r*(r + 1)*(r + 2)/6;
1553
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1554
}// end loop over 'r'
1555
for (unsigned int r = 0; r < 1; r++)
1557
for (unsigned int s = 0; s < 1 - r; s++)
1559
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1560
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1561
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1562
}// end loop over 's'
1563
}// end loop over 'r'
1564
for (unsigned int r = 0; r < 2; r++)
1566
for (unsigned int s = 0; s < 2 - r; s++)
1568
for (unsigned int t = 0; t < 2 - r - s; t++)
1570
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1571
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1572
}// end loop over 't'
1573
}// end loop over 's'
1574
}// end loop over 'r'
1576
// Table(s) of coefficients.
1577
static const double coefficients0[4][4] = \
1578
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
1579
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
1580
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
1581
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
1583
// Tables of derivatives of the polynomial base (transpose).
1584
static const double dmats0[4][4] = \
1585
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1586
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
1587
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1588
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1590
static const double dmats1[4][4] = \
1591
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1592
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1593
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
1594
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1596
static const double dmats2[4][4] = \
1597
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1598
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1599
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
1600
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
1602
// Compute reference derivatives.
1603
// Declare pointer to array of derivatives on FIAT element.
1604
double *derivatives = new double[num_derivatives];
1605
for (unsigned int r = 0; r < num_derivatives; r++)
1607
derivatives[r] = 0.00000000;
1608
}// end loop over 'r'
1610
// Declare derivative matrix (of polynomial basis).
1611
double dmats[4][4] = \
1612
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1613
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1614
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1615
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1617
// Declare (auxiliary) derivative matrix (of polynomial basis).
1618
double dmats_old[4][4] = \
1619
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1620
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1621
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1622
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1624
// Loop possible derivatives.
1625
for (unsigned int r = 0; r < num_derivatives; r++)
1627
// Resetting dmats values to compute next derivative.
1628
for (unsigned int t = 0; t < 4; t++)
1630
for (unsigned int u = 0; u < 4; u++)
1632
dmats[t][u] = 0.00000000;
1635
dmats[t][u] = 1.00000000;
1638
}// end loop over 'u'
1639
}// end loop over 't'
1641
// Looping derivative order to generate dmats.
1642
for (unsigned int s = 0; s < n; s++)
1644
// Updating dmats_old with new values and resetting dmats.
1645
for (unsigned int t = 0; t < 4; t++)
1647
for (unsigned int u = 0; u < 4; u++)
1649
dmats_old[t][u] = dmats[t][u];
1650
dmats[t][u] = 0.00000000;
1651
}// end loop over 'u'
1652
}// end loop over 't'
1654
// Update dmats using an inner product.
1655
if (combinations[r][s] == 0)
1657
for (unsigned int t = 0; t < 4; t++)
1659
for (unsigned int u = 0; u < 4; u++)
1661
for (unsigned int tu = 0; tu < 4; tu++)
1663
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1664
}// end loop over 'tu'
1665
}// end loop over 'u'
1666
}// end loop over 't'
1669
if (combinations[r][s] == 1)
1671
for (unsigned int t = 0; t < 4; t++)
1673
for (unsigned int u = 0; u < 4; u++)
1675
for (unsigned int tu = 0; tu < 4; tu++)
1677
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1678
}// end loop over 'tu'
1679
}// end loop over 'u'
1680
}// end loop over 't'
1683
if (combinations[r][s] == 2)
1685
for (unsigned int t = 0; t < 4; t++)
1687
for (unsigned int u = 0; u < 4; u++)
1689
for (unsigned int tu = 0; tu < 4; tu++)
1691
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1692
}// end loop over 'tu'
1693
}// end loop over 'u'
1694
}// end loop over 't'
1697
}// end loop over 's'
1698
for (unsigned int s = 0; s < 4; s++)
1700
for (unsigned int t = 0; t < 4; t++)
1702
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
1703
}// end loop over 't'
1704
}// end loop over 's'
1705
}// end loop over 'r'
1707
// Transform derivatives back to physical element
1708
for (unsigned int r = 0; r < num_derivatives; r++)
1710
for (unsigned int s = 0; s < num_derivatives; s++)
1712
values[r] += transform[r][s]*derivatives[s];
1713
}// end loop over 's'
1714
}// end loop over 'r'
1716
// Delete pointer to array of derivatives on FIAT element
1717
delete [] derivatives;
1719
// Delete pointer to array of combinations of derivatives and transform
1720
for (unsigned int r = 0; r < num_derivatives; r++)
1722
delete [] combinations[r];
1723
}// end loop over 'r'
1724
delete [] combinations;
1725
for (unsigned int r = 0; r < num_derivatives; r++)
1727
delete [] transform[r];
1728
}// end loop over 'r'
1729
delete [] transform;
1732
if (4 <= i && i <= 7)
1734
// Map degree of freedom to element degree of freedom
1735
const unsigned int dof = i - 4;
1737
// Array of basisvalues.
1738
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1740
// Declare helper variables.
1741
unsigned int rr = 0;
1742
unsigned int ss = 0;
1743
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1745
// Compute basisvalues.
1746
basisvalues[0] = 1.00000000;
1747
basisvalues[1] = tmp0;
1748
for (unsigned int r = 0; r < 1; r++)
1750
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1751
ss = r*(r + 1)*(r + 2)/6;
1752
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1753
}// end loop over 'r'
1754
for (unsigned int r = 0; r < 1; r++)
1756
for (unsigned int s = 0; s < 1 - r; s++)
1758
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1759
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1760
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1761
}// end loop over 's'
1762
}// end loop over 'r'
1763
for (unsigned int r = 0; r < 2; r++)
1765
for (unsigned int s = 0; s < 2 - r; s++)
1767
for (unsigned int t = 0; t < 2 - r - s; t++)
1769
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1770
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1771
}// end loop over 't'
1772
}// end loop over 's'
1773
}// end loop over 'r'
1775
// Table(s) of coefficients.
1776
static const double coefficients0[4][4] = \
1777
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
1778
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
1779
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
1780
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
1782
// Tables of derivatives of the polynomial base (transpose).
1783
static const double dmats0[4][4] = \
1784
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1785
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
1786
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1787
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1789
static const double dmats1[4][4] = \
1790
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1791
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1792
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
1793
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1795
static const double dmats2[4][4] = \
1796
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1797
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1798
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
1799
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
1801
// Compute reference derivatives.
1802
// Declare pointer to array of derivatives on FIAT element.
1803
double *derivatives = new double[num_derivatives];
1804
for (unsigned int r = 0; r < num_derivatives; r++)
1806
derivatives[r] = 0.00000000;
1807
}// end loop over 'r'
1809
// Declare derivative matrix (of polynomial basis).
1810
double dmats[4][4] = \
1811
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1812
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1813
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1814
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1816
// Declare (auxiliary) derivative matrix (of polynomial basis).
1817
double dmats_old[4][4] = \
1818
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1819
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1820
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1821
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1823
// Loop possible derivatives.
1824
for (unsigned int r = 0; r < num_derivatives; r++)
1826
// Resetting dmats values to compute next derivative.
1827
for (unsigned int t = 0; t < 4; t++)
1829
for (unsigned int u = 0; u < 4; u++)
1831
dmats[t][u] = 0.00000000;
1834
dmats[t][u] = 1.00000000;
1837
}// end loop over 'u'
1838
}// end loop over 't'
1840
// Looping derivative order to generate dmats.
1841
for (unsigned int s = 0; s < n; s++)
1843
// Updating dmats_old with new values and resetting dmats.
1844
for (unsigned int t = 0; t < 4; t++)
1846
for (unsigned int u = 0; u < 4; u++)
1848
dmats_old[t][u] = dmats[t][u];
1849
dmats[t][u] = 0.00000000;
1850
}// end loop over 'u'
1851
}// end loop over 't'
1853
// Update dmats using an inner product.
1854
if (combinations[r][s] == 0)
1856
for (unsigned int t = 0; t < 4; t++)
1858
for (unsigned int u = 0; u < 4; u++)
1860
for (unsigned int tu = 0; tu < 4; tu++)
1862
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1863
}// end loop over 'tu'
1864
}// end loop over 'u'
1865
}// end loop over 't'
1868
if (combinations[r][s] == 1)
1870
for (unsigned int t = 0; t < 4; t++)
1872
for (unsigned int u = 0; u < 4; u++)
1874
for (unsigned int tu = 0; tu < 4; tu++)
1876
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1877
}// end loop over 'tu'
1878
}// end loop over 'u'
1879
}// end loop over 't'
1882
if (combinations[r][s] == 2)
1884
for (unsigned int t = 0; t < 4; t++)
1886
for (unsigned int u = 0; u < 4; u++)
1888
for (unsigned int tu = 0; tu < 4; tu++)
1890
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1891
}// end loop over 'tu'
1892
}// end loop over 'u'
1893
}// end loop over 't'
1896
}// end loop over 's'
1897
for (unsigned int s = 0; s < 4; s++)
1899
for (unsigned int t = 0; t < 4; t++)
1901
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
1902
}// end loop over 't'
1903
}// end loop over 's'
1904
}// end loop over 'r'
1906
// Transform derivatives back to physical element
1907
for (unsigned int r = 0; r < num_derivatives; r++)
1909
for (unsigned int s = 0; s < num_derivatives; s++)
1911
values[num_derivatives + r] += transform[r][s]*derivatives[s];
1912
}// end loop over 's'
1913
}// end loop over 'r'
1915
// Delete pointer to array of derivatives on FIAT element
1916
delete [] derivatives;
1918
// Delete pointer to array of combinations of derivatives and transform
1919
for (unsigned int r = 0; r < num_derivatives; r++)
1921
delete [] combinations[r];
1922
}// end loop over 'r'
1923
delete [] combinations;
1924
for (unsigned int r = 0; r < num_derivatives; r++)
1926
delete [] transform[r];
1927
}// end loop over 'r'
1928
delete [] transform;
1931
if (8 <= i && i <= 11)
1933
// Map degree of freedom to element degree of freedom
1934
const unsigned int dof = i - 8;
1936
// Array of basisvalues.
1937
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1939
// Declare helper variables.
1940
unsigned int rr = 0;
1941
unsigned int ss = 0;
1942
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1944
// Compute basisvalues.
1945
basisvalues[0] = 1.00000000;
1946
basisvalues[1] = tmp0;
1947
for (unsigned int r = 0; r < 1; r++)
1949
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1950
ss = r*(r + 1)*(r + 2)/6;
1951
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1952
}// end loop over 'r'
1953
for (unsigned int r = 0; r < 1; r++)
1955
for (unsigned int s = 0; s < 1 - r; s++)
1957
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1958
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1959
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1960
}// end loop over 's'
1961
}// end loop over 'r'
1962
for (unsigned int r = 0; r < 2; r++)
1964
for (unsigned int s = 0; s < 2 - r; s++)
1966
for (unsigned int t = 0; t < 2 - r - s; t++)
1968
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1969
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1970
}// end loop over 't'
1971
}// end loop over 's'
1972
}// end loop over 'r'
1974
// Table(s) of coefficients.
1975
static const double coefficients0[4][4] = \
1976
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
1977
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
1978
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
1979
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
1981
// Tables of derivatives of the polynomial base (transpose).
1982
static const double dmats0[4][4] = \
1983
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1984
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
1985
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1986
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1988
static const double dmats1[4][4] = \
1989
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1990
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1991
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
1992
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1994
static const double dmats2[4][4] = \
1995
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1996
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1997
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
1998
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
2000
// Compute reference derivatives.
2001
// Declare pointer to array of derivatives on FIAT element.
2002
double *derivatives = new double[num_derivatives];
2003
for (unsigned int r = 0; r < num_derivatives; r++)
2005
derivatives[r] = 0.00000000;
2006
}// end loop over 'r'
2008
// Declare derivative matrix (of polynomial basis).
2009
double dmats[4][4] = \
2010
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
2011
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
2012
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
2013
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2015
// Declare (auxiliary) derivative matrix (of polynomial basis).
2016
double dmats_old[4][4] = \
2017
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
2018
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
2019
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
2020
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2022
// Loop possible derivatives.
2023
for (unsigned int r = 0; r < num_derivatives; r++)
2025
// Resetting dmats values to compute next derivative.
2026
for (unsigned int t = 0; t < 4; t++)
2028
for (unsigned int u = 0; u < 4; u++)
2030
dmats[t][u] = 0.00000000;
2033
dmats[t][u] = 1.00000000;
2036
}// end loop over 'u'
2037
}// end loop over 't'
2039
// Looping derivative order to generate dmats.
2040
for (unsigned int s = 0; s < n; s++)
2042
// Updating dmats_old with new values and resetting dmats.
2043
for (unsigned int t = 0; t < 4; t++)
2045
for (unsigned int u = 0; u < 4; u++)
2047
dmats_old[t][u] = dmats[t][u];
2048
dmats[t][u] = 0.00000000;
2049
}// end loop over 'u'
2050
}// end loop over 't'
2052
// Update dmats using an inner product.
2053
if (combinations[r][s] == 0)
2055
for (unsigned int t = 0; t < 4; t++)
2057
for (unsigned int u = 0; u < 4; u++)
2059
for (unsigned int tu = 0; tu < 4; tu++)
2061
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2062
}// end loop over 'tu'
2063
}// end loop over 'u'
2064
}// end loop over 't'
2067
if (combinations[r][s] == 1)
2069
for (unsigned int t = 0; t < 4; t++)
2071
for (unsigned int u = 0; u < 4; u++)
2073
for (unsigned int tu = 0; tu < 4; tu++)
2075
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2076
}// end loop over 'tu'
2077
}// end loop over 'u'
2078
}// end loop over 't'
2081
if (combinations[r][s] == 2)
2083
for (unsigned int t = 0; t < 4; t++)
2085
for (unsigned int u = 0; u < 4; u++)
2087
for (unsigned int tu = 0; tu < 4; tu++)
2089
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2090
}// end loop over 'tu'
2091
}// end loop over 'u'
2092
}// end loop over 't'
2095
}// end loop over 's'
2096
for (unsigned int s = 0; s < 4; s++)
2098
for (unsigned int t = 0; t < 4; t++)
2100
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
2101
}// end loop over 't'
2102
}// end loop over 's'
2103
}// end loop over 'r'
2105
// Transform derivatives back to physical element
2106
for (unsigned int r = 0; r < num_derivatives; r++)
2108
for (unsigned int s = 0; s < num_derivatives; s++)
2110
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
2111
}// end loop over 's'
2112
}// end loop over 'r'
2114
// Delete pointer to array of derivatives on FIAT element
2115
delete [] derivatives;
2117
// Delete pointer to array of combinations of derivatives and transform
2118
for (unsigned int r = 0; r < num_derivatives; r++)
2120
delete [] combinations[r];
2121
}// end loop over 'r'
2122
delete [] combinations;
2123
for (unsigned int r = 0; r < num_derivatives; r++)
2125
delete [] transform[r];
2126
}// end loop over 'r'
2127
delete [] transform;
2733
// Array of basisvalues.
2734
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2736
// Declare helper variables.
2737
unsigned int rr = 0;
2738
unsigned int ss = 0;
2739
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2741
// Compute basisvalues.
2742
basisvalues[0] = 1.00000000;
2743
basisvalues[1] = tmp0;
2744
for (unsigned int r = 0; r < 1; r++)
2746
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2747
ss = r*(r + 1)*(r + 2)/6;
2748
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2749
}// end loop over 'r'
2750
for (unsigned int r = 0; r < 1; r++)
2752
for (unsigned int s = 0; s < 1 - r; s++)
2754
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2755
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2756
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2757
}// end loop over 's'
2758
}// end loop over 'r'
2759
for (unsigned int r = 0; r < 2; r++)
2761
for (unsigned int s = 0; s < 2 - r; s++)
2763
for (unsigned int t = 0; t < 2 - r - s; t++)
2765
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2766
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2767
}// end loop over 't'
2768
}// end loop over 's'
2769
}// end loop over 'r'
2771
// Table(s) of coefficients.
2772
static const double coefficients0[4] = \
2773
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
2775
// Tables of derivatives of the polynomial base (transpose).
2776
static const double dmats0[4][4] = \
2777
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
2778
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
2779
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
2780
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2782
static const double dmats1[4][4] = \
2783
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
2784
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
2785
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
2786
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2788
static const double dmats2[4][4] = \
2789
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
2790
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
2791
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
2792
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
2794
// Compute reference derivatives.
2795
// Declare pointer to array of derivatives on FIAT element.
2796
double *derivatives = new double[num_derivatives];
2797
for (unsigned int r = 0; r < num_derivatives; r++)
2799
derivatives[r] = 0.00000000;
2800
}// end loop over 'r'
2802
// Declare derivative matrix (of polynomial basis).
2803
double dmats[4][4] = \
2804
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
2805
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
2806
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
2807
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2809
// Declare (auxiliary) derivative matrix (of polynomial basis).
2810
double dmats_old[4][4] = \
2811
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
2812
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
2813
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
2814
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2816
// Loop possible derivatives.
2817
for (unsigned int r = 0; r < num_derivatives; r++)
2819
// Resetting dmats values to compute next derivative.
2820
for (unsigned int t = 0; t < 4; t++)
2822
for (unsigned int u = 0; u < 4; u++)
2824
dmats[t][u] = 0.00000000;
2827
dmats[t][u] = 1.00000000;
2830
}// end loop over 'u'
2831
}// end loop over 't'
2833
// Looping derivative order to generate dmats.
2834
for (unsigned int s = 0; s < n; s++)
2836
// Updating dmats_old with new values and resetting dmats.
2837
for (unsigned int t = 0; t < 4; t++)
2839
for (unsigned int u = 0; u < 4; u++)
2841
dmats_old[t][u] = dmats[t][u];
2842
dmats[t][u] = 0.00000000;
2843
}// end loop over 'u'
2844
}// end loop over 't'
2846
// Update dmats using an inner product.
2847
if (combinations[r][s] == 0)
2849
for (unsigned int t = 0; t < 4; t++)
2851
for (unsigned int u = 0; u < 4; u++)
2853
for (unsigned int tu = 0; tu < 4; tu++)
2855
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2856
}// end loop over 'tu'
2857
}// end loop over 'u'
2858
}// end loop over 't'
2861
if (combinations[r][s] == 1)
2863
for (unsigned int t = 0; t < 4; t++)
2865
for (unsigned int u = 0; u < 4; u++)
2867
for (unsigned int tu = 0; tu < 4; tu++)
2869
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2870
}// end loop over 'tu'
2871
}// end loop over 'u'
2872
}// end loop over 't'
2875
if (combinations[r][s] == 2)
2877
for (unsigned int t = 0; t < 4; t++)
2879
for (unsigned int u = 0; u < 4; u++)
2881
for (unsigned int tu = 0; tu < 4; tu++)
2883
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2884
}// end loop over 'tu'
2885
}// end loop over 'u'
2886
}// end loop over 't'
2889
}// end loop over 's'
2890
for (unsigned int s = 0; s < 4; s++)
2892
for (unsigned int t = 0; t < 4; t++)
2894
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2895
}// end loop over 't'
2896
}// end loop over 's'
2897
}// end loop over 'r'
2899
// Transform derivatives back to physical element
2900
for (unsigned int r = 0; r < num_derivatives; r++)
2902
for (unsigned int s = 0; s < num_derivatives; s++)
2904
values[r] += transform[r][s]*derivatives[s];
2905
}// end loop over 's'
2906
}// end loop over 'r'
2908
// Delete pointer to array of derivatives on FIAT element
2909
delete [] derivatives;
2911
// Delete pointer to array of combinations of derivatives and transform
2912
for (unsigned int r = 0; r < num_derivatives; r++)
2914
delete [] combinations[r];
2915
}// end loop over 'r'
2916
delete [] combinations;
2917
for (unsigned int r = 0; r < num_derivatives; r++)
2919
delete [] transform[r];
2920
}// end loop over 'r'
2921
delete [] transform;
2927
// Array of basisvalues.
2928
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2930
// Declare helper variables.
2931
unsigned int rr = 0;
2932
unsigned int ss = 0;
2933
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2935
// Compute basisvalues.
2936
basisvalues[0] = 1.00000000;
2937
basisvalues[1] = tmp0;
2938
for (unsigned int r = 0; r < 1; r++)
2940
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2941
ss = r*(r + 1)*(r + 2)/6;
2942
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2943
}// end loop over 'r'
2944
for (unsigned int r = 0; r < 1; r++)
2946
for (unsigned int s = 0; s < 1 - r; s++)
2948
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2949
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2950
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2951
}// end loop over 's'
2952
}// end loop over 'r'
2953
for (unsigned int r = 0; r < 2; r++)
2955
for (unsigned int s = 0; s < 2 - r; s++)
2957
for (unsigned int t = 0; t < 2 - r - s; t++)
2959
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2960
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2961
}// end loop over 't'
2962
}// end loop over 's'
2963
}// end loop over 'r'
2965
// Table(s) of coefficients.
2966
static const double coefficients0[4] = \
2967
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
2969
// Tables of derivatives of the polynomial base (transpose).
2970
static const double dmats0[4][4] = \
2971
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
2972
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
2973
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
2974
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2976
static const double dmats1[4][4] = \
2977
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
2978
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
2979
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
2980
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2982
static const double dmats2[4][4] = \
2983
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
2984
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
2985
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
2986
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
2988
// Compute reference derivatives.
2989
// Declare pointer to array of derivatives on FIAT element.
2990
double *derivatives = new double[num_derivatives];
2991
for (unsigned int r = 0; r < num_derivatives; r++)
2993
derivatives[r] = 0.00000000;
2994
}// end loop over 'r'
2996
// Declare derivative matrix (of polynomial basis).
2997
double dmats[4][4] = \
2998
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
2999
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3000
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3001
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3003
// Declare (auxiliary) derivative matrix (of polynomial basis).
3004
double dmats_old[4][4] = \
3005
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3006
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3007
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3008
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3010
// Loop possible derivatives.
3011
for (unsigned int r = 0; r < num_derivatives; r++)
3013
// Resetting dmats values to compute next derivative.
3014
for (unsigned int t = 0; t < 4; t++)
3016
for (unsigned int u = 0; u < 4; u++)
3018
dmats[t][u] = 0.00000000;
3021
dmats[t][u] = 1.00000000;
3024
}// end loop over 'u'
3025
}// end loop over 't'
3027
// Looping derivative order to generate dmats.
3028
for (unsigned int s = 0; s < n; s++)
3030
// Updating dmats_old with new values and resetting dmats.
3031
for (unsigned int t = 0; t < 4; t++)
3033
for (unsigned int u = 0; u < 4; u++)
3035
dmats_old[t][u] = dmats[t][u];
3036
dmats[t][u] = 0.00000000;
3037
}// end loop over 'u'
3038
}// end loop over 't'
3040
// Update dmats using an inner product.
3041
if (combinations[r][s] == 0)
3043
for (unsigned int t = 0; t < 4; t++)
3045
for (unsigned int u = 0; u < 4; u++)
3047
for (unsigned int tu = 0; tu < 4; tu++)
3049
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3050
}// end loop over 'tu'
3051
}// end loop over 'u'
3052
}// end loop over 't'
3055
if (combinations[r][s] == 1)
3057
for (unsigned int t = 0; t < 4; t++)
3059
for (unsigned int u = 0; u < 4; u++)
3061
for (unsigned int tu = 0; tu < 4; tu++)
3063
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3064
}// end loop over 'tu'
3065
}// end loop over 'u'
3066
}// end loop over 't'
3069
if (combinations[r][s] == 2)
3071
for (unsigned int t = 0; t < 4; t++)
3073
for (unsigned int u = 0; u < 4; u++)
3075
for (unsigned int tu = 0; tu < 4; tu++)
3077
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3078
}// end loop over 'tu'
3079
}// end loop over 'u'
3080
}// end loop over 't'
3083
}// end loop over 's'
3084
for (unsigned int s = 0; s < 4; s++)
3086
for (unsigned int t = 0; t < 4; t++)
3088
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3089
}// end loop over 't'
3090
}// end loop over 's'
3091
}// end loop over 'r'
3093
// Transform derivatives back to physical element
3094
for (unsigned int r = 0; r < num_derivatives; r++)
3096
for (unsigned int s = 0; s < num_derivatives; s++)
3098
values[r] += transform[r][s]*derivatives[s];
3099
}// end loop over 's'
3100
}// end loop over 'r'
3102
// Delete pointer to array of derivatives on FIAT element
3103
delete [] derivatives;
3105
// Delete pointer to array of combinations of derivatives and transform
3106
for (unsigned int r = 0; r < num_derivatives; r++)
3108
delete [] combinations[r];
3109
}// end loop over 'r'
3110
delete [] combinations;
3111
for (unsigned int r = 0; r < num_derivatives; r++)
3113
delete [] transform[r];
3114
}// end loop over 'r'
3115
delete [] transform;
3121
// Array of basisvalues.
3122
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
3124
// Declare helper variables.
3125
unsigned int rr = 0;
3126
unsigned int ss = 0;
3127
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3129
// Compute basisvalues.
3130
basisvalues[0] = 1.00000000;
3131
basisvalues[1] = tmp0;
3132
for (unsigned int r = 0; r < 1; r++)
3134
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3135
ss = r*(r + 1)*(r + 2)/6;
3136
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3137
}// end loop over 'r'
3138
for (unsigned int r = 0; r < 1; r++)
3140
for (unsigned int s = 0; s < 1 - r; s++)
3142
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3143
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3144
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3145
}// end loop over 's'
3146
}// end loop over 'r'
3147
for (unsigned int r = 0; r < 2; r++)
3149
for (unsigned int s = 0; s < 2 - r; s++)
3151
for (unsigned int t = 0; t < 2 - r - s; t++)
3153
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3154
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3155
}// end loop over 't'
3156
}// end loop over 's'
3157
}// end loop over 'r'
3159
// Table(s) of coefficients.
3160
static const double coefficients0[4] = \
3161
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
3163
// Tables of derivatives of the polynomial base (transpose).
3164
static const double dmats0[4][4] = \
3165
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3166
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
3167
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3168
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3170
static const double dmats1[4][4] = \
3171
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3172
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3173
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
3174
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3176
static const double dmats2[4][4] = \
3177
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3178
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3179
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
3180
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
3182
// Compute reference derivatives.
3183
// Declare pointer to array of derivatives on FIAT element.
3184
double *derivatives = new double[num_derivatives];
3185
for (unsigned int r = 0; r < num_derivatives; r++)
3187
derivatives[r] = 0.00000000;
3188
}// end loop over 'r'
3190
// Declare derivative matrix (of polynomial basis).
3191
double dmats[4][4] = \
3192
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3193
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3194
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3195
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3197
// Declare (auxiliary) derivative matrix (of polynomial basis).
3198
double dmats_old[4][4] = \
3199
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3200
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3201
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3202
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3204
// Loop possible derivatives.
3205
for (unsigned int r = 0; r < num_derivatives; r++)
3207
// Resetting dmats values to compute next derivative.
3208
for (unsigned int t = 0; t < 4; t++)
3210
for (unsigned int u = 0; u < 4; u++)
3212
dmats[t][u] = 0.00000000;
3215
dmats[t][u] = 1.00000000;
3218
}// end loop over 'u'
3219
}// end loop over 't'
3221
// Looping derivative order to generate dmats.
3222
for (unsigned int s = 0; s < n; s++)
3224
// Updating dmats_old with new values and resetting dmats.
3225
for (unsigned int t = 0; t < 4; t++)
3227
for (unsigned int u = 0; u < 4; u++)
3229
dmats_old[t][u] = dmats[t][u];
3230
dmats[t][u] = 0.00000000;
3231
}// end loop over 'u'
3232
}// end loop over 't'
3234
// Update dmats using an inner product.
3235
if (combinations[r][s] == 0)
3237
for (unsigned int t = 0; t < 4; t++)
3239
for (unsigned int u = 0; u < 4; u++)
3241
for (unsigned int tu = 0; tu < 4; tu++)
3243
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3244
}// end loop over 'tu'
3245
}// end loop over 'u'
3246
}// end loop over 't'
3249
if (combinations[r][s] == 1)
3251
for (unsigned int t = 0; t < 4; t++)
3253
for (unsigned int u = 0; u < 4; u++)
3255
for (unsigned int tu = 0; tu < 4; tu++)
3257
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3258
}// end loop over 'tu'
3259
}// end loop over 'u'
3260
}// end loop over 't'
3263
if (combinations[r][s] == 2)
3265
for (unsigned int t = 0; t < 4; t++)
3267
for (unsigned int u = 0; u < 4; u++)
3269
for (unsigned int tu = 0; tu < 4; tu++)
3271
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3272
}// end loop over 'tu'
3273
}// end loop over 'u'
3274
}// end loop over 't'
3277
}// end loop over 's'
3278
for (unsigned int s = 0; s < 4; s++)
3280
for (unsigned int t = 0; t < 4; t++)
3282
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3283
}// end loop over 't'
3284
}// end loop over 's'
3285
}// end loop over 'r'
3287
// Transform derivatives back to physical element
3288
for (unsigned int r = 0; r < num_derivatives; r++)
3290
for (unsigned int s = 0; s < num_derivatives; s++)
3292
values[r] += transform[r][s]*derivatives[s];
3293
}// end loop over 's'
3294
}// end loop over 'r'
3296
// Delete pointer to array of derivatives on FIAT element
3297
delete [] derivatives;
3299
// Delete pointer to array of combinations of derivatives and transform
3300
for (unsigned int r = 0; r < num_derivatives; r++)
3302
delete [] combinations[r];
3303
}// end loop over 'r'
3304
delete [] combinations;
3305
for (unsigned int r = 0; r < num_derivatives; r++)
3307
delete [] transform[r];
3308
}// end loop over 'r'
3309
delete [] transform;
3315
// Array of basisvalues.
3316
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
3318
// Declare helper variables.
3319
unsigned int rr = 0;
3320
unsigned int ss = 0;
3321
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3323
// Compute basisvalues.
3324
basisvalues[0] = 1.00000000;
3325
basisvalues[1] = tmp0;
3326
for (unsigned int r = 0; r < 1; r++)
3328
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3329
ss = r*(r + 1)*(r + 2)/6;
3330
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3331
}// end loop over 'r'
3332
for (unsigned int r = 0; r < 1; r++)
3334
for (unsigned int s = 0; s < 1 - r; s++)
3336
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3337
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3338
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3339
}// end loop over 's'
3340
}// end loop over 'r'
3341
for (unsigned int r = 0; r < 2; r++)
3343
for (unsigned int s = 0; s < 2 - r; s++)
3345
for (unsigned int t = 0; t < 2 - r - s; t++)
3347
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3348
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3349
}// end loop over 't'
3350
}// end loop over 's'
3351
}// end loop over 'r'
3353
// Table(s) of coefficients.
3354
static const double coefficients0[4] = \
3355
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
3357
// Tables of derivatives of the polynomial base (transpose).
3358
static const double dmats0[4][4] = \
3359
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3360
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
3361
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3362
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3364
static const double dmats1[4][4] = \
3365
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3366
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3367
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
3368
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3370
static const double dmats2[4][4] = \
3371
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3372
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3373
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
3374
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
3376
// Compute reference derivatives.
3377
// Declare pointer to array of derivatives on FIAT element.
3378
double *derivatives = new double[num_derivatives];
3379
for (unsigned int r = 0; r < num_derivatives; r++)
3381
derivatives[r] = 0.00000000;
3382
}// end loop over 'r'
3384
// Declare derivative matrix (of polynomial basis).
3385
double dmats[4][4] = \
3386
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3387
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3388
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3389
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3391
// Declare (auxiliary) derivative matrix (of polynomial basis).
3392
double dmats_old[4][4] = \
3393
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3394
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3395
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3396
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3398
// Loop possible derivatives.
3399
for (unsigned int r = 0; r < num_derivatives; r++)
3401
// Resetting dmats values to compute next derivative.
3402
for (unsigned int t = 0; t < 4; t++)
3404
for (unsigned int u = 0; u < 4; u++)
3406
dmats[t][u] = 0.00000000;
3409
dmats[t][u] = 1.00000000;
3412
}// end loop over 'u'
3413
}// end loop over 't'
3415
// Looping derivative order to generate dmats.
3416
for (unsigned int s = 0; s < n; s++)
3418
// Updating dmats_old with new values and resetting dmats.
3419
for (unsigned int t = 0; t < 4; t++)
3421
for (unsigned int u = 0; u < 4; u++)
3423
dmats_old[t][u] = dmats[t][u];
3424
dmats[t][u] = 0.00000000;
3425
}// end loop over 'u'
3426
}// end loop over 't'
3428
// Update dmats using an inner product.
3429
if (combinations[r][s] == 0)
3431
for (unsigned int t = 0; t < 4; t++)
3433
for (unsigned int u = 0; u < 4; u++)
3435
for (unsigned int tu = 0; tu < 4; tu++)
3437
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3438
}// end loop over 'tu'
3439
}// end loop over 'u'
3440
}// end loop over 't'
3443
if (combinations[r][s] == 1)
3445
for (unsigned int t = 0; t < 4; t++)
3447
for (unsigned int u = 0; u < 4; u++)
3449
for (unsigned int tu = 0; tu < 4; tu++)
3451
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3452
}// end loop over 'tu'
3453
}// end loop over 'u'
3454
}// end loop over 't'
3457
if (combinations[r][s] == 2)
3459
for (unsigned int t = 0; t < 4; t++)
3461
for (unsigned int u = 0; u < 4; u++)
3463
for (unsigned int tu = 0; tu < 4; tu++)
3465
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3466
}// end loop over 'tu'
3467
}// end loop over 'u'
3468
}// end loop over 't'
3471
}// end loop over 's'
3472
for (unsigned int s = 0; s < 4; s++)
3474
for (unsigned int t = 0; t < 4; t++)
3476
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3477
}// end loop over 't'
3478
}// end loop over 's'
3479
}// end loop over 'r'
3481
// Transform derivatives back to physical element
3482
for (unsigned int r = 0; r < num_derivatives; r++)
3484
for (unsigned int s = 0; s < num_derivatives; s++)
3486
values[r] += transform[r][s]*derivatives[s];
3487
}// end loop over 's'
3488
}// end loop over 'r'
3490
// Delete pointer to array of derivatives on FIAT element
3491
delete [] derivatives;
3493
// Delete pointer to array of combinations of derivatives and transform
3494
for (unsigned int r = 0; r < num_derivatives; r++)
3496
delete [] combinations[r];
3497
}// end loop over 'r'
3498
delete [] combinations;
3499
for (unsigned int r = 0; r < num_derivatives; r++)
3501
delete [] transform[r];
3502
}// end loop over 'r'
3503
delete [] transform;
3509
// Array of basisvalues.
3510
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
3512
// Declare helper variables.
3513
unsigned int rr = 0;
3514
unsigned int ss = 0;
3515
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3517
// Compute basisvalues.
3518
basisvalues[0] = 1.00000000;
3519
basisvalues[1] = tmp0;
3520
for (unsigned int r = 0; r < 1; r++)
3522
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3523
ss = r*(r + 1)*(r + 2)/6;
3524
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3525
}// end loop over 'r'
3526
for (unsigned int r = 0; r < 1; r++)
3528
for (unsigned int s = 0; s < 1 - r; s++)
3530
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3531
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3532
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3533
}// end loop over 's'
3534
}// end loop over 'r'
3535
for (unsigned int r = 0; r < 2; r++)
3537
for (unsigned int s = 0; s < 2 - r; s++)
3539
for (unsigned int t = 0; t < 2 - r - s; t++)
3541
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3542
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3543
}// end loop over 't'
3544
}// end loop over 's'
3545
}// end loop over 'r'
3547
// Table(s) of coefficients.
3548
static const double coefficients0[4] = \
3549
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
3551
// Tables of derivatives of the polynomial base (transpose).
3552
static const double dmats0[4][4] = \
3553
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3554
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
3555
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3556
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3558
static const double dmats1[4][4] = \
3559
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3560
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3561
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
3562
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3564
static const double dmats2[4][4] = \
3565
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3566
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3567
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
3568
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
3570
// Compute reference derivatives.
3571
// Declare pointer to array of derivatives on FIAT element.
3572
double *derivatives = new double[num_derivatives];
3573
for (unsigned int r = 0; r < num_derivatives; r++)
3575
derivatives[r] = 0.00000000;
3576
}// end loop over 'r'
3578
// Declare derivative matrix (of polynomial basis).
3579
double dmats[4][4] = \
3580
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3581
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3582
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3583
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3585
// Declare (auxiliary) derivative matrix (of polynomial basis).
3586
double dmats_old[4][4] = \
3587
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3588
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3589
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3590
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3592
// Loop possible derivatives.
3593
for (unsigned int r = 0; r < num_derivatives; r++)
3595
// Resetting dmats values to compute next derivative.
3596
for (unsigned int t = 0; t < 4; t++)
3598
for (unsigned int u = 0; u < 4; u++)
3600
dmats[t][u] = 0.00000000;
3603
dmats[t][u] = 1.00000000;
3606
}// end loop over 'u'
3607
}// end loop over 't'
3609
// Looping derivative order to generate dmats.
3610
for (unsigned int s = 0; s < n; s++)
3612
// Updating dmats_old with new values and resetting dmats.
3613
for (unsigned int t = 0; t < 4; t++)
3615
for (unsigned int u = 0; u < 4; u++)
3617
dmats_old[t][u] = dmats[t][u];
3618
dmats[t][u] = 0.00000000;
3619
}// end loop over 'u'
3620
}// end loop over 't'
3622
// Update dmats using an inner product.
3623
if (combinations[r][s] == 0)
3625
for (unsigned int t = 0; t < 4; t++)
3627
for (unsigned int u = 0; u < 4; u++)
3629
for (unsigned int tu = 0; tu < 4; tu++)
3631
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3632
}// end loop over 'tu'
3633
}// end loop over 'u'
3634
}// end loop over 't'
3637
if (combinations[r][s] == 1)
3639
for (unsigned int t = 0; t < 4; t++)
3641
for (unsigned int u = 0; u < 4; u++)
3643
for (unsigned int tu = 0; tu < 4; tu++)
3645
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3646
}// end loop over 'tu'
3647
}// end loop over 'u'
3648
}// end loop over 't'
3651
if (combinations[r][s] == 2)
3653
for (unsigned int t = 0; t < 4; t++)
3655
for (unsigned int u = 0; u < 4; u++)
3657
for (unsigned int tu = 0; tu < 4; tu++)
3659
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3660
}// end loop over 'tu'
3661
}// end loop over 'u'
3662
}// end loop over 't'
3665
}// end loop over 's'
3666
for (unsigned int s = 0; s < 4; s++)
3668
for (unsigned int t = 0; t < 4; t++)
3670
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3671
}// end loop over 't'
3672
}// end loop over 's'
3673
}// end loop over 'r'
3675
// Transform derivatives back to physical element
3676
for (unsigned int r = 0; r < num_derivatives; r++)
3678
for (unsigned int s = 0; s < num_derivatives; s++)
3680
values[num_derivatives + r] += transform[r][s]*derivatives[s];
3681
}// end loop over 's'
3682
}// end loop over 'r'
3684
// Delete pointer to array of derivatives on FIAT element
3685
delete [] derivatives;
3687
// Delete pointer to array of combinations of derivatives and transform
3688
for (unsigned int r = 0; r < num_derivatives; r++)
3690
delete [] combinations[r];
3691
}// end loop over 'r'
3692
delete [] combinations;
3693
for (unsigned int r = 0; r < num_derivatives; r++)
3695
delete [] transform[r];
3696
}// end loop over 'r'
3697
delete [] transform;
3703
// Array of basisvalues.
3704
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
3706
// Declare helper variables.
3707
unsigned int rr = 0;
3708
unsigned int ss = 0;
3709
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3711
// Compute basisvalues.
3712
basisvalues[0] = 1.00000000;
3713
basisvalues[1] = tmp0;
3714
for (unsigned int r = 0; r < 1; r++)
3716
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3717
ss = r*(r + 1)*(r + 2)/6;
3718
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3719
}// end loop over 'r'
3720
for (unsigned int r = 0; r < 1; r++)
3722
for (unsigned int s = 0; s < 1 - r; s++)
3724
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3725
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3726
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3727
}// end loop over 's'
3728
}// end loop over 'r'
3729
for (unsigned int r = 0; r < 2; r++)
3731
for (unsigned int s = 0; s < 2 - r; s++)
3733
for (unsigned int t = 0; t < 2 - r - s; t++)
3735
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3736
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3737
}// end loop over 't'
3738
}// end loop over 's'
3739
}// end loop over 'r'
3741
// Table(s) of coefficients.
3742
static const double coefficients0[4] = \
3743
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
3745
// Tables of derivatives of the polynomial base (transpose).
3746
static const double dmats0[4][4] = \
3747
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3748
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
3749
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3750
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3752
static const double dmats1[4][4] = \
3753
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3754
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3755
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
3756
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3758
static const double dmats2[4][4] = \
3759
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3760
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3761
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
3762
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
3764
// Compute reference derivatives.
3765
// Declare pointer to array of derivatives on FIAT element.
3766
double *derivatives = new double[num_derivatives];
3767
for (unsigned int r = 0; r < num_derivatives; r++)
3769
derivatives[r] = 0.00000000;
3770
}// end loop over 'r'
3772
// Declare derivative matrix (of polynomial basis).
3773
double dmats[4][4] = \
3774
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3775
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3776
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3777
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3779
// Declare (auxiliary) derivative matrix (of polynomial basis).
3780
double dmats_old[4][4] = \
3781
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3782
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3783
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3784
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3786
// Loop possible derivatives.
3787
for (unsigned int r = 0; r < num_derivatives; r++)
3789
// Resetting dmats values to compute next derivative.
3790
for (unsigned int t = 0; t < 4; t++)
3792
for (unsigned int u = 0; u < 4; u++)
3794
dmats[t][u] = 0.00000000;
3797
dmats[t][u] = 1.00000000;
3800
}// end loop over 'u'
3801
}// end loop over 't'
3803
// Looping derivative order to generate dmats.
3804
for (unsigned int s = 0; s < n; s++)
3806
// Updating dmats_old with new values and resetting dmats.
3807
for (unsigned int t = 0; t < 4; t++)
3809
for (unsigned int u = 0; u < 4; u++)
3811
dmats_old[t][u] = dmats[t][u];
3812
dmats[t][u] = 0.00000000;
3813
}// end loop over 'u'
3814
}// end loop over 't'
3816
// Update dmats using an inner product.
3817
if (combinations[r][s] == 0)
3819
for (unsigned int t = 0; t < 4; t++)
3821
for (unsigned int u = 0; u < 4; u++)
3823
for (unsigned int tu = 0; tu < 4; tu++)
3825
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3826
}// end loop over 'tu'
3827
}// end loop over 'u'
3828
}// end loop over 't'
3831
if (combinations[r][s] == 1)
3833
for (unsigned int t = 0; t < 4; t++)
3835
for (unsigned int u = 0; u < 4; u++)
3837
for (unsigned int tu = 0; tu < 4; tu++)
3839
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3840
}// end loop over 'tu'
3841
}// end loop over 'u'
3842
}// end loop over 't'
3845
if (combinations[r][s] == 2)
3847
for (unsigned int t = 0; t < 4; t++)
3849
for (unsigned int u = 0; u < 4; u++)
3851
for (unsigned int tu = 0; tu < 4; tu++)
3853
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3854
}// end loop over 'tu'
3855
}// end loop over 'u'
3856
}// end loop over 't'
3859
}// end loop over 's'
3860
for (unsigned int s = 0; s < 4; s++)
3862
for (unsigned int t = 0; t < 4; t++)
3864
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3865
}// end loop over 't'
3866
}// end loop over 's'
3867
}// end loop over 'r'
3869
// Transform derivatives back to physical element
3870
for (unsigned int r = 0; r < num_derivatives; r++)
3872
for (unsigned int s = 0; s < num_derivatives; s++)
3874
values[num_derivatives + r] += transform[r][s]*derivatives[s];
3875
}// end loop over 's'
3876
}// end loop over 'r'
3878
// Delete pointer to array of derivatives on FIAT element
3879
delete [] derivatives;
3881
// Delete pointer to array of combinations of derivatives and transform
3882
for (unsigned int r = 0; r < num_derivatives; r++)
3884
delete [] combinations[r];
3885
}// end loop over 'r'
3886
delete [] combinations;
3887
for (unsigned int r = 0; r < num_derivatives; r++)
3889
delete [] transform[r];
3890
}// end loop over 'r'
3891
delete [] transform;
3897
// Array of basisvalues.
3898
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
3900
// Declare helper variables.
3901
unsigned int rr = 0;
3902
unsigned int ss = 0;
3903
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3905
// Compute basisvalues.
3906
basisvalues[0] = 1.00000000;
3907
basisvalues[1] = tmp0;
3908
for (unsigned int r = 0; r < 1; r++)
3910
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3911
ss = r*(r + 1)*(r + 2)/6;
3912
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3913
}// end loop over 'r'
3914
for (unsigned int r = 0; r < 1; r++)
3916
for (unsigned int s = 0; s < 1 - r; s++)
3918
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3919
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3920
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3921
}// end loop over 's'
3922
}// end loop over 'r'
3923
for (unsigned int r = 0; r < 2; r++)
3925
for (unsigned int s = 0; s < 2 - r; s++)
3927
for (unsigned int t = 0; t < 2 - r - s; t++)
3929
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3930
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3931
}// end loop over 't'
3932
}// end loop over 's'
3933
}// end loop over 'r'
3935
// Table(s) of coefficients.
3936
static const double coefficients0[4] = \
3937
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
3939
// Tables of derivatives of the polynomial base (transpose).
3940
static const double dmats0[4][4] = \
3941
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3942
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
3943
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3944
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3946
static const double dmats1[4][4] = \
3947
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3948
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3949
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
3950
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3952
static const double dmats2[4][4] = \
3953
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3954
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
3955
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
3956
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
3958
// Compute reference derivatives.
3959
// Declare pointer to array of derivatives on FIAT element.
3960
double *derivatives = new double[num_derivatives];
3961
for (unsigned int r = 0; r < num_derivatives; r++)
3963
derivatives[r] = 0.00000000;
3964
}// end loop over 'r'
3966
// Declare derivative matrix (of polynomial basis).
3967
double dmats[4][4] = \
3968
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3969
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3970
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3971
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3973
// Declare (auxiliary) derivative matrix (of polynomial basis).
3974
double dmats_old[4][4] = \
3975
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3976
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
3977
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
3978
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3980
// Loop possible derivatives.
3981
for (unsigned int r = 0; r < num_derivatives; r++)
3983
// Resetting dmats values to compute next derivative.
3984
for (unsigned int t = 0; t < 4; t++)
3986
for (unsigned int u = 0; u < 4; u++)
3988
dmats[t][u] = 0.00000000;
3991
dmats[t][u] = 1.00000000;
3994
}// end loop over 'u'
3995
}// end loop over 't'
3997
// Looping derivative order to generate dmats.
3998
for (unsigned int s = 0; s < n; s++)
4000
// Updating dmats_old with new values and resetting dmats.
4001
for (unsigned int t = 0; t < 4; t++)
4003
for (unsigned int u = 0; u < 4; u++)
4005
dmats_old[t][u] = dmats[t][u];
4006
dmats[t][u] = 0.00000000;
4007
}// end loop over 'u'
4008
}// end loop over 't'
4010
// Update dmats using an inner product.
4011
if (combinations[r][s] == 0)
4013
for (unsigned int t = 0; t < 4; t++)
4015
for (unsigned int u = 0; u < 4; u++)
4017
for (unsigned int tu = 0; tu < 4; tu++)
4019
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
4020
}// end loop over 'tu'
4021
}// end loop over 'u'
4022
}// end loop over 't'
4025
if (combinations[r][s] == 1)
4027
for (unsigned int t = 0; t < 4; t++)
4029
for (unsigned int u = 0; u < 4; u++)
4031
for (unsigned int tu = 0; tu < 4; tu++)
4033
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
4034
}// end loop over 'tu'
4035
}// end loop over 'u'
4036
}// end loop over 't'
4039
if (combinations[r][s] == 2)
4041
for (unsigned int t = 0; t < 4; t++)
4043
for (unsigned int u = 0; u < 4; u++)
4045
for (unsigned int tu = 0; tu < 4; tu++)
4047
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
4048
}// end loop over 'tu'
4049
}// end loop over 'u'
4050
}// end loop over 't'
4053
}// end loop over 's'
4054
for (unsigned int s = 0; s < 4; s++)
4056
for (unsigned int t = 0; t < 4; t++)
4058
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
4059
}// end loop over 't'
4060
}// end loop over 's'
4061
}// end loop over 'r'
4063
// Transform derivatives back to physical element
4064
for (unsigned int r = 0; r < num_derivatives; r++)
4066
for (unsigned int s = 0; s < num_derivatives; s++)
4068
values[num_derivatives + r] += transform[r][s]*derivatives[s];
4069
}// end loop over 's'
4070
}// end loop over 'r'
4072
// Delete pointer to array of derivatives on FIAT element
4073
delete [] derivatives;
4075
// Delete pointer to array of combinations of derivatives and transform
4076
for (unsigned int r = 0; r < num_derivatives; r++)
4078
delete [] combinations[r];
4079
}// end loop over 'r'
4080
delete [] combinations;
4081
for (unsigned int r = 0; r < num_derivatives; r++)
4083
delete [] transform[r];
4084
}// end loop over 'r'
4085
delete [] transform;
4091
// Array of basisvalues.
4092
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4094
// Declare helper variables.
4095
unsigned int rr = 0;
4096
unsigned int ss = 0;
4097
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4099
// Compute basisvalues.
4100
basisvalues[0] = 1.00000000;
4101
basisvalues[1] = tmp0;
4102
for (unsigned int r = 0; r < 1; r++)
4104
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4105
ss = r*(r + 1)*(r + 2)/6;
4106
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4107
}// end loop over 'r'
4108
for (unsigned int r = 0; r < 1; r++)
4110
for (unsigned int s = 0; s < 1 - r; s++)
4112
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4113
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4114
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4115
}// end loop over 's'
4116
}// end loop over 'r'
4117
for (unsigned int r = 0; r < 2; r++)
4119
for (unsigned int s = 0; s < 2 - r; s++)
4121
for (unsigned int t = 0; t < 2 - r - s; t++)
4123
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4124
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4125
}// end loop over 't'
4126
}// end loop over 's'
4127
}// end loop over 'r'
4129
// Table(s) of coefficients.
4130
static const double coefficients0[4] = \
4131
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
4133
// Tables of derivatives of the polynomial base (transpose).
4134
static const double dmats0[4][4] = \
4135
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4136
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
4137
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4138
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4140
static const double dmats1[4][4] = \
4141
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4142
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4143
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
4144
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4146
static const double dmats2[4][4] = \
4147
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4148
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4149
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
4150
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
4152
// Compute reference derivatives.
4153
// Declare pointer to array of derivatives on FIAT element.
4154
double *derivatives = new double[num_derivatives];
4155
for (unsigned int r = 0; r < num_derivatives; r++)
4157
derivatives[r] = 0.00000000;
4158
}// end loop over 'r'
4160
// Declare derivative matrix (of polynomial basis).
4161
double dmats[4][4] = \
4162
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4163
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4164
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4165
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4167
// Declare (auxiliary) derivative matrix (of polynomial basis).
4168
double dmats_old[4][4] = \
4169
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4170
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4171
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4172
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4174
// Loop possible derivatives.
4175
for (unsigned int r = 0; r < num_derivatives; r++)
4177
// Resetting dmats values to compute next derivative.
4178
for (unsigned int t = 0; t < 4; t++)
4180
for (unsigned int u = 0; u < 4; u++)
4182
dmats[t][u] = 0.00000000;
4185
dmats[t][u] = 1.00000000;
4188
}// end loop over 'u'
4189
}// end loop over 't'
4191
// Looping derivative order to generate dmats.
4192
for (unsigned int s = 0; s < n; s++)
4194
// Updating dmats_old with new values and resetting dmats.
4195
for (unsigned int t = 0; t < 4; t++)
4197
for (unsigned int u = 0; u < 4; u++)
4199
dmats_old[t][u] = dmats[t][u];
4200
dmats[t][u] = 0.00000000;
4201
}// end loop over 'u'
4202
}// end loop over 't'
4204
// Update dmats using an inner product.
4205
if (combinations[r][s] == 0)
4207
for (unsigned int t = 0; t < 4; t++)
4209
for (unsigned int u = 0; u < 4; u++)
4211
for (unsigned int tu = 0; tu < 4; tu++)
4213
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
4214
}// end loop over 'tu'
4215
}// end loop over 'u'
4216
}// end loop over 't'
4219
if (combinations[r][s] == 1)
4221
for (unsigned int t = 0; t < 4; t++)
4223
for (unsigned int u = 0; u < 4; u++)
4225
for (unsigned int tu = 0; tu < 4; tu++)
4227
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
4228
}// end loop over 'tu'
4229
}// end loop over 'u'
4230
}// end loop over 't'
4233
if (combinations[r][s] == 2)
4235
for (unsigned int t = 0; t < 4; t++)
4237
for (unsigned int u = 0; u < 4; u++)
4239
for (unsigned int tu = 0; tu < 4; tu++)
4241
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
4242
}// end loop over 'tu'
4243
}// end loop over 'u'
4244
}// end loop over 't'
4247
}// end loop over 's'
4248
for (unsigned int s = 0; s < 4; s++)
4250
for (unsigned int t = 0; t < 4; t++)
4252
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
4253
}// end loop over 't'
4254
}// end loop over 's'
4255
}// end loop over 'r'
4257
// Transform derivatives back to physical element
4258
for (unsigned int r = 0; r < num_derivatives; r++)
4260
for (unsigned int s = 0; s < num_derivatives; s++)
4262
values[num_derivatives + r] += transform[r][s]*derivatives[s];
4263
}// end loop over 's'
4264
}// end loop over 'r'
4266
// Delete pointer to array of derivatives on FIAT element
4267
delete [] derivatives;
4269
// Delete pointer to array of combinations of derivatives and transform
4270
for (unsigned int r = 0; r < num_derivatives; r++)
4272
delete [] combinations[r];
4273
}// end loop over 'r'
4274
delete [] combinations;
4275
for (unsigned int r = 0; r < num_derivatives; r++)
4277
delete [] transform[r];
4278
}// end loop over 'r'
4279
delete [] transform;
4285
// Array of basisvalues.
4286
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4288
// Declare helper variables.
4289
unsigned int rr = 0;
4290
unsigned int ss = 0;
4291
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4293
// Compute basisvalues.
4294
basisvalues[0] = 1.00000000;
4295
basisvalues[1] = tmp0;
4296
for (unsigned int r = 0; r < 1; r++)
4298
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4299
ss = r*(r + 1)*(r + 2)/6;
4300
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4301
}// end loop over 'r'
4302
for (unsigned int r = 0; r < 1; r++)
4304
for (unsigned int s = 0; s < 1 - r; s++)
4306
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4307
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4308
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4309
}// end loop over 's'
4310
}// end loop over 'r'
4311
for (unsigned int r = 0; r < 2; r++)
4313
for (unsigned int s = 0; s < 2 - r; s++)
4315
for (unsigned int t = 0; t < 2 - r - s; t++)
4317
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4318
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4319
}// end loop over 't'
4320
}// end loop over 's'
4321
}// end loop over 'r'
4323
// Table(s) of coefficients.
4324
static const double coefficients0[4] = \
4325
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
4327
// Tables of derivatives of the polynomial base (transpose).
4328
static const double dmats0[4][4] = \
4329
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4330
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
4331
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4332
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4334
static const double dmats1[4][4] = \
4335
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4336
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4337
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
4338
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4340
static const double dmats2[4][4] = \
4341
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4342
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4343
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
4344
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
4346
// Compute reference derivatives.
4347
// Declare pointer to array of derivatives on FIAT element.
4348
double *derivatives = new double[num_derivatives];
4349
for (unsigned int r = 0; r < num_derivatives; r++)
4351
derivatives[r] = 0.00000000;
4352
}// end loop over 'r'
4354
// Declare derivative matrix (of polynomial basis).
4355
double dmats[4][4] = \
4356
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4357
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4358
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4359
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4361
// Declare (auxiliary) derivative matrix (of polynomial basis).
4362
double dmats_old[4][4] = \
4363
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4364
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4365
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4366
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4368
// Loop possible derivatives.
4369
for (unsigned int r = 0; r < num_derivatives; r++)
4371
// Resetting dmats values to compute next derivative.
4372
for (unsigned int t = 0; t < 4; t++)
4374
for (unsigned int u = 0; u < 4; u++)
4376
dmats[t][u] = 0.00000000;
4379
dmats[t][u] = 1.00000000;
4382
}// end loop over 'u'
4383
}// end loop over 't'
4385
// Looping derivative order to generate dmats.
4386
for (unsigned int s = 0; s < n; s++)
4388
// Updating dmats_old with new values and resetting dmats.
4389
for (unsigned int t = 0; t < 4; t++)
4391
for (unsigned int u = 0; u < 4; u++)
4393
dmats_old[t][u] = dmats[t][u];
4394
dmats[t][u] = 0.00000000;
4395
}// end loop over 'u'
4396
}// end loop over 't'
4398
// Update dmats using an inner product.
4399
if (combinations[r][s] == 0)
4401
for (unsigned int t = 0; t < 4; t++)
4403
for (unsigned int u = 0; u < 4; u++)
4405
for (unsigned int tu = 0; tu < 4; tu++)
4407
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
4408
}// end loop over 'tu'
4409
}// end loop over 'u'
4410
}// end loop over 't'
4413
if (combinations[r][s] == 1)
4415
for (unsigned int t = 0; t < 4; t++)
4417
for (unsigned int u = 0; u < 4; u++)
4419
for (unsigned int tu = 0; tu < 4; tu++)
4421
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
4422
}// end loop over 'tu'
4423
}// end loop over 'u'
4424
}// end loop over 't'
4427
if (combinations[r][s] == 2)
4429
for (unsigned int t = 0; t < 4; t++)
4431
for (unsigned int u = 0; u < 4; u++)
4433
for (unsigned int tu = 0; tu < 4; tu++)
4435
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
4436
}// end loop over 'tu'
4437
}// end loop over 'u'
4438
}// end loop over 't'
4441
}// end loop over 's'
4442
for (unsigned int s = 0; s < 4; s++)
4444
for (unsigned int t = 0; t < 4; t++)
4446
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
4447
}// end loop over 't'
4448
}// end loop over 's'
4449
}// end loop over 'r'
4451
// Transform derivatives back to physical element
4452
for (unsigned int r = 0; r < num_derivatives; r++)
4454
for (unsigned int s = 0; s < num_derivatives; s++)
4456
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
4457
}// end loop over 's'
4458
}// end loop over 'r'
4460
// Delete pointer to array of derivatives on FIAT element
4461
delete [] derivatives;
4463
// Delete pointer to array of combinations of derivatives and transform
4464
for (unsigned int r = 0; r < num_derivatives; r++)
4466
delete [] combinations[r];
4467
}// end loop over 'r'
4468
delete [] combinations;
4469
for (unsigned int r = 0; r < num_derivatives; r++)
4471
delete [] transform[r];
4472
}// end loop over 'r'
4473
delete [] transform;
4479
// Array of basisvalues.
4480
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4482
// Declare helper variables.
4483
unsigned int rr = 0;
4484
unsigned int ss = 0;
4485
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4487
// Compute basisvalues.
4488
basisvalues[0] = 1.00000000;
4489
basisvalues[1] = tmp0;
4490
for (unsigned int r = 0; r < 1; r++)
4492
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4493
ss = r*(r + 1)*(r + 2)/6;
4494
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4495
}// end loop over 'r'
4496
for (unsigned int r = 0; r < 1; r++)
4498
for (unsigned int s = 0; s < 1 - r; s++)
4500
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4501
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4502
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4503
}// end loop over 's'
4504
}// end loop over 'r'
4505
for (unsigned int r = 0; r < 2; r++)
4507
for (unsigned int s = 0; s < 2 - r; s++)
4509
for (unsigned int t = 0; t < 2 - r - s; t++)
4511
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4512
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4513
}// end loop over 't'
4514
}// end loop over 's'
4515
}// end loop over 'r'
4517
// Table(s) of coefficients.
4518
static const double coefficients0[4] = \
4519
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
4521
// Tables of derivatives of the polynomial base (transpose).
4522
static const double dmats0[4][4] = \
4523
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4524
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
4525
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4526
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4528
static const double dmats1[4][4] = \
4529
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4530
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4531
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
4532
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4534
static const double dmats2[4][4] = \
4535
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4536
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4537
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
4538
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
4540
// Compute reference derivatives.
4541
// Declare pointer to array of derivatives on FIAT element.
4542
double *derivatives = new double[num_derivatives];
4543
for (unsigned int r = 0; r < num_derivatives; r++)
4545
derivatives[r] = 0.00000000;
4546
}// end loop over 'r'
4548
// Declare derivative matrix (of polynomial basis).
4549
double dmats[4][4] = \
4550
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4551
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4552
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4553
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4555
// Declare (auxiliary) derivative matrix (of polynomial basis).
4556
double dmats_old[4][4] = \
4557
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4558
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4559
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4560
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4562
// Loop possible derivatives.
4563
for (unsigned int r = 0; r < num_derivatives; r++)
4565
// Resetting dmats values to compute next derivative.
4566
for (unsigned int t = 0; t < 4; t++)
4568
for (unsigned int u = 0; u < 4; u++)
4570
dmats[t][u] = 0.00000000;
4573
dmats[t][u] = 1.00000000;
4576
}// end loop over 'u'
4577
}// end loop over 't'
4579
// Looping derivative order to generate dmats.
4580
for (unsigned int s = 0; s < n; s++)
4582
// Updating dmats_old with new values and resetting dmats.
4583
for (unsigned int t = 0; t < 4; t++)
4585
for (unsigned int u = 0; u < 4; u++)
4587
dmats_old[t][u] = dmats[t][u];
4588
dmats[t][u] = 0.00000000;
4589
}// end loop over 'u'
4590
}// end loop over 't'
4592
// Update dmats using an inner product.
4593
if (combinations[r][s] == 0)
4595
for (unsigned int t = 0; t < 4; t++)
4597
for (unsigned int u = 0; u < 4; u++)
4599
for (unsigned int tu = 0; tu < 4; tu++)
4601
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
4602
}// end loop over 'tu'
4603
}// end loop over 'u'
4604
}// end loop over 't'
4607
if (combinations[r][s] == 1)
4609
for (unsigned int t = 0; t < 4; t++)
4611
for (unsigned int u = 0; u < 4; u++)
4613
for (unsigned int tu = 0; tu < 4; tu++)
4615
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
4616
}// end loop over 'tu'
4617
}// end loop over 'u'
4618
}// end loop over 't'
4621
if (combinations[r][s] == 2)
4623
for (unsigned int t = 0; t < 4; t++)
4625
for (unsigned int u = 0; u < 4; u++)
4627
for (unsigned int tu = 0; tu < 4; tu++)
4629
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
4630
}// end loop over 'tu'
4631
}// end loop over 'u'
4632
}// end loop over 't'
4635
}// end loop over 's'
4636
for (unsigned int s = 0; s < 4; s++)
4638
for (unsigned int t = 0; t < 4; t++)
4640
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
4641
}// end loop over 't'
4642
}// end loop over 's'
4643
}// end loop over 'r'
4645
// Transform derivatives back to physical element
4646
for (unsigned int r = 0; r < num_derivatives; r++)
4648
for (unsigned int s = 0; s < num_derivatives; s++)
4650
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
4651
}// end loop over 's'
4652
}// end loop over 'r'
4654
// Delete pointer to array of derivatives on FIAT element
4655
delete [] derivatives;
4657
// Delete pointer to array of combinations of derivatives and transform
4658
for (unsigned int r = 0; r < num_derivatives; r++)
4660
delete [] combinations[r];
4661
}// end loop over 'r'
4662
delete [] combinations;
4663
for (unsigned int r = 0; r < num_derivatives; r++)
4665
delete [] transform[r];
4666
}// end loop over 'r'
4667
delete [] transform;
4673
// Array of basisvalues.
4674
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4676
// Declare helper variables.
4677
unsigned int rr = 0;
4678
unsigned int ss = 0;
4679
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4681
// Compute basisvalues.
4682
basisvalues[0] = 1.00000000;
4683
basisvalues[1] = tmp0;
4684
for (unsigned int r = 0; r < 1; r++)
4686
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4687
ss = r*(r + 1)*(r + 2)/6;
4688
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4689
}// end loop over 'r'
4690
for (unsigned int r = 0; r < 1; r++)
4692
for (unsigned int s = 0; s < 1 - r; s++)
4694
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4695
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4696
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4697
}// end loop over 's'
4698
}// end loop over 'r'
4699
for (unsigned int r = 0; r < 2; r++)
4701
for (unsigned int s = 0; s < 2 - r; s++)
4703
for (unsigned int t = 0; t < 2 - r - s; t++)
4705
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4706
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4707
}// end loop over 't'
4708
}// end loop over 's'
4709
}// end loop over 'r'
4711
// Table(s) of coefficients.
4712
static const double coefficients0[4] = \
4713
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
4715
// Tables of derivatives of the polynomial base (transpose).
4716
static const double dmats0[4][4] = \
4717
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4718
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
4719
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4720
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4722
static const double dmats1[4][4] = \
4723
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4724
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4725
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
4726
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4728
static const double dmats2[4][4] = \
4729
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4730
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4731
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
4732
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
4734
// Compute reference derivatives.
4735
// Declare pointer to array of derivatives on FIAT element.
4736
double *derivatives = new double[num_derivatives];
4737
for (unsigned int r = 0; r < num_derivatives; r++)
4739
derivatives[r] = 0.00000000;
4740
}// end loop over 'r'
4742
// Declare derivative matrix (of polynomial basis).
4743
double dmats[4][4] = \
4744
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4745
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4746
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4747
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4749
// Declare (auxiliary) derivative matrix (of polynomial basis).
4750
double dmats_old[4][4] = \
4751
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4752
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4753
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4754
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4756
// Loop possible derivatives.
4757
for (unsigned int r = 0; r < num_derivatives; r++)
4759
// Resetting dmats values to compute next derivative.
4760
for (unsigned int t = 0; t < 4; t++)
4762
for (unsigned int u = 0; u < 4; u++)
4764
dmats[t][u] = 0.00000000;
4767
dmats[t][u] = 1.00000000;
4770
}// end loop over 'u'
4771
}// end loop over 't'
4773
// Looping derivative order to generate dmats.
4774
for (unsigned int s = 0; s < n; s++)
4776
// Updating dmats_old with new values and resetting dmats.
4777
for (unsigned int t = 0; t < 4; t++)
4779
for (unsigned int u = 0; u < 4; u++)
4781
dmats_old[t][u] = dmats[t][u];
4782
dmats[t][u] = 0.00000000;
4783
}// end loop over 'u'
4784
}// end loop over 't'
4786
// Update dmats using an inner product.
4787
if (combinations[r][s] == 0)
4789
for (unsigned int t = 0; t < 4; t++)
4791
for (unsigned int u = 0; u < 4; u++)
4793
for (unsigned int tu = 0; tu < 4; tu++)
4795
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
4796
}// end loop over 'tu'
4797
}// end loop over 'u'
4798
}// end loop over 't'
4801
if (combinations[r][s] == 1)
4803
for (unsigned int t = 0; t < 4; t++)
4805
for (unsigned int u = 0; u < 4; u++)
4807
for (unsigned int tu = 0; tu < 4; tu++)
4809
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
4810
}// end loop over 'tu'
4811
}// end loop over 'u'
4812
}// end loop over 't'
4815
if (combinations[r][s] == 2)
4817
for (unsigned int t = 0; t < 4; t++)
4819
for (unsigned int u = 0; u < 4; u++)
4821
for (unsigned int tu = 0; tu < 4; tu++)
4823
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
4824
}// end loop over 'tu'
4825
}// end loop over 'u'
4826
}// end loop over 't'
4829
}// end loop over 's'
4830
for (unsigned int s = 0; s < 4; s++)
4832
for (unsigned int t = 0; t < 4; t++)
4834
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
4835
}// end loop over 't'
4836
}// end loop over 's'
4837
}// end loop over 'r'
4839
// Transform derivatives back to physical element
4840
for (unsigned int r = 0; r < num_derivatives; r++)
4842
for (unsigned int s = 0; s < num_derivatives; s++)
4844
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
4845
}// end loop over 's'
4846
}// end loop over 'r'
4848
// Delete pointer to array of derivatives on FIAT element
4849
delete [] derivatives;
4851
// Delete pointer to array of combinations of derivatives and transform
4852
for (unsigned int r = 0; r < num_derivatives; r++)
4854
delete [] combinations[r];
4855
}// end loop over 'r'
4856
delete [] combinations;
4857
for (unsigned int r = 0; r < num_derivatives; r++)
4859
delete [] transform[r];
4860
}// end loop over 'r'
4861
delete [] transform;
4867
// Array of basisvalues.
4868
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4870
// Declare helper variables.
4871
unsigned int rr = 0;
4872
unsigned int ss = 0;
4873
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4875
// Compute basisvalues.
4876
basisvalues[0] = 1.00000000;
4877
basisvalues[1] = tmp0;
4878
for (unsigned int r = 0; r < 1; r++)
4880
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4881
ss = r*(r + 1)*(r + 2)/6;
4882
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4883
}// end loop over 'r'
4884
for (unsigned int r = 0; r < 1; r++)
4886
for (unsigned int s = 0; s < 1 - r; s++)
4888
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4889
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4890
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4891
}// end loop over 's'
4892
}// end loop over 'r'
4893
for (unsigned int r = 0; r < 2; r++)
4895
for (unsigned int s = 0; s < 2 - r; s++)
4897
for (unsigned int t = 0; t < 2 - r - s; t++)
4899
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4900
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4901
}// end loop over 't'
4902
}// end loop over 's'
4903
}// end loop over 'r'
4905
// Table(s) of coefficients.
4906
static const double coefficients0[4] = \
4907
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
4909
// Tables of derivatives of the polynomial base (transpose).
4910
static const double dmats0[4][4] = \
4911
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4912
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
4913
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4914
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4916
static const double dmats1[4][4] = \
4917
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4918
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4919
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
4920
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4922
static const double dmats2[4][4] = \
4923
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4924
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
4925
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
4926
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
4928
// Compute reference derivatives.
4929
// Declare pointer to array of derivatives on FIAT element.
4930
double *derivatives = new double[num_derivatives];
4931
for (unsigned int r = 0; r < num_derivatives; r++)
4933
derivatives[r] = 0.00000000;
4934
}// end loop over 'r'
4936
// Declare derivative matrix (of polynomial basis).
4937
double dmats[4][4] = \
4938
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4939
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4940
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4941
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4943
// Declare (auxiliary) derivative matrix (of polynomial basis).
4944
double dmats_old[4][4] = \
4945
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4946
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
4947
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
4948
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4950
// Loop possible derivatives.
4951
for (unsigned int r = 0; r < num_derivatives; r++)
4953
// Resetting dmats values to compute next derivative.
4954
for (unsigned int t = 0; t < 4; t++)
4956
for (unsigned int u = 0; u < 4; u++)
4958
dmats[t][u] = 0.00000000;
4961
dmats[t][u] = 1.00000000;
4964
}// end loop over 'u'
4965
}// end loop over 't'
4967
// Looping derivative order to generate dmats.
4968
for (unsigned int s = 0; s < n; s++)
4970
// Updating dmats_old with new values and resetting dmats.
4971
for (unsigned int t = 0; t < 4; t++)
4973
for (unsigned int u = 0; u < 4; u++)
4975
dmats_old[t][u] = dmats[t][u];
4976
dmats[t][u] = 0.00000000;
4977
}// end loop over 'u'
4978
}// end loop over 't'
4980
// Update dmats using an inner product.
4981
if (combinations[r][s] == 0)
4983
for (unsigned int t = 0; t < 4; t++)
4985
for (unsigned int u = 0; u < 4; u++)
4987
for (unsigned int tu = 0; tu < 4; tu++)
4989
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
4990
}// end loop over 'tu'
4991
}// end loop over 'u'
4992
}// end loop over 't'
4995
if (combinations[r][s] == 1)
4997
for (unsigned int t = 0; t < 4; t++)
4999
for (unsigned int u = 0; u < 4; u++)
5001
for (unsigned int tu = 0; tu < 4; tu++)
5003
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
5004
}// end loop over 'tu'
5005
}// end loop over 'u'
5006
}// end loop over 't'
5009
if (combinations[r][s] == 2)
5011
for (unsigned int t = 0; t < 4; t++)
5013
for (unsigned int u = 0; u < 4; u++)
5015
for (unsigned int tu = 0; tu < 4; tu++)
5017
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
5018
}// end loop over 'tu'
5019
}// end loop over 'u'
5020
}// end loop over 't'
5023
}// end loop over 's'
5024
for (unsigned int s = 0; s < 4; s++)
5026
for (unsigned int t = 0; t < 4; t++)
5028
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
5029
}// end loop over 't'
5030
}// end loop over 's'
5031
}// end loop over 'r'
5033
// Transform derivatives back to physical element
5034
for (unsigned int r = 0; r < num_derivatives; r++)
5036
for (unsigned int s = 0; s < num_derivatives; s++)
5038
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
5039
}// end loop over 's'
5040
}// end loop over 'r'
5042
// Delete pointer to array of derivatives on FIAT element
5043
delete [] derivatives;
5045
// Delete pointer to array of combinations of derivatives and transform
5046
for (unsigned int r = 0; r < num_derivatives; r++)
5048
delete [] combinations[r];
5049
}// end loop over 'r'
5050
delete [] combinations;
5051
for (unsigned int r = 0; r < num_derivatives; r++)
5053
delete [] transform[r];
5054
}// end loop over 'r'
5055
delete [] transform;