Add OpenMP parallelism
[ctsim.git] / libctsim / filter.cpp
index 221f617f869a716f759ef49349db6253442e5041..6382b5609497d5bc5b37e9e08c4ab3a049e54561 100644 (file)
@@ -7,9 +7,7 @@
 **     Date Started:           Aug 1984
 **
 **  This is part of the CTSim program
-**  Copyright (c) 1983-2000 Kevin Rosenberg
-**
-**  $Id$
+**  Copyright (c) 1983-2009 Kevin Rosenberg
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License (version 2) as
@@ -200,10 +198,14 @@ SignalFilter::~SignalFilter (void)
 void
 SignalFilter::createFrequencyFilter (double* adFilter) const
 {
-  double x;
-  int i;
-  for (x = m_dFilterMin, i = 0; i < m_nFilterPoints; x += m_dFilterInc, i++)
+  double xstart = m_dFilterMin;
+#if HAVE_OPENMP
+  #pragma omp parallel for
+#endif
+  for (int i = 0; i < m_nFilterPoints; i++) {
+    double x = xstart + (i * m_dFilterInc);
     adFilter[i] = frequencyResponse (x);
+  }
 }
 
 
@@ -220,8 +222,12 @@ SignalFilter::createSpatialFilter (double* adFilter) const
     for (int i = 1; i <= sidelen; i++ )
       m_adFilter [center + i] = m_adFilter [center - i] = c / (4 * (i * i) - 1);
   } else {
-    double x = m_dFilterMin;
-    for (int i = 0; i < m_nFilterPoints; i++, x += m_dFilterInc) {
+    double xstart = m_dFilterMin;
+#if HAVE_OPENMP
+    #pragma omp parallel for
+#endif
+    for (int i = 0; i < m_nFilterPoints; i++) {
+      double x = xstart + (i * m_dFilterInc);
       if (haveAnalyticSpatial(m_idFilter))
         m_adFilter[i] = spatialResponseAnalytic (x);
       else
@@ -235,11 +241,12 @@ SignalFilter::convertFilterNameToID (const char *filterName)
 {
   int filterID = FILTER_INVALID;
 
-  for (int i = 0; i < s_iFilterCount; i++)
+  for (int i = 0; i < s_iFilterCount; i++) {
     if (strcasecmp (filterName, s_aszFilterName[i]) == 0) {
       filterID = i;
       break;
     }
+  }
 
     return (filterID);
 }
@@ -260,9 +267,9 @@ SignalFilter::convertFilterIDToTitle (const int filterID)
 {
   static const char *title = "";
 
-  if (filterID >= 0 && filterID < s_iFilterCount)
+  if (filterID >= 0 && filterID < s_iFilterCount) {
     return (s_aszFilterTitle [filterID]);
-
+  }
   return (title);
 }
 
@@ -271,13 +278,13 @@ SignalFilter::convertDomainNameToID (const char* const domainName)
 {
   int dID = DOMAIN_INVALID;
 
-  for (int i = 0; i < s_iDomainCount; i++)
+  for (int i = 0; i < s_iDomainCount; i++) {
     if (strcasecmp (domainName, s_aszDomainName[i]) == 0) {
       dID = i;
       break;
     }
-
-    return (dID);
+  }
+  return (dID);
 }
 
 const char *