]> git.unchartedbackwaters.co.uk Git - francis/ofc.git/commitdiff
Add conversion from reciprocal to psinc space.
authorFrancis Russell <francis@unchartedbackwaters.co.uk>
Thu, 3 May 2012 00:00:21 +0000 (01:00 +0100)
committerFrancis Russell <francis@unchartedbackwaters.co.uk>
Thu, 3 May 2012 00:00:21 +0000 (01:00 +0100)
src/ofc/generators/onetep/FieldFragment.scala
src/ofc/generators/onetep/Laplacian.scala
src/ofc/generators/onetep/PPDFunctionSet.scala
src/ofc/generators/onetep/ReciprocalToPsinc.scala [new file with mode: 0644]

index cd954d647c534607af7664ec2056db28c13db690..1ccc07ce0fee55b65a55baaba7ca1c2ec68a82c6 100644 (file)
@@ -3,9 +3,12 @@ import ofc.codegen._
 
 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
index 5f771f725ee388559f5ac0af5d8daa8b37cce03f..f1bf392bccdd1c5b7ebee64459d42f56b1253443 100644 (file)
@@ -63,6 +63,8 @@ class Laplacian(op: Field)  extends Field {
     def getSize = opFragment.getSize
 
     def getBuffer = transformed
+
+    def toPsinc = new ReciprocalToPsinc(this)
   }
   
   private def getOperand = op
index 754e0e7bacd110bb849bafbd283d2e66ee030631..84267a74d55ad1b830495c9ec8ae0c8d4e2bcd8c 100644 (file)
@@ -157,6 +157,8 @@ class PPDFunctionSet(basisName: String, dataName: String, indices: Seq[NamedInde
     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
diff --git a/src/ofc/generators/onetep/ReciprocalToPsinc.scala b/src/ofc/generators/onetep/ReciprocalToPsinc.scala
new file mode 100644 (file)
index 0000000..52bcd6b
--- /dev/null
@@ -0,0 +1,27 @@
+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)
+}