Exemplo n.º 1
0
void stiffnessTestHelper(StrainEne * ene)
{
  float h = 0.001f;
//  ElementRegGrid * grid = new ElementRegGrid(1, 1, 1);
  ElementMesh * grid = new ElementMesh();
  grid->dim = 2;
  std::ifstream in("../quads3.txt");
  grid->load(in, 0.5f);
  int dim = grid->dim;

  MaterialQuad * material = new MaterialQuad(ene);
  if(dim==2){
    material->q = &(Quadrature::Gauss2_2D);
    material->e.resize(material->q->x.size(),ene);
  }

  grid->m.push_back(material);
  material->init(grid);
   grid->x[1][0] += 0.1f;
  grid->x[3][1] += 0.2f;
  MatrixXf KAna = grid->getStiffness();
  int nVar = (int)grid->X.size();
  MatrixXf K(dim*nVar,dim*nVar);
  std::cout<<K.mm<<" K size\n";

  //check each partial derivative
  for(unsigned int ii = 0;ii<grid->x.size();ii++){
    for(int jj = 0; jj<dim; jj++){
      grid->x[ii][jj] -= h;
      std::vector<Vector3f>fminus = grid->getForce();
      grid->x[ii][jj] += 2*h;
      std::vector<Vector3f>fplus = grid->getForce();
      grid->x[ii][jj] -=h;
      for(unsigned int kk = 0;kk<fminus.size();kk++){
        fplus[kk] -= fminus[kk];
        fplus[kk] /= 2*h;
        for(int ll = 0;ll<dim;ll++){
          K(dim*kk+ll,dim*ii+jj)=-fplus[kk][ll];
        }
      }
    }
  }

  std::cout<<"Ana K:\n";
  KAna.print(std::cout);
  std::cout<<"\n";
  std::cout<<"Num K:\n";
  K.print(std::cout);
  std::cout<<"\n";

  float maxErr = 0;
  for(int ii = 0;ii<K.mm;ii++){
    for(int jj =0 ;jj<K.nn;jj++){
      float err = (float)std::abs(KAna(ii,jj)-K(ii,jj));
      if(err>maxErr){
        maxErr = err;
      }
    }
  }
  std::cout<<"max err "<<maxErr<<"\n";

  delete grid;
  delete material;
}