From 1e16f5a132e6b0d62720adb2839c6b9df51db736 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (laptop)" <j.wuttke@fz-juelich.de>
Date: Fri, 19 Sep 2008 19:48:18 +0200
Subject: [PATCH] =?UTF-8?q?OprFunctional=20vereinfacht=20und=20um=20Ableit?=
 =?UTF-8?q?ung=20erg=C3=A4nzt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/opr.cpp | 58 +++++++++++++++++++++++++++++++----------------------
 1 file changed, 34 insertions(+), 24 deletions(-)

diff --git a/src/opr.cpp b/src/opr.cpp
index 03aa3fa1..2bc28f02 100644
--- a/src/opr.cpp
+++ b/src/opr.cpp
@@ -768,31 +768,23 @@ void NOperate::CalcAvgeDiff()
 //* functional operations                                                   *//
 //***************************************************************************//
 
-namespace NFunctionalIntgr {
-    void Prep(void);
-    int  Exec(int fno, COld *fin, COld *fout);
-}
-
-namespace NFunctionalAC {
-    void Prep(void);
-    int  Exec(int fno, COld *fin, COld *fout);
-    static bool normed;
-}
-
 namespace NFunctional {
     int (*exec) (int fno, COld *fin, COld *fout);
-};
+    int  Deriv(int fno, COld *fin, COld *fout);
+    int  Integr(int fno, COld *fin, COld *fout);
+    int  Autocorr(int fno, COld *fin, COld *fout);
+    static bool normalized;
+}
 
 void NFunctional::Opr(string cmd) 
 {
     if        (cmd=="fi") {
-        exec = NFunctionalIntgr::Exec;
+        exec = NFunctional::Integr;
     } else if (cmd=="fd") {
-        cout << "not implemented\n";
-        //exec = NFunctionalDeriv::Exec;
+        exec = NFunctional::Deriv;
     } else if (cmd=="fac") {
-        NFunctionalAC::Prep(); 
-        exec = NFunctionalAC::Exec;
+        normalized = bask("normalize to ac(0)=1", normalized);
+        exec = NFunctional::Autocorr;
     } else {
         printf("Functional operations:\n"
                "  ofd  derivative\n"
@@ -804,7 +796,30 @@ void NFunctional::Opr(string cmd)
     NOlm::OlfLoop(exec);
 };
 
-int NFunctionalIntgr::Exec(int fno, COld *fin, COld *fout)
+int NFunctional::Deriv(int fno, COld *fin, COld *fout)
+{
+    fout->yco.name = "d" + fin->yco.name + " / d" + fin->xco.name;
+    fout->yco.unit = fin->yco.unit + " / " + fin->xco.unit;
+
+    CGrid *xin, *xout;
+    vector<double> *yin, *yout;
+    double dx;
+    for (uint j=0; j<fin->VS.size(); j++) {
+        xin = &(fin->VS[j].x);
+        yin = &(fin->VS[j].y);
+        fout->VS[j].x.clear();
+        fout->VS[j].y.clear();
+        for( uint i=0; i<yin->size()-1; ++i ){
+            dx = (*xin)[i+1] - (*xin)[i];
+            fout->VS[j].push_back(
+                ((*xin)[i+1] + (*xin)[i] ) / 2,
+                dx==0 ? 0 : ((*yin)[i+1] - (*yin)[i]) / dx );
+        }
+    }
+    return 0;
+}
+
+int NFunctional::Integr(int fno, COld *fin, COld *fout)
 {
     fout->yco.name = "Int d" + fin->xco.name + " " + fin->yco.name;
     fout->yco.unit = fin->xco.unit + " * " + fin->yco.unit;
@@ -829,12 +844,7 @@ int NFunctionalIntgr::Exec(int fno, COld *fin, COld *fout)
     return 0;
 }
 
-void NFunctionalAC::Prep(void)
-{
-    normed = bask("normalize to ac(0)=1", normed);
-}
-
-int NFunctionalAC::Exec(int fno, COld *fin, COld *fout)
+int NFunctional::Autocorr(int fno, COld *fin, COld *fout)
 {
     fout->yco.name = "ac{" + fin->yco.name + "}";
     fout->yco.unit = fin->yco.unit + "^2";
-- 
GitLab