error.c.svn-base 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //---------------------------------------------------------------------
  2. //
  3. // Copyright 2010 Intel Corporation
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. //
  17. //---------------------------------------------------------------------
  18. #include <math.h>
  19. #include "header.h"
  20. #include "mpinpb.h"
  21. #include "applu_macros.h"
  22. #define u_exact(m) u_exact[m-1]
  23. #define rms(m) rms[m-1]
  24. #define rms_work(m) rms_work[m-1]
  25. void error_norm(double rms[]) {
  26. //---------------------------------------------------------------------
  27. //---------------------------------------------------------------------
  28. //---------------------------------------------------------------------
  29. // this function computes the norm of the difference between the
  30. // computed solution and the exact solution
  31. //---------------------------------------------------------------------
  32. int c, i, j, k, m, ii, jj, kk, d, error;
  33. double xi, eta, zeta, u_exact[5], rms_work[5],
  34. add;
  35. for (m = 1; m <= 5; m++) {
  36. rms_work(m) = 0.0e0;
  37. }
  38. for (c = 1; c <= ncells; c++) {
  39. kk = 0;
  40. for (k = cell_low(3,c); k <= cell_high(3,c); k++) {
  41. zeta = (double)(k) * dnzm1;
  42. jj = 0;
  43. for (j = cell_low(2,c); j <= cell_high(2,c); j++) {
  44. eta = (double)(j) * dnym1;
  45. ii = 0;
  46. for (i = cell_low(1,c); i <= cell_high(1,c); i++) {
  47. xi = (double)(i) * dnxm1;
  48. exact_solution(xi, eta, zeta, u_exact);
  49. for (m = 1; m <= 5; m++) {
  50. add = u(m,ii,jj,kk,c)-u_exact(m);
  51. rms_work(m) = rms_work(m) + add*add;
  52. }
  53. ii = ii + 1;
  54. }
  55. jj = jj + 1;
  56. }
  57. kk = kk + 1;
  58. }
  59. }
  60. RCCE_allreduce((char*)rms_work, (char*)rms, 5, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);
  61. for (m = 1; m <= 5; m++) {
  62. for (d = 1; d <= 3; d++) {
  63. rms(m) = rms(m) / (double)(grid_points(d)-2);
  64. }
  65. rms(m) = sqrt(rms(m));
  66. }
  67. return;
  68. }
  69. //---------------------------------------------------------------------
  70. //---------------------------------------------------------------------
  71. void rhs_norm(double rms[]) {
  72. //---------------------------------------------------------------------
  73. //---------------------------------------------------------------------
  74. int c, i, j, k, d, m, error;
  75. double rms_work[5], add;
  76. for (m = 1; m <= 5; m++) {
  77. rms_work(m) = 0.0e0;
  78. }
  79. for (c = 1; c <= ncells; c++) {
  80. for (k = start(3,c); k <= cell_size(3,c)-end(3,c)-1; k++) {
  81. for (j = start(2,c); j <= cell_size(2,c)-end(2,c)-1; j++) {
  82. for (i = start(1,c); i <= cell_size(1,c)-end(1,c)-1; i++) {
  83. for (m = 1; m <= 5; m++) {
  84. add = rhs(m,i,j,k,c);
  85. rms_work(m) = rms_work(m) + add*add;
  86. }
  87. }
  88. }
  89. }
  90. }
  91. RCCE_allreduce((char*)rms_work, (char*)rms, 5, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);
  92. for (m = 1; m <= 5; m++) {
  93. for (d = 1; d <= 3; d++) {
  94. rms(m) = rms(m) / (double)(grid_points(d)-2);
  95. }
  96. rms(m) = sqrt(rms(m));
  97. }
  98. return;
  99. }