Beispiel #1
0
void error_norm(double rms[]) {

//---------------------------------------------------------------------
//---------------------------------------------------------------------

//---------------------------------------------------------------------
//     this function computes the norm of the difference between the
//     computed solution and the exact solution
//---------------------------------------------------------------------

      int c, i, j, k, m, ii, jj, kk, d, error;
      double xi, eta, zeta, u_exact[5], rms_work[5],
           add;

      for (m = 1; m <= 5; m++) {
         rms_work(m) = 0.0e0;
      }

      for (c = 1; c <= ncells; c++) {
         kk = 0;
         for (k = cell_low(3,c); k <= cell_high(3,c); k++) {
            zeta = (double)(k) * dnzm1;
            jj = 0;
            for (j = cell_low(2,c); j <= cell_high(2,c); j++) {
               eta = (double)(j) * dnym1;
               ii = 0;
               for (i = cell_low(1,c); i <= cell_high(1,c); i++) {
                  xi = (double)(i) * dnxm1;
                  exact_solution(xi, eta, zeta, u_exact);

                  for (m = 1; m <= 5; m++) {
                     add = u(m,ii,jj,kk,c)-u_exact(m);
                     rms_work(m) = rms_work(m) + add*add;
                  }
                  ii = ii + 1;
               }
               jj = jj + 1;
            }
            kk = kk + 1;
         }
      }

      RCCE_allreduce((char*)rms_work, (char*)rms, 5, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);

      for (m = 1; m <= 5; m++) {
         for (d = 1; d <= 3; d++) {
            rms(m) = rms(m) / (double)(grid_points(d)-2);
         }
         rms(m) = sqrt(rms(m));
      }

      return;
}
Beispiel #2
0
void l2norm(int ldx, int ldy, int ldz, double *v, double *sum ) {

//c   to compute the l2-norm of vector v.

      int i, j, k, m;
      double dummy[5];

      for (m=1; m<=5; m++) dummy(m) = 0.0;
   
      for (k=2; k<=nz0-1; k++)
      for (j=jst; j<=jend; j++) 
         for (i=ist; i<=iend; i++) 
            for (m=1; m<=5; m++) 
                  dummy(m)+= v(m,i,j,k) * v(m,i,j,k);

//c   compute the global sum of individual contributions to dot product.

      RCCE_allreduce( (char*)dummy, (char*)sum, 5, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);

      for (m=1; m<=5; m++)
         sum(m) = sqrt ( sum(m) / ( (nx0-2)*(ny0-2)*(nz0-2) ) );

      return;
}
Beispiel #3
0
void rhs_norm(double rms[]) {

//---------------------------------------------------------------------
//---------------------------------------------------------------------

      int c, i, j, k, d, m, error;
      double rms_work[5], add;

      for (m = 1; m <= 5; m++) {
         rms_work(m) = 0.0e0;
      }

      for (c = 1; c <= ncells; c++) {
         for (k = start(3,c); k <= cell_size(3,c)-end(3,c)-1; k++) {
            for (j = start(2,c); j <= cell_size(2,c)-end(2,c)-1; j++) {
               for (i = start(1,c); i <= cell_size(1,c)-end(1,c)-1; i++) {
                  for (m = 1; m <= 5; m++) {
                     add = rhs(m,i,j,k,c);
                     rms_work(m) = rms_work(m) + add*add;
                  }
               }
            }
         }
      }

      RCCE_allreduce((char*)rms_work, (char*)rms, 5, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);

      for (m = 1; m <= 5; m++) {
         for (d = 1; d <= 3; d++) {
            rms(m) = rms(m) / (double)(grid_points(d)-2);
         }
         rms(m) = sqrt(rms(m));
      }

      return;
}
Beispiel #4
0
void pintgr() {

      int i, j, k, ind1, ind2;
      int ibeg, ifin, ifin1, jbeg, jfin, jfin1;
      int iglob, iglob1, iglob2, jglob, jglob1, jglob2;
      double phi1[(isiz2+2)*(isiz3+2)], phi2[(isiz2+2)*(isiz3+2)], 
             frc1, frc2, frc3, dummy;

//c---------------------------------------------------------------------
//c   set up the sub-domains for integeration in each processor
//c---------------------------------------------------------------------
      ibeg   = nx + 1;
      ifin   = 0;
      iglob1 = ipt + 1;
      iglob2 = ipt + nx;
      if ((iglob1 >= ii1)   && (iglob2 < ii2+nx)) ibeg = 1;
      if ((iglob1 > ii1-nx) && (iglob2 <= ii2)  ) ifin = nx;
      if ((ii1 >= iglob1)   && (ii1 <= iglob2)  ) ibeg = ii1 - ipt;
      if ((ii2 >= iglob1)   && (ii2 <= iglob2)  ) ifin = ii2 - ipt;
      jbeg = ny + 1;
      jfin = 0;
      jglob1 = jpt + 1;
      jglob2 = jpt + ny;
      if ((jglob1 >= ji1)   && (jglob2 < ji2+ny)) jbeg = 1;
      if ((jglob1 > ji1-ny) && (jglob2 <= ji2)  ) jfin = ny;
      if ((ji1 >= jglob1)   && (ji1 <= jglob2)  ) jbeg = ji1 - jpt;
      if ((ji2 >= jglob1)   && (ji2 <= jglob2)  ) jfin = ji2 - jpt;
      ifin1 = ifin;
      jfin1 = jfin;
      if (ipt + ifin1 == ii2) ifin1 = ifin -1;
      if (jpt + jfin1 == ji2) jfin1 = jfin -1;

//c---------------------------------------------------------------------
//c   initialize
//c---------------------------------------------------------------------
      for (i=0; i<=isiz2+1; i++) {
        for (k=0; k<=isiz3+1; k++) {
          phi1(i,k) = 0.0;
          phi2(i,k) = 0.0;
        }
      }

      for (j= jbeg; j<=jfin; j++) {
         jglob = jpt + j;
         for (i=ibeg; i<=ifin; i++) {
            iglob = ipt + i;

            k = ki1;

            phi1(i,j) = c2*(  u(5,i,j,k)
                 - 0.50 * (  u(2,i,j,k) * u(2,i,j,k)
                               + u(3,i,j,k) * u(3,i,j,k)
                               + u(4,i,j,k) * u(4,i,j,k) )
                              / u(1,i,j,k) );

            k = ki2;

            phi2(i,j) = c2*(  u(5,i,j,k)
                 - 0.50 * (  u(2,i,j,k) * u(2,i,j,k) 
                               + u(3,i,j,k) * u(3,i,j,k)
                               + u(4,i,j,k) * u(4,i,j,k) )
                              / u(1,i,j,k) );
         }
      }

//c---------------------------------------------------------------------
//c  communicate in i and j directions
//c---------------------------------------------------------------------
      exchange_4(phi1, phi2, ibeg, ifin1, jbeg, jfin1);

      frc1 = 0.0;

      for (j= jbeg; j<=jfin1; j++) {
         for (i=ibeg; i<= ifin1; i++) {
            frc1 = frc1 + (  phi1(i,j)
                           + phi1(i+1,j)
                           + phi1(i,j+1)
                           + phi1(i+1,j+1)
                           + phi2(i,j)
                           + phi2(i+1,j)
                           + phi2(i,j+1)
                           + phi2(i+1,j+1) );
         }
      }

//c---------------------------------------------------------------------
//c  compute the global sum of individual contributions to frc1
//c---------------------------------------------------------------------
      dummy = frc1;
      RCCE_allreduce((char*)(&dummy), (char*)(&frc1), 1, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);

      frc1 = dxi * deta * frc1;

//c---------------------------------------------------------------------
//c   initialize
//c---------------------------------------------------------------------
      for (i=0; i<=isiz2+1; i++) {
        for (k= 0; k<=isiz3+1; k++) {
          phi1(i,k) = 0.0;
          phi2(i,k) = 0.0;
        }
      }
      jglob = jpt + jbeg;
      ind1 = 0;
      if (jglob == ji1) {
        ind1 = 1;
        for (k= ki1; k<= ki2; k++) {
           for (i=ibeg; i<= ifin; i++) {
              iglob = ipt + i;
              phi1(i,k) = c2*(  u(5,i,jbeg,k)
                   - 0.50 * (  u(2,i,jbeg,k) * u(2,i,jbeg,k)
                                 + u(3,i,jbeg,k) * u(3,i,jbeg,k)
                                 + u(4,i,jbeg,k) *u(4,i,jbeg,k) )
                                / u(1,i,jbeg,k) );
           }
        }
      }

      jglob = jpt + jfin;
      ind2 = 0;
      if (jglob == ji2) {
        ind2 = 1;
        for (k= ki1; k<= ki2; k++) {
           for (i=ibeg; i<= ifin; i++) {
              iglob = ipt + i;
              phi2(i,k) = c2*(  u(5,i,jfin,k)
                   - 0.50 * (  u(2,i,jfin,k) * u(2,i,jfin,k)
                                 + u(3,i,jfin,k) * u(3,i,jfin,k)
                                 + u(4,i,jfin,k) * u(4,i,jfin,k) )
                                / u(1,i,jfin,k) );
           }
        }
      }

//c---------------------------------------------------------------------
//c  communicate in i direction
//c---------------------------------------------------------------------
      if (ind1 == 1) exchange_5(phi1, ibeg, ifin1);
      if (ind2 == 1) exchange_5(phi2, ibeg, ifin1);

      frc2 = 0.0;
      for (k= ki1; k<= ki2-1; k++) {
         for (i=ibeg; i<= ifin1; i++) {
            frc2 = frc2 + (  phi1(i,k)
                           + phi1(i+1,k)
                           + phi1(i,k+1)
                           + phi1(i+1,k+1)
                           + phi2(i,k)
                           + phi2(i+1,k)
                           + phi2(i,k+1)
                           + phi2(i+1,k+1) );
         }
      }

//c---------------------------------------------------------------------
//c  compute the global sum of individual contributions to frc2
//c---------------------------------------------------------------------
      dummy = frc2;
      RCCE_allreduce((char*)(&dummy), (char*)(&frc2), 1, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);

      frc2 = dxi * dzeta * frc2;

//c---------------------------------------------------------------------
//c   initialize
//c---------------------------------------------------------------------
      for (i=0; i<=isiz2+1; i++) {
        for (k= 0; k<=isiz3+1; k++) {
          phi1(i,k) = 0.0;
          phi2(i,k) = 0.0;
        }
      }
      iglob = ipt + ibeg;
      ind1 = 0;
      if (iglob == ii1) {
        ind1 = 1;
        for (k= ki1; k<= ki2; k++) {
           for (j= jbeg; j<= jfin; j++) {
              jglob = jpt + j;
              phi1(j,k) = c2*(  u(5,ibeg,j,k)
                   - 0.50 * (  u(2,ibeg,j,k) * u(2,ibeg,j,k)
                                 + u(3,ibeg,j,k) * u(3,ibeg,j,k)
                                 + u(4,ibeg,j,k) * u(4,ibeg,j,k) )
                                / u(1,ibeg,j,k) );
           }
        }
      }

      iglob = ipt + ifin;
      ind2 = 0;
      if (iglob == ii2) {
        ind2 = 1;
        for (k= ki1; k<= ki2; k++) {
           for (j= jbeg; j<= jfin; j++) {
              jglob = jpt + j;
              phi2(j,k) = c2*(  u(5,ifin,j,k)
                   - 0.50 * (  u(2,ifin,j,k) * u(2,ifin,j,k)
                                 + u(3,ifin,j,k) * u(3,ifin,j,k)
                                 + u(4,ifin,j,k) * u(4,ifin,j,k) )
                                / u(1,ifin,j,k) );
           }
        }
      }

//c---------------------------------------------------------------------
//c  communicate in j direction
//c---------------------------------------------------------------------
      if (ind1 == 1) exchange_6(phi1, jbeg, jfin1);
      if (ind2 == 1) exchange_6(phi2, jbeg, jfin1);

      frc3 = 0.0;

      for (k= ki1; k<= ki2-1; k++) {
         for (j= jbeg; j<= jfin1; j++) {
            frc3 = frc3 + (  phi1(j,k)
                           + phi1(j+1,k)
                           + phi1(j,k+1)
                           + phi1(j+1,k+1)
                           + phi2(j,k)
                           + phi2(j+1,k)
                           + phi2(j,k+1)
                           + phi2(j+1,k+1) );
         }
      }

//c---------------------------------------------------------------------
//c  compute the global sum of individual contributions to frc3
//c---------------------------------------------------------------------
      dummy = frc3;
      RCCE_allreduce((char*)(&dummy), (char*)(&frc3), 1, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);

      frc3 = deta * dzeta * frc3;
      frc = 0.25 * ( frc1 + frc2 + frc3 );

      return;
}