void DFTBase::scalar(const var& iVar, var& oVar) const { // Check the arrays are OK if (iVar.type() != TYPE_ARRAY) throw error("DFTBase::scalar: DFTBase input must be vector"); if (oVar.type() != TYPE_ARRAY) throw error("DFTBase::scalar: DFTBase output must be vector"); if (iVar.atype() != (mImpl->inverse ? mImpl->inverseType.type() : mImpl->forwardType.type() )) throw error("DFTBase::scalar: wrong input type"); if (oVar.atype() != (mImpl->inverse ? mImpl->forwardType.type() : mImpl->inverseType.type() )) throw error("DFTBase::scalar: wrong output type"); // DFTBase always broadcasts to vector() broadcast(iVar, oVar); // MKL does not include the divide by N on the inverse if (mImpl->inverse) oVar /= mImpl->oSize; }
void Transpose::vector(var iVar, ind iOffsetI, var& oVar, ind iOffsetO) const { assert(oVar); int dim = iVar.dim(); ind rows = iVar.shape(dim-2); ind cols = iVar.shape(dim-1); if (iVar.is(oVar)) // In place transpose switch (iVar.atype()) { case TYPE_FLOAT: inPlace<float>(oVar.ptr<float>(iOffsetO), rows, cols); break; case TYPE_DOUBLE: inPlace<double>(oVar.ptr<double>(iOffsetO), rows, cols); break; default: throw error("Transpose::vector(): unknown type"); } else // Transpose to new location switch (iVar.atype()) { case TYPE_FLOAT: outOfPlace<float>(iVar.ptr<float>(iOffsetI), rows, cols, oVar.ptr<float>(iOffsetO)); break; case TYPE_DOUBLE: outOfPlace<double>(iVar.ptr<double>(iOffsetI), rows, cols, oVar.ptr<double>(iOffsetO)); break; default: throw error("Transpose::vector(): unknown type"); } }