/* RSII soln 5d */ /* Direct solver; compute Cheb internally; variable precision */ #include #include #include #include /* REAL float double long double REALTYPE 0 1 2 */ #define REAL double #define REALTYPE 1 #define LAPACK 1 #define Power(x,n) powl(x,n) #define Sqrt(x) sqrtl(x) #define PI 3.1415926535897932384626433832795028841971693993751 #define LICHCUT 0. #define rhval 0.5 REAL rh = rhval ; #define coeffAterm +1. #define Lambda -4. #define EvenR 0 #define EvenA 0 #define NMAX 100 #define NMAX2 40000 #define NMAX3 50000000 REAL multval = -1. ; int NR,NA ; REAL patch[NMAX][NMAX][2] ; long mask[5][NMAX][NMAX] ; int vecpos[NMAX2][3] ; long vecsize, sizeLich ; REAL vecR[NMAX2], vecG[NMAX2], vecbuf[NMAX2], vecbuf2[NMAX2], vecRstore[NMAX2] ; int LichRow[NMAX3], LichCol[NMAX3] ; REAL Lich[NMAX3] ; REAL *Lmat ; REAL DRmat[NMAX][NMAX], DR2mat[NMAX][NMAX], DAmat[NMAX][NMAX], DA2mat[NMAX][NMAX], DA3mat[NMAX][NMAX] ; REAL gmet[5][NMAX][NMAX] ; REAL RF[5][NMAX][NMAX] ; REAL phi[NMAX][NMAX], Ricci[NMAX][NMAX], R2sqr[NMAX][NMAX], R4sqr[NMAX][NMAX] ; REAL dvr[5][NMAX][NMAX], dva[5][NMAX][NMAX], dvrr[5][NMAX][NMAX], dvaa[5][NMAX][NMAX], dvaaa[5][NMAX][NMAX], dvra[5][NMAX][NMAX] ; void initpatches(void), init(void), save(int) ; void calcRicciFlow(REAL *), calcLich(void) ; REAL calcPhi(void) ; void getG(void), storeG(void), updateG(REAL, REAL *) ; REAL valarr[5] ; FILE *fileptr, *fileptrphi, *fileptrRicci, *fileptrR2sqr, *fileptrR4sqr, *fileptrDerivs ; REAL DT ; void unpackLich(void) ; void linsolve(REAL *,REAL *), linsolvechk(REAL *,REAL *) ; REAL norm(REAL *) ; void setupCheb(void) ; int status ; int main (int argc, const char * argv[]) { int iter ; REAL rad,multiplier,residual,Rerr,phimax ; clock_t firsttime, starttime, time1, time2 ; long Lsize, posii, posjj ; #if REALTYPE == 2 printf("\n\nLONG DOUBLE\n\n") ; #elif REALTYPE == 1 printf("\n\nDOUBLE\n\n") ; #else printf("\n\nFLOAT\n\n") ; #endif if(LAPACK!=0 && REALTYPE!=1) { printf("\n\nError - LAPACK must use *double*\n\n") ; exit(1) ; } fileptr = fopen("data.out","w") ; fileptrphi = fopen("phi.out","w") ; fileptrRicci = fopen("Ricci.out","w") ; fileptrR2sqr = fopen("R2sqr.out","w") ; fileptrR4sqr = fopen("R4sqr.out","w") ; fileptrDerivs = fopen("derivs.out","w") ; initpatches() ; init() ; printf("\n\n ** Initial values: NR = %d NA = %d rh = %f Lambda = %f \n\n",NR,NA,rhval,Lambda) ; setupCheb() ; printf("\n\nr coords:\n\n") ; #if REALTYPE == 2 for(posii=0;posii\n") ; fflush(stdout) ; time1 = clock() ; linsolve(vecbuf,vecR) ; unpackLich() ; linsolvechk(vecbuf,vecR) ; for(posii=0;posii=NMAX3) { printf("posLich too large!\n") ; exit(1) ; } } } } else if(jj==0 && EvenA != 1) { for(posjj=0;posjj=NMAX3) { printf("posLich too large!\n") ; exit(1) ; } } } } else { r=patch[ii][jj][0] ; a=patch[ii][jj][1] ; L = Power(-1 + Power(a,2) + (-1 + Power(r,2))*rh,-2) ; Lr = (-4*r*rh)/Power(-1 + Power(a,2) + (-1 + Power(r,2))*rh,3); La = (-4*a)/Power(-1 + Power(a,2) + (-1 + Power(r,2))*rh,3); Lrr = (4*rh*(1 - Power(a,2) + rh + 5*Power(r,2)*rh))/Power(-1 + Power(a,2) + (-1 + Power(r,2))*rh,4); Laa = (4*(1 + 5*Power(a,2) + rh - Power(r,2)*rh))/Power(-1 + Power(a,2) + (-1 + Power(r,2))*rh,4); Lra = (24*a*r*rh)/Power(-1 + Power(a,2) + (-1 + Power(r,2))*rh,4); f = 1 - Power(r,2) ; fr = -2*r ; frr = -2 ; g = 2. - a*a ; ga = -2.*a ; gaa = -2. ; r2 = r*r ; a2 = a*a ; T = gmet[0][ii][jj] ; Tr = dvr[0][ii][jj] ; Ta = dva[0][ii][jj] ; A = gmet[1][ii][jj] ; Ar = dvr[1][ii][jj] ; Aa = dva[1][ii][jj] ; B = gmet[2][ii][jj] ; Br = dvr[2][ii][jj] ; Ba = dva[2][ii][jj] ; F = gmet[3][ii][jj] ; Fr = dvr[3][ii][jj] ; Fa = dva[3][ii][jj] ; S = gmet[4][ii][jj] ; Sr = dvr[4][ii][jj] ; Sa = dva[4][ii][jj] ; Trr = dvrr[0][ii][jj] ; Taa = dvaa[0][ii][jj] ; Tra = dvra[0][ii][jj] ; Arr = dvrr[1][ii][jj] ; Aaa = dvaa[1][ii][jj] ; Ara = dvra[1][ii][jj] ; Brr = dvrr[2][ii][jj] ; Baa = dvaa[2][ii][jj] ; Bra = dvra[2][ii][jj] ; Frr = dvrr[3][ii][jj] ; Faa = dvaa[3][ii][jj] ; Fra = dvra[3][ii][jj] ; Srr = dvrr[4][ii][jj] ; Saa = dvaa[4][ii][jj] ; Sra = dvra[4][ii][jj] ; if(jj!=NA-1) { #include "Licheq.c" } else { #include "Lichbrn.c" } for(posjj=0;posjjLICHCUT) { LichRow[posLich] = posii ; LichCol[posLich] = posjj ; Lich[posLich] = val ; posLich += 1 ; if(posLich>=NMAX3) { printf("posLich too large!\n") ; exit(1) ; } } } } } sizeLich = posLich ; printf("\nAnalytic: Size of Lich: sizeLich = %ld\n",sizeLich) ; } REAL calcPhi(void) { int ii, jj, var, kk ; REAL phimax ; REAL r,a ; REAL T, Tr, Ta, Trr, Taa, Tra ; REAL A, Ar, Aa, Arr, Aaa, Ara ; REAL B, Br, Ba, Brr, Baa, Bra ; REAL F, Fr, Fa, Frr, Faa, Fra ; REAL S, Sr, Sa, Srr, Saa, Sra ; REAL theta ; REAL hr, ha ; REAL L, Lr, La, Lrr, Laa, Lra, f, fr, frr, g, ga, gaa, r2, a2 ; REAL phival, Riccival, R2sqrval, R4sqrval ; REAL gd[5][5], gu[5][5], R2[5][5], C4[5][5][5][5] ; int i1,i2,i3,i4, s1, s2, s3, s4 ; phimax = 0. ; for(ii=0;ii phimax ) phimax = phival ; } } return( phimax ) ; } void getG(void) { int ii, jj, var ; long pos ; for(ii=0;iiNMAX || NA>NMAX ) { printf("\n\nPatch too large!\n\n") ; exit(1) ; } for(ii=0;ii=NMAX2) { printf(" %d \n\n",intbuf) ; printf("Vector size too large! %d\n\n",intbuf) ; exit(1) ; } vecpos[intbuf][0] = var ; vecpos[intbuf][1] = ii ; vecpos[intbuf][2] = jj ; if(intbuf>vecsize) vecsize = intbuf ; } } if(chk!=7) { printf("\n\nError in patch file - %d, %d, %d\n\n",ii,jj,chk) ; exit(1) ; } } } fclose(file) ; vecsize += 1 ; printf("Vector size = %ld\n",vecsize) ; } void save(int writelich) { int ii,jj,var ; long posii, posjj, posLich ; double buf, val ; FILE *fileptrLichRow, *fileptrLichCol, *fileptrLichVal ; for(var=0;var<5;var++) { for(ii=0;ii\n") ; printf("\n<") ; for(kk=0;kk maxval ) { maxval = fabs(Lmat[ii*(vecsize+1)+kk]) ; iimax = ii ; } } if( iimax == -1 ) { printf("\n\nSingular Lich matrix!\n\n") ; exit(1) ; } // Swap rows for(jj=kk;jj\n") ; // Back substitution for(kk=vecsize-1;kk>=0;kk--) { y[kk] = Lmat[ kk*(vecsize+1)+vecsize ] ; for(ii=kk+1;ii val ) val = fabs(y[ii]) ; } #if REALTYPE == 2 printf("\n Lin solve check -> %10.3Le\n",val) ; #else printf("\n Lin solve check -> %10.3e\n",val) ; #endif } void setupCheb(void) { int Neven ; int ii, jj, kk ; REAL x[NMAX], c1, c2 ; REAL Dmat[NMAX][NMAX], D2mat[NMAX][NMAX] ; /* Std - for r */ for(ii=0;ii