diff options
Diffstat (limited to 'src/metrics/Gowdy_wave.F')
-rw-r--r-- | src/metrics/Gowdy_wave.F | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/src/metrics/Gowdy_wave.F b/src/metrics/Gowdy_wave.F new file mode 100644 index 0000000..580841c --- /dev/null +++ b/src/metrics/Gowdy_wave.F @@ -0,0 +1,246 @@ +C @@ +C @file Gowdy.F77 +C @date December 2002 +C @author Denis Pollney +C @desc +C Cosmological Gowdy metric for a polarized wave in an +C expanding universe. See +C "Stable 3-level leapfrog integration in numerical relativity" +C New, K, Watt, K, Misner, C and Centrella, J, PRD 58, 064022. +C @desc +C @version $Header$ +C @@ + +#include "cctk.h" +#include "cctk_Parameters.h" + + subroutine Exact__Gowdy_wave( + $ x, y, z, t, + $ gdtt, gdtx, gdty, gdtz, + $ gdxx, gdyy, gdzz, gdxy, gdyz, gdzx, + $ gutt, gutx, guty, gutz, + $ guxx, guyy, guzz, guxy, guyz, guzx, + $ psi, Tmunu_flag) + + implicit none + + DECLARE_CCTK_PARAMETERS + +c input arguments + CCTK_REAL z, t + CCTK_DECLARE(CCTK_REAL, x,) + CCTK_DECLARE(CCTK_REAL, y,) + +c output arguments + CCTK_REAL gdtt, gdtx, gdty, gdtz, + $ gdxx, gdyy, gdzz, gdxy, gdyz, gdzx, + $ gutt, gutx, guty, gutz, + $ guxx, guyy, guzz, guxy, guyz, guzx + CCTK_DECLARE(CCTK_REAL, psi,) + LOGICAL Tmunu_flag + +c local static variables + logical firstcall + CCTK_REAL amp + CCTK_REAL PI, twoPI + CCTK_REAL Bessel_J0, Bessel_J1 + data firstcall /.true./ + save firstcall, amp, PI, twoPI, Bessel_J0, Bessel_J1 +c$omp threadprivate (firstcall, amp, PI, twoPI, Bessel_J0, Bessel_J1) + +c local variables + CCTK_REAL Bessel_J0_t, Bessel_J1_t + CCTK_REAL cosz, eP, lambda + CCTK_REAL d1, d2, d3, d4, d5, d6 + +C This is a vacuum spacetime with no cosmological constant + Tmunu_flag = .false. + + if (firstcall) then + amp = Gowdy_wave__amplitude + PI = acos(-1.d0) + twoPI = 2.d0*PI + call jy01a(twoPI, Bessel_J0, d1, Bessel_J1, d2, d3, d4, d5, d6) + firstcall = .false. + end if + + if (t.eq.0.d0) then + call CCTK_WARN(0, "The Gowdy metric is singular for t=0. You may need to set cactus::cctk_initial_time > 0.") + end if + + call jy01a(twoPI*t, Bessel_J0_t, d1, Bessel_J1_t, d2, d3, d4, d5, d6) + + cosz = cos(twoPI*z) + eP = exp(Bessel_J0_t * cosz) + + lambda = amp * (-twoPI * t * Bessel_J0_t * Bessel_J1_t * cosz**2 + + + twoPI * PI * t**2 * (Bessel_J0_t**2 + Bessel_J1_t**2) + + - 0.5d0 * (twoPI**2 * (Bessel_J0**2 + Bessel_J1**2) + + - twoPI * Bessel_J0 * Bessel_J1)) +c +c lower metric components. +c + gdtt = -exp(0.5d0*lambda)/sqrt(t) + gdtx = 0.d0 + gdty = 0.d0 + gdtz = 0.d0 + gdxx = t * eP + gdyy = t / eP + gdzz = -gdtt + gdxy = 0.d0 + gdyz = 0.d0 + gdzx = 0.d0 + +c +c upper metric components. +c + gutt = 1.d0 / gdtt + gutx = 0.d0 + guty = 0.d0 + gutz = 0.d0 + guxx = 1.d0 / gdxx + guyy = 1.d0 / gdyy + guzz = 1.d0 / gdzz + guxy = 0.d0 + guyz = 0.d0 + guzx = 0.d0 + + return + end + +C @@ +C @routine Bessel.F77 +C @date December 2002 +C @author Denis Pollney +C @desc +C Compute bessel functions of 0th and 1st order. +C This routine was downloaded from: +C http://iris-lee3.ece.uiuc.edu/~jjin/routines/routines.html +C +C ======================================================= +C Purpose: Compute Bessel functions J0(x), J1(x), Y0(x), +C Y1(x), and their derivatives +C Input : x --- Argument of Jn(x) & Yn(x) ( x ? 0 ) +C Output: BJ0 --- J0(x) +C DJ0 --- dJ0(x) +C BJ1 --- J1(x) +C DJ1 --- dJ1(x) +C BY0 --- Y0(x) +C DY0 --- dY0(x) +C BY1 --- Y1(x) +C DY1 --- dY1(x) +C ======================================================= +C +C @desc +C @version $Header$ +C @@ + + SUBROUTINE JY01A(X,BJ0,DJ0,BJ1,DJ1,BY0,DY0,BY1,DY1) + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + DIMENSION A(12),B(12),A1(12),B1(12) + PI=3.141592653589793D0 + RP2=0.63661977236758D0 + X2=X*X + IF (X.EQ.0.0D0) THEN + BJ0=1.0D0 + BJ1=0.0D0 + DJ0=0.0D0 + DJ1=0.5D0 + BY0=-1.0D+300 + BY1=-1.0D+300 + DY0=1.0D+300 + DY1=1.0D+300 + RETURN + ENDIF + IF (X.LE.12.0D0) THEN + BJ0=1.0D0 + R=1.0D0 + DO 5 K=1,30 + R=-0.25D0*R*X2/(K*K) + BJ0=BJ0+R + IF (DABS(R).LT.DABS(BJ0)*1.0D-15) GO TO 10 +5 CONTINUE +10 BJ1=1.0D0 + R=1.0D0 + DO 15 K=1,30 + R=-0.25D0*R*X2/(K*(K+1.0D0)) + BJ1=BJ1+R + IF (DABS(R).LT.DABS(BJ1)*1.0D-15) GO TO 20 +15 CONTINUE +20 BJ1=0.5D0*X*BJ1 + EC=DLOG(X/2.0D0)+0.5772156649015329D0 + CS0=0.0D0 + W0=0.0D0 + R0=1.0D0 + DO 25 K=1,30 + W0=W0+1.0D0/K + R0=-0.25D0*R0/(K*K)*X2 + R=R0*W0 + CS0=CS0+R + IF (DABS(R).LT.DABS(CS0)*1.0D-15) GO TO 30 +25 CONTINUE +30 BY0=RP2*(EC*BJ0-CS0) + CS1=1.0D0 + W1=0.0D0 + R1=1.0D0 + DO 35 K=1,30 + W1=W1+1.0D0/K + R1=-0.25D0*R1/(K*(K+1))*X2 + R=R1*(2.0D0*W1+1.0D0/(K+1.0D0)) + CS1=CS1+R + IF (DABS(R).LT.DABS(CS1)*1.0D-15) GO TO 40 +35 CONTINUE +40 BY1=RP2*(EC*BJ1-1.0D0/X-0.25D0*X*CS1) + ELSE + DATA A/-.7031250000000000D-01,.1121520996093750D+00, + & -.5725014209747314D+00,.6074042001273483D+01, + & -.1100171402692467D+03,.3038090510922384D+04, + & -.1188384262567832D+06,.6252951493434797D+07, + & -.4259392165047669D+09,.3646840080706556D+11, + & -.3833534661393944D+13,.4854014686852901D+15/ + DATA B/ .7324218750000000D-01,-.2271080017089844D+00, + & .1727727502584457D+01,-.2438052969955606D+02, + & .5513358961220206D+03,-.1825775547429318D+05, + & .8328593040162893D+06,-.5006958953198893D+08, + & .3836255180230433D+10,-.3649010818849833D+12, + & .4218971570284096D+14,-.5827244631566907D+16/ + DATA A1/.1171875000000000D+00,-.1441955566406250D+00, + & .6765925884246826D+00,-.6883914268109947D+01, + & .1215978918765359D+03,-.3302272294480852D+04, + & .1276412726461746D+06,-.6656367718817688D+07, + & .4502786003050393D+09,-.3833857520742790D+11, + & .4011838599133198D+13,-.5060568503314727D+15/ + DATA B1/-.1025390625000000D+00,.2775764465332031D+00, + & -.1993531733751297D+01,.2724882731126854D+02, + & -.6038440767050702D+03,.1971837591223663D+05, + & -.8902978767070678D+06,.5310411010968522D+08, + & -.4043620325107754D+10,.3827011346598605D+12, + & -.4406481417852278D+14,.6065091351222699D+16/ + K0=12 + IF (X.GE.35.0) K0=10 + IF (X.GE.50.0) K0=8 + T1=X-0.25D0*PI + P0=1.0D0 + Q0=-0.125D0/X + DO 45 K=1,K0 + P0=P0+A(K)*X**(-2*K) +45 Q0=Q0+B(K)*X**(-2*K-1) + CU=DSQRT(RP2/X) + BJ0=CU*(P0*DCOS(T1)-Q0*DSIN(T1)) + BY0=CU*(P0*DSIN(T1)+Q0*DCOS(T1)) + T2=X-0.75D0*PI + P1=1.0D0 + Q1=0.375D0/X + DO 50 K=1,K0 + P1=P1+A1(K)*X**(-2*K) +50 Q1=Q1+B1(K)*X**(-2*K-1) + CU=DSQRT(RP2/X) + BJ1=CU*(P1*DCOS(T2)-Q1*DSIN(T2)) + BY1=CU*(P1*DSIN(T2)+Q1*DCOS(T2)) + ENDIF + DJ0=-BJ1 + DJ1=BJ0-BJ1/X + DY0=-BY1 + DY1=BY0-BY1/X + RETURN + END |