diff --git a/fdelmodc/fdelmodc.c b/fdelmodc/fdelmodc.c
index 4b4938872833e7c65978c11759184cf33f66854a..c803803f88d056c6b617cdf9c92068c54836153d 100644
--- a/fdelmodc/fdelmodc.c
+++ b/fdelmodc/fdelmodc.c
@@ -12,7 +12,7 @@
 
 double wallclock_time(void);
 
-void threadAfficity(void);
+void threadAffinity(void);
 
 int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *src, shotPar *shot, bndPar *bnd, int verbose);
 
@@ -505,7 +505,7 @@ shared (tt, t2, t3) \
 shared (shot, bnd, mod, src, wav, rec, ixsrc, izsrc, it, src_nwav, verbose)
 {
 			if (it==it0) {
-				threadAfficity();
+				threadAffinity();
 			}
 			switch ( mod.ischeme ) {
 //				case -2 : /* test code for PML */
diff --git a/fdelmodc/threadAffinity.c b/fdelmodc/threadAffinity.c
new file mode 100644
index 0000000000000000000000000000000000000000..8a49f7dafa56b024b72348611fad16d82ddc7472
--- /dev/null
+++ b/fdelmodc/threadAffinity.c
@@ -0,0 +1,107 @@
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <omp.h>
+
+#ifdef __USE_GNU
+#include <sched.h>
+#else /* for OSX */
+
+#include <sched.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+#define CPU_SETSIZE	1024
+#define SYSCTL_CORE_COUNT   "machdep.cpu.core_count"
+
+typedef struct cpu_set {
+  uint32_t    count;
+} cpu_set_t;
+
+static inline void
+CPU_ZERO(cpu_set_t *cs) { cs->count = 0; }
+
+static inline void
+CPU_SET(int num, cpu_set_t *cs) { cs->count |= (1 << num); }
+
+static inline int
+CPU_ISSET(int num, cpu_set_t *cs) { return (cs->count & (1 << num)); }
+
+int sched_getaffinity(pid_t pid, size_t cpu_size, cpu_set_t *cpu_set)
+{
+  int32_t core_count = 0;
+  size_t  len = sizeof(core_count);
+  int ret = sysctlbyname(SYSCTL_CORE_COUNT, &core_count, &len, 0, 0);
+  if (ret) {
+    printf("error while get core count %d\n", ret);
+    return -1;
+  }
+  cpu_set->count = 0;
+  for (int i = 0; i < core_count; i++) {
+    cpu_set->count |= (1 << i);
+  }
+
+  return 0;
+}
+#endif
+
+/* Borrowed from util-linux-2.13-pre7/schedutils/taskset.c */
+
+static char *cpuset_to_cstr(cpu_set_t *mask, char *str)
+{
+  char *ptr = str;
+  int i, j, entry_made = 0;
+  for (i = 0; i < CPU_SETSIZE; i++) {
+    if (CPU_ISSET(i, mask)) {
+      int run = 0;
+      entry_made = 1;
+      for (j = i + 1; j < CPU_SETSIZE; j++) {
+        if (CPU_ISSET(j, mask)) run++;
+        else break;
+      }
+      if (!run)
+        sprintf(ptr, "%d,", i);
+      else if (run == 1) {
+        sprintf(ptr, "%d,%d,", i, i + 1);
+        i++;
+      } else {
+        sprintf(ptr, "%d-%d,", i, i + run);
+        i += run;
+      }
+      while (*ptr != 0) ptr++;
+    }
+  }
+  ptr -= entry_made;
+  *ptr = 0;
+  return(str);
+}
+
+void threadAffinity(void)
+{
+  int rank, thread;
+  cpu_set_t coremask;
+  char clbuf[7 * CPU_SETSIZE], hnbuf[64];
+  char prefix[200];
+
+  memset(clbuf, 0, sizeof(clbuf));
+  memset(hnbuf, 0, sizeof(hnbuf));
+  (void)gethostname(hnbuf, sizeof(hnbuf));
+
+    strcpy(prefix,"Hello world from");
+
+//  #pragma omp parallel private(thread, coremask, clbuf)
+/* for use inside parallel region */
+  #pragma omp critical
+  {
+    thread = omp_get_thread_num();
+    (void)sched_getaffinity(0, sizeof(coremask), &coremask);
+    cpuset_to_cstr(&coremask, clbuf);
+    printf("%s thread %d,               on %s. (core affinity = %s)\n",
+	   prefix, thread, hnbuf, clbuf);
+
+  }
+  return;
+}
+