Advertisement
Guest User

Untitled

a guest
Jun 29th, 2015
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.44 KB | None | 0 0
  1. /** @file */
  2. #include <stdio.h>
  3. #include <petscksp.h>
  4. #include "gauss.h"
  5. #include "rhs.h"
  6. #include "global.h"
  7. #include "eval.h"
  8. #include "indices.h"
  9.  
  10. PetscErrorCode calculate_rhs(Vec rhs, PetscInt rhs_length, PetscInt elems_x,
  11.                              PetscInt elems_y, PetscScalar* u1_vec,
  12.                  PetscScalar* u2_vec, PetscScalar* p_vec,
  13.                  PetscScalar k, PetscScalar nu,
  14.                  PetscInt p_vec_length, PetscInt vel_y_vec_length)
  15. {
  16.   PetscErrorCode ierr;
  17.   PetscInt elems[6];
  18.   PetscScalar rhs_temp;
  19.   /* --------------- X-COMONENT OF VELOCITY --------------- */
  20.   for (PetscInt node_index=0; node_index<rhs_length-p_vec_length-vel_y_vec_length; node_index++)
  21.   {
  22.     /* initialize rhs entry and find all elems in supp(node_index) */
  23.     rhs_temp = 0.0;
  24.     get_ele_indices(node_index, elems_x, elems_y, elems, GRID_TYPE_FINE);
  25.     /* start loop over all those elems and for each elem loop over all gauss points */
  26.     for (PetscInt i=0; i<6; i++)
  27.     {
  28.       for (PetscInt g=0; g< GAUSS_5_NG ; g++)
  29.       {
  30.     if (elems[i] > -1)
  31.     {
  32.     rhs_temp += GAUSS_5_W[g]*evaluate_rhs1(node_index,
  33.                                      elems[i],
  34.                      GAUSS_5_X[g],
  35.                      GAUSS_5_Y[g],
  36.                      elems_x,
  37.                      k,
  38.                      nu,
  39.                      u1_vec,
  40.                      u2_vec,
  41.                      p_vec);
  42.     }
  43.       }
  44.     }
  45.     ierr = VecSetValues(rhs, 1, &node_index, &rhs_temp, INSERT_VALUES);CHKERRQ(ierr);
  46.     PetscPrintf(PETSC_COMM_WORLD, "\n\n");
  47.     PetscPrintf(PETSC_COMM_WORLD, "index %d: %f\n", node_index, rhs_temp);
  48.   }
  49.  
  50.   /* --------------- Y-COMONENT OF VELOCITY --------------- */
  51.   for (PetscInt node_index=rhs_length-p_vec_length-vel_y_vec_length; node_index<rhs_length-p_vec_length; node_index++)
  52.   {
  53.     /* initialize rhs entry and find all elems in supp(node_index) */
  54.     rhs_temp = 0.0;
  55.     get_ele_indices(node_index-vel_y_vec_length, elems_x, elems_y, elems, GRID_TYPE_FINE);
  56.     /* start loop over all those elems and for each elem loop over all gauss points */
  57.     for (PetscInt i=0; i<6; i++)
  58.     {
  59.       for (PetscInt g=0; g< GAUSS_5_NG ; g++)
  60.       {
  61.     if (elems[i] > -1)
  62.     {
  63.     rhs_temp += GAUSS_5_W[g]*evaluate_rhs2(node_index-vel_y_vec_length,
  64.                                      elems[i],
  65.                      GAUSS_5_X[g],
  66.                      GAUSS_5_Y[g],
  67.                      elems_x,
  68.                      k,
  69.                  nu,
  70.                      u1_vec,
  71.                      u2_vec,
  72.                      p_vec);
  73.     }
  74.       }
  75.     }
  76.     ierr = VecSetValues(rhs, 1, &node_index, &rhs_temp, INSERT_VALUES);CHKERRQ(ierr);
  77.     PetscPrintf(PETSC_COMM_WORLD, "\nY-Component\n");
  78.     PetscPrintf(PETSC_COMM_WORLD, "index %d: %f\n", node_index, rhs_temp);
  79.   }
  80.  
  81.   /* --------------- PRESSURE --------------- */
  82.   for (PetscInt node_index=rhs_length-p_vec_length; node_index<rhs_length; node_index++)
  83.   {
  84.     /* all entries for pressure-rhs are zero */
  85.     rhs_temp = 0.0;
  86.     ierr = VecSetValues(rhs, 1, &node_index, &rhs_temp, INSERT_VALUES);CHKERRQ(ierr);
  87.   }
  88.   ierr = VecAssemblyBegin(rhs);CHKERRQ(ierr);
  89.   ierr = VecAssemblyEnd(rhs);CHKERRQ(ierr);
  90.   return 0;
  91. }
  92.  
  93. PetscScalar evaluate_rhs1(PetscInt glob_index,
  94.                    PetscInt ele_index,
  95.                    PetscScalar x1,
  96.            PetscScalar x2,
  97.            PetscInt elems_x,
  98.            PetscScalar k,
  99.            PetscScalar nu,
  100.            PetscScalar* u1_vec,
  101.            PetscScalar* u2_vec,
  102.            PetscScalar* p_vec)
  103. {
  104.   PetscScalar u1=0, u2=0, d1_u1=0, d2_u1=0, lap_u1=0, d1_p=0;
  105.   PetscScalar u_t1;
  106.   PetscScalar phi=0;
  107.   PetscScalar value;
  108.  
  109.   /* first evaluate some helper terms */
  110.   u1 = eval_FE_fct(u1_vec, P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  111.   u2 = eval_FE_fct(u2_vec, P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  112.   d1_u1 = eval_FE_fct(u1_vec, D1_P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  113.   d2_u1 = eval_FE_fct(u1_vec, D2_P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  114.   lap_u1 = eval_FE_fct(u1_vec, LAP_P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  115.   d1_p = eval_FE_fct(p_vec, D1_P1, ele_index, elems_x, x1, x2, GRID_TYPE_COARSE);
  116.  
  117.   /* then calculate acceleration; */
  118.   u_t1 = nu*lap_u1 - u1 * d1_u1 - u2 * d2_u1 - d1_p;
  119.  
  120.   /* evaluate the test function */
  121.   phi = eval_glob_basis(P2, glob_index, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  122.  
  123.   /* calculate return value */
  124.   value = (2.0/k) * u1 * phi + u_t1 * phi;
  125.  
  126.   return value;
  127. }
  128.  
  129.  
  130. PetscScalar evaluate_rhs2(PetscInt glob_index,
  131.                    PetscInt ele_index,
  132.                    PetscScalar x1,
  133.            PetscScalar x2,
  134.            PetscInt elems_x,
  135.            PetscScalar k,
  136.            PetscScalar nu,
  137.            PetscScalar* u1_vec,
  138.            PetscScalar* u2_vec,
  139.            PetscScalar* p_vec)
  140. {
  141.   PetscScalar u1=0, u2=0, d1_u2=0, d2_u2=0, lap_u2=0, d2_p=0;
  142.   PetscScalar u_t2;
  143.   PetscScalar phi=0;
  144.   PetscScalar value;
  145.  
  146.   /* first evaluate some helper terms */
  147.   u1 = eval_FE_fct(u1_vec, P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  148.   u2 = eval_FE_fct(u2_vec, P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  149.   d1_u2 = eval_FE_fct(u2_vec, D1_P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  150.   d2_u2 = eval_FE_fct(u2_vec, D2_P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  151.   lap_u2 = eval_FE_fct(u2_vec, LAP_P2, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  152.   d2_p = eval_FE_fct(p_vec, D2_P1, ele_index, elems_x, x1, x2, GRID_TYPE_COARSE);
  153.  
  154.   /* then calculate acceleration; */
  155.   u_t2 = nu*lap_u2 - u1 * d1_u2 - u2 * d2_u2 - d2_p;
  156.  
  157.   /* evaluate the test function */
  158.   phi = eval_glob_basis(P2, glob_index, ele_index, elems_x, x1, x2, GRID_TYPE_FINE);
  159.  
  160.   /* calculate return value */
  161.   value = (2.0/k) * u2 * phi + u_t2 * phi;
  162.  
  163.   return value;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement