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; }