示例#1
0
void PammObject::evaluate( const std::vector<double>& invar, std::vector<double>& outvals, std::vector<std::vector<double> >& der ) const {
  std::vector<std::unique_ptr<Value>> pos;
  for(unsigned i=0; i<pbc.size(); ++i) {
    pos.emplace_back( new Value() );
    if( !pbc[i] ) pos[i]->setNotPeriodic();
    else pos[i]->setDomain( min[i], max[i] );
    // And set the value
    pos[i]->set( invar[i] );
  }

  // convert pointers once
  auto pos_ptr=Tools::unique2raw(pos);

  // Evaluate the set of kernels
  double denom=regulariser; std::vector<double> dderiv( der[0].size(), 0 );
  for(unsigned i=0; i<kernels.size(); ++i) {
    outvals[i]=kernels[i]->evaluate( pos_ptr, der[i] ); denom+=outvals[i];
    for(unsigned j=0; j<der[i].size(); ++j) dderiv[j] += der[i][j];
  }
  // Evaluate the set of derivatives
  for(unsigned i=0; i<kernels.size(); ++i) {
    outvals[i]/=denom;
    for(unsigned j=0; j<der[i].size(); ++j) der[i][j]=der[i][j]/denom - outvals[i]*dderiv[j]/denom;
  }

}
const std::vector<std::vector<std::vector<double>>> ELTensors::DDerivX() {

	std::vector<std::vector<std::vector<double> > > dderiv(9, std::vector<std::vector<double>>(3, std::vector<double>(3)));
	
	for (int i = 3; i != 9; ++i) {
		dderiv[i][0][0] = (1 / dx*dx)* (CellX[1][0][0][i] + CellX[2][0][0][i] - 2 * CellX[0][0][0][i]);
	}

	

	for (int i = 3; i != 9; ++i) {
		dderiv[i][1][1] = (1 / dy*dy)* (CellX[0][1][0][i] + CellX[0][2][0][i] - 2 * CellX[0][0][0][i]);
	}

	



	for (int i = 3; i != 9; ++i) {
		dderiv[i][2][2] = (1 / dz*dz)* (CellX[0][0][1][i] + CellX[0][0][2][i] - 2 * CellX[0][0][0][i]);
	}


	for (int i = 3; i != 9; ++i) {
		dderiv[i][0][1] = (1 / dx*dy)* (CellX[1][1][0][i] - CellX[1][2][0][i] - CellX[2][1][0][i] + CellX[2][2][0][i]);
		dderiv[i][1][0] = dderiv[i][0][1];
	}

	for (int i = 3; i != 9; ++i) {
		dderiv[i][0][2] = (1 / dx*dz)* (CellX[1][0][1][i] - CellX[1][0][2][i] - CellX[2][0][1][i] + CellX[2][0][2][i]);
		dderiv[i][2][0] = dderiv[i][0][2];
	}
	
	for (int i = 3; i !=9; ++i) {
		dderiv[i][1][2] = (1 / dy*dz)* (CellX[0][1][1][i] - CellX[0][2][1][i] - CellX[0][1][2][i] + CellX[0][2][2][i]);
		dderiv[i][2][1] = dderiv[i][1][2];
	}



	return dderiv;

}