[Commits] [svn:einsteintoolkit] TwoPunctures/branches/momentum_constraint/src/ (Rev. 114)
roland.haas at physics.gatech.edu
roland.haas at physics.gatech.edu
Mon Jul 19 15:57:25 CDT 2010
User: rhaas
Date: 2010/07/19 03:57 PM
Modified:
/branches/momentum_constraint/src/
TP_utilities.c
Log:
TwoPunctures: add caching of cos() to chebft_Zeros
For grid_setup_method = "evolution" and npoints_A=npoints_B=20, npoints_phi=4
TwoPunctures spends about 90% (of about 2h) of the time in chebft_Zeros. With
this patch it is about 77% (of 10min).
For taylor-expansion most of the time is spend in LinRelax, which is fine.
Best might be to actually construct the full set of spectral coefficients and
then only to chebev/fourev instead of always going from collocation points to
spectral rep. then evaluate (trades memory for speed).
File Changes:
Directory: /branches/momentum_constraint/src/
=============================================
File [modified]: TP_utilities.c
Delta lines: +33 -2
===================================================================
--- branches/momentum_constraint/src/TP_utilities.c 2010-07-19 13:46:41 UTC (rev 113)
+++ branches/momentum_constraint/src/TP_utilities.c 2010-07-19 20:57:25 UTC (rev 114)
@@ -244,12 +244,43 @@
}
/*--------------------------------------------------------------------------*/
+#define COSCACHE_N_MAX 256
+static CCTK_REAL *
+chebft_Zeros_cache (int n)
+ /* caches values of cos (Pi/n * j * (k + 0.5)) */
+{
+ int j, k;
+ CCTK_REAL Pion;
+ static CCTK_REAL *cache[COSCACHE_N_MAX];
+ assert(n <= COSCACHE_N_MAX);
+
+ if(cache[n-1] == NULL)
+ {
+#pragma omp critical
+ if(cache[n-1] == NULL) /* check again in case some other thread allocated storage in omp critical sync */
+ {
+ /* set up new cache */
+ cache[n-1] = dvector(0, n*n-1);
+ /* TODO: add method to free allocated memory */
+ Pion = Pi/n;
+ for (j = 0; j < n; j++)
+ for (k = 0; k < n; k++)
+ cache[n-1][j+k*n] = cos (Pion * j * (k + 0.5));
+ }
+ }
+
+ assert(cache[n-1]);
+ return cache[n-1];
+}
+
+/*--------------------------------------------------------------------------*/
void
chebft_Zeros (CCTK_REAL u[], int n, int inv)
/* eq. 5.8.7 and 5.8.8 at x = (5.8.4) of 2nd edition C++ NR */
{
int k, j, isignum;
CCTK_REAL fac, sum, Pion, *c;
+ CCTK_REAL *Cos = chebft_Zeros_cache(n);
c = dvector (0, n);
Pion = Pi / n;
@@ -261,7 +292,7 @@
{
sum = 0.0;
for (k = 0; k < n; k++)
- sum += u[k] * cos (Pion * j * (k + 0.5));
+ sum += u[k] * Cos[j+k*n]; /*cos (Pion * j * (k + 0.5))*/
c[j] = fac * sum * isignum;
isignum = -isignum;
}
@@ -274,7 +305,7 @@
isignum = 1;
for (k = 0; k < n; k++)
{
- sum += u[k] * cos (Pion * (j + 0.5) * k) * isignum;
+ sum += u[k] * Cos[k+j*n] * isignum; /*cos (Pion * (j + 0.5) * k)*/
isignum = -isignum;
}
c[j] = sum;
More information about the Commits
mailing list