From 61f3bcc30816c82152ab9c08b7bd29ea730f89d8 Mon Sep 17 00:00:00 2001
From: sniklas142 <niklas.schnierstein@googlemail.com>
Date: Fri, 4 Oct 2019 09:20:10 +0200
Subject: [PATCH] added vorticity field to ou process

---
 cpp/full_code/ornstein_uhlenbeck_process.cpp | 34 ++++++++++++++++++++
 cpp/full_code/ornstein_uhlenbeck_process.hpp |  3 ++
 2 files changed, 37 insertions(+)

diff --git a/cpp/full_code/ornstein_uhlenbeck_process.cpp b/cpp/full_code/ornstein_uhlenbeck_process.cpp
index 6e6893fe..00479dd2 100644
--- a/cpp/full_code/ornstein_uhlenbeck_process.cpp
+++ b/cpp/full_code/ornstein_uhlenbeck_process.cpp
@@ -28,6 +28,12 @@ ornstein_uhlenbeck_process<rnumber,be>::ornstein_uhlenbeck_process(
         nx,ny,nz, MPI_COMM_WORLD, FFTW_PLAN_RIGOR);
     *this->ou_field = 0.0;
     this->ou_field->dft(); //have it complex all zero TODO:Ask Chichi
+
+    this->ou_field_vort = new field<rnumber,be,THREE>(
+        nx,ny,nz, MPI_COMM_WORLD, FFTW_PLAN_RIGOR);
+    *this->ou_field_vort = 0.0;
+    this->ou_field_vort->dft();
+
     this->B = new field<rnumber,be,THREExTHREE>(
         nx,ny,nz, MPI_COMM_WORLD, FFTW_PLAN_RIGOR);
 
@@ -48,6 +54,7 @@ ornstein_uhlenbeck_process<rnumber,be>::~ornstein_uhlenbeck_process()
     TIMEZONE("ornstein_uhlenbeck_process::~ornstein_uhlenbeck_process");
     delete this->kk;
     delete this->ou_field;
+    delete this->ou_field_vort;
     delete this->B;
 }
 
@@ -81,6 +88,9 @@ void ornstein_uhlenbeck_process<rnumber,be>::step(
 
         }
     });
+
+    this->calc_ou_vorticity();
+
     // this->ou_field->symmetrize(); ???
 }
 
@@ -244,6 +254,30 @@ void ornstein_uhlenbeck_process<rnumber,be>::add_to_field_gaussian(
   );
 }
 
+template <class rnumber, field_backend be>
+void ornstein_uhlenbeck_process<rnumber,be>::calc_ou_vorticity(void)
+{
+  this->kk->CLOOP_K2(
+              [&](ptrdiff_t cindex,
+                  ptrdiff_t xindex,
+                  ptrdiff_t yindex,
+                  ptrdiff_t zindex,
+                  double k2){
+      if (k2 <= this->kk->kM2)
+      {
+          this->ou_field_vort->cval(cindex,0,0) = -(this->kk->ky[yindex]*this->ou_field->cval(cindex,2,1) - this->kk->kz[zindex]*this->ou_field->cval(cindex,1,1));
+          this->ou_field_vort->cval(cindex,0,1) =  (this->kk->ky[yindex]*this->ou_field->cval(cindex,2,0) - this->kk->kz[zindex]*this->ou_field->cval(cindex,1,0));
+          this->ou_field_vort->cval(cindex,1,0) = -(this->kk->kz[zindex]*this->ou_field->cval(cindex,0,1) - this->kk->kx[xindex]*this->ou_field->cval(cindex,2,1));
+          this->ou_field_vort->cval(cindex,1,1) =  (this->kk->kz[zindex]*this->ou_field->cval(cindex,0,0) - this->kk->kx[xindex]*this->ou_field->cval(cindex,2,0));
+          this->ou_field_vort->cval(cindex,2,0) = -(this->kk->kx[xindex]*this->ou_field->cval(cindex,1,1) - this->kk->ky[yindex]*this->ou_field->cval(cindex,0,1));
+          this->ou_field_vort->cval(cindex,2,1) =  (this->kk->kx[xindex]*this->ou_field->cval(cindex,1,0) - this->kk->ky[yindex]*this->ou_field->cval(cindex,0,0));
+      }
+      else
+          std::fill_n((rnumber*)(this->ou_field_vort->get_cdata()+3*cindex), 6, 0.0);
+  }
+  );
+  this->ou_field_vort->symmetrize();
+}
 
 template class ornstein_uhlenbeck_process<float,FFTW>;
 template class ornstein_uhlenbeck_process<double,FFTW>;
diff --git a/cpp/full_code/ornstein_uhlenbeck_process.hpp b/cpp/full_code/ornstein_uhlenbeck_process.hpp
index 6883c965..768025e2 100644
--- a/cpp/full_code/ornstein_uhlenbeck_process.hpp
+++ b/cpp/full_code/ornstein_uhlenbeck_process.hpp
@@ -22,6 +22,7 @@ class ornstein_uhlenbeck_process{
         double ou_energy_amplitude;
 
         field<rnumber,be,THREE> *ou_field;
+        field<rnumber,be,THREE> *ou_field_vort;
         field<rnumber,be,THREExTHREE> *B;
         // field<rnumber,be,ONE> *number_of_modes;
         kspace<be,SMOOTH> *kk;
@@ -61,6 +62,8 @@ class ornstein_uhlenbeck_process{
         void add_to_field_replace(
           field<rnumber,be,THREE> *src);
 
+        void calc_ou_vorticity(void);
+
 
 };
 
-- 
GitLab