Beispiel #1
0
void SCL::build_fe_space() {
  mesh_t& mesh = ir_mesh->regularMesh();
  fem_space = new fe_space_t(mesh, template_element, dg_template_element);
  u_int n_ele = mesh.n_geometry(DIM);
  fem_space->element().resize(n_ele);
  for (u_int i = 0;i < n_ele;i ++) {
    if (mesh.geometry(DIM,i).n_vertex() == 3) {
      fem_space->element(i).reinit(*fem_space, i, 0);
    } else {
      fem_space->element(i).reinit(*fem_space, i, 1);
    }
  }
  fem_space->buildElement();
  fem_space->buildDof();
  fem_space->buildDofBoundaryMark();

  u_int n_dg_ele = mesh.n_geometry(DIM-1);
  fem_space->dgElement().resize(n_dg_ele);
  for (u_int i = 0;i < n_dg_ele;i ++)
    fem_space->dgElement(i).reinit(*fem_space, i, 0);
  fem_space->buildDGElement();

  /**
   * 此时有限元空间被重新建立,我们重新设置数据交换器的打包器,并将旗标
   * 设置为真。
   */
  syncer.set_packer(data_packer_t::get_packer(*fem_space));
  is_update_transmit_map = true;

  /**< 初始化缓冲 */
  init_element_cache();
  init_edge_cache();
}
void App::build_femspace() 
{
  mesh_t& mesh = ir_mesh->regularMesh();
  fem_space = new fe_space_t(mesh, template_element, dg_template_element);
  u_int n_ele = mesh.n_geometry(DIM);
  fem_space->element().resize(n_ele);
  for (u_int i = 0;i < n_ele;i ++) 
  {
    if (mesh.geometry(DIM,i).n_vertex() == 3) 
    {
      fem_space->element(i).reinit(*fem_space, i, 0);
    } 
    else 
    {
      fem_space->element(i).reinit(*fem_space, i, 1);
    }
  }
  fem_space->buildElement();
  fem_space->buildDof();
  fem_space->buildDofBoundaryMark();
  
  u_int n_side=mesh.n_geometry(DIM-1);
  u_int n_dg_ele=0;
  for (u_int i = 0;i < n_side;++ i) 
  {
    if (mesh.geometry(DIM-1,i).boundaryMark() > 0) 
    {
      n_dg_ele += 1;
    }
  }
  fem_space->dgElement().resize(n_dg_ele);
  for( u_int i=0, j=0;i< n_side;++ i)
    if (mesh.geometry(DIM-1,i).boundaryMark()>0) 
    { 
      fem_space->dgElement(j).reinit(*fem_space,i,0);
      j+=1;
    }
  fem_space->buildDGElement(); 

  if(global_index!=NULL) 
  delete global_index; global_index=NULL;

  MPI_Barrier(htree.communicator()); 

  global_index=new global_index_t(htree,*fem_space);
 
  global_index->build();
  
  phi_h = new fe_func_t(*fem_space);
  alpha_h = new fe_func_t(*fem_space);
  c_h = new fe_func_t(*fem_space);
  u_h = new fe_func_t(*fem_space);
  v_h = new fe_func_t(*fem_space);
  p_h = new fe_func_t(*fem_space);
  last_p_h = new fe_func_t(*fem_space);

  if (noise_c!=NULL) delete noise_c,noise_phi;noise_c=NULL;noise_phi=NULL;
  noise_c=new std::vector<double>(n_ele,0);
  noise_phi=new std::vector<double>(n_ele,0);

  //init_edge_cache();
  init_element_cache();
}