trait FieldFragment extends Fragment {
def toReciprocal : ReciprocalFragment
+ def toPsinc : PsincFragment
}
-trait PsincFragment extends FieldFragment
+trait PsincFragment extends FieldFragment {
+ def toPsinc = this
+}
trait ReciprocalFragment extends FieldFragment {
def toReciprocal = this
def getSize = for (dim <- 0 to 2) yield OnetepTypes.FFTBoxInfo.public % OnetepTypes.FFTBoxInfo.totalPts(dim)
def getBuffer = reciprocalBox
+
+ def toPsinc = new ReciprocalToPsinc(this)
}
private def getSphereIndex = indices.head
--- /dev/null
+package ofc.generators.onetep
+import ofc.codegen._
+
+class ReciprocalToPsinc(op: ReciprocalFragment) extends PsincFragment {
+ val fftbox = new DeclaredVarSymbol[ArrayType[FloatType]]("fftbox", new ArrayType[FloatType](3))
+
+ def toReciprocal = op
+
+ def setup(context: GenerationContext) {
+ op.setup(context)
+ context.addDeclaration(fftbox)
+
+ val fftboxSize : Seq[Expression[IntType]] = getSize
+ context += new AllocateStatement(fftbox, fftboxSize)
+
+ val fourierParams : Seq[Expression[_]] = Seq(new CharLiteral('C'), new CharLiteral('B'), fftbox, fftbox, op.getBuffer)
+ context += new FunctionCallStatement(new FunctionCall(OnetepFunctions.fourier_apply_box_pair, fourierParams))
+
+ op.teardown(context)
+ }
+
+ def teardown(context: GenerationContext) {
+ context += new DeallocateStatement(fftbox)
+ }
+
+ def getSize = for (dim <- 0 to 2) yield OnetepTypes.FFTBoxInfo.public % OnetepTypes.FFTBoxInfo.totalPts(dim)
+}