int Utoprim_2d(FTYPE U[NPR], FTYPE gcov[NDIM][NDIM], FTYPE gcon[NDIM][NDIM], FTYPE gdet, FTYPE prim[NPR]) { FTYPE U_tmp[NPR], U_tmp2[NPR], prim_tmp[NPR]; int i, j, ret; FTYPE alpha; double dummy; /* First update the primitive B-fields */ for(i = BCON1; i <= BCON3; i++) prim[i] = U[i] / gdet ; if( U[0] <= 0. ) { return(-100); // fprintf(stderr,"failure at %d %d\n", i,j); } /* Set the geometry variables: */ alpha = 1.0/sqrt(-gcon[0][0]); /* Transform the CONSERVED variables into the new system */ U_tmp[RHO] = alpha * U[RHO] / gdet; U_tmp[UU] = alpha * (U[UU] - U[RHO]) / gdet ; for( i = UTCON1; i <= UTCON3; i++ ) { U_tmp[i] = alpha * U[i] / gdet ; } for( i = BCON1; i <= BCON3; i++ ) { U_tmp[i] = alpha * U[i] / gdet ; } /* Transform the PRIMITIVE variables into the new system */ for( i = 0; i < BCON1; i++ ) { prim_tmp[i] = prim[i]; } for( i = BCON1; i <= BCON3; i++ ) { prim_tmp[i] = alpha*prim[i]; } ret = Utoprim_new_body(U_tmp, gcov, gcon, gdet, prim_tmp); /* Transform new primitive variables back if there was no problem : */ if( ret == 0 ) { for( i = 0; i < BCON1; i++ ) { prim[i] = prim_tmp[i]; } } return( ret ) ; }
int Utoprim_1dvsq2fix1(FTYPE U[NPR], FTYPE gcov[NDIM][NDIM], FTYPE gcon[NDIM][NDIM], FTYPE gdet, FTYPE prim[NPR], FTYPE K ) { FTYPE U_tmp[NPR], prim_tmp[NPR]; int i, j, ret; FTYPE alpha; /* First update the primitive B-fields */ for(i = BCON1; i <= BCON3; i++) prim[i] = U[i] / gdet ; if( U[0] <= 0. ) { return(-100); } K_atm = K ; /* Set the geometry variables: */ alpha = 1.0/sqrt(-gcon[0][0]); /* Transform the CONSERVED variables into the new system */ U_tmp[RHO] = alpha * U[RHO] / gdet; U_tmp[UU] = alpha * (U[UU] - U[RHO]) / gdet ; for( i = UTCON1; i <= UTCON3; i++ ) { U_tmp[i] = alpha * U[i] / gdet ; } for( i = BCON1; i <= BCON3; i++ ) { U_tmp[i] = alpha * U[i] / gdet ; } /* Transform the PRIMITIVE variables into the new system */ for( i = 0; i < BCON1; i++ ) { prim_tmp[i] = prim[i]; } for( i = BCON1; i <= BCON3; i++ ) { prim_tmp[i] = alpha*prim[i]; } ret = Utoprim_new_body(U_tmp, gcov, gcon, gdet, prim_tmp); /* Transform new primitive variables back if there was no problem : */ if( ret == 0 ) { for( i = 0; i < BCON1; i++ ) { prim[i] = prim_tmp[i]; } } #if( DOKTOT ) prim[KTOT] = U[KTOT]/U[RHO]; #endif return( ret ) ; }
int Utoprim_2d(FTYPE U[NPR], struct of_geom *ptrgeom, PFTYPE *lpflag, FTYPE *prim, FTYPE *pressure, struct of_newtonstats *newtonstats) { FTYPE U_tmp[NPR], U_tmp2[NPR], prim_tmp[NPR]; int i, j, k, ret; FTYPE gcov[SYMMATRIXNDIM], gcon[SYMMATRIXNDIM], alpha; const int ltrace = 0; #if(USEOPENMP) if(omp_in_parallel()){ dualfprintf(fail_file,"Utoprim_2d() called in parallel region\n"); myexit(9366983); } #endif newtonstats->lntries=0; // assign global int pointer to lpflag pointer glpflag=lpflag; #if( WHICHVEL != VELREL4 ) fprintf(stderr,"Utoprim_2d() Not implemented for WHICHVEL = %d \n", WHICHVEL ); return(1); #endif /* Set the geometry variables: */ for(i = 0; i < NDIM; i++ ) { for(j = 0; j < NDIM; j++ ) { gcov[GIND(i,j)] = ptrgeom->gcov[GIND(i,j)]; gcon[GIND(i,j)] = ptrgeom->gcon[GIND(i,j)]; } } alpha = 1.0/sqrt(-gcon[GIND(0,0)]); /* Calculate the transform the CONSERVATIVE variables into the new system */ // notice -alpha U_tmp[RHO] = U[RHO] * alpha; for( i = UU; i <= U3; i++ ) { U_tmp[i] = -alpha * U[i]; } for( i = B1; i <= B3; i++ ) { U_tmp[i] = alpha * U[i] ; } /* Calculate the transform the PRIMITIVE variables into the new system */ PALLLOOP(i) prim_tmp[i] = prim[i]; for( i = B1; i <= B3; i++ ) { prim_tmp[i] = alpha*prim[i]; } ret = Utoprim_new_body(U_tmp, ptrgeom, prim_tmp, pressure); /* Check conservative variable transformation: */ if( ltrace ) { primtoU_g(ptrgeom, prim_tmp, gcov, gcon, U_tmp2 ); for( i = 0; i < NPR; i++ ) { fprintf( stdout, "Utoprim_new1(): Utmp1[%d] = %21.15g , Utmp2[%d] = %21.15g , dUtmp[%d] = %21.15g \n", i, U_tmp[i], i, U_tmp2[i], i, fabs( (U_tmp[i]-U_tmp2[i]) / ( (U_tmp2[i]!=0.) ? U_tmp2[i] : 1. ) ) ); } } /* Transform new primitive variables back : */ for( i = 0; i < B1; i++ ) { prim[i] = prim_tmp[i]; } for( i = B1; i <= B3; i++ ) { prim[i] = prim_tmp[i] / alpha; } return( ret ) ; }
int Utoprim_2d_final(FTYPE U[NPR], struct of_geom *ptrgeom, FTYPE prim[NPR]) { static int Utoprim_new_body(FTYPE U[], struct of_geom *ptrgeom, FTYPE prim[]); static void primtoU_g( FTYPE prim[], FTYPE gcov[][4], FTYPE gcon[][4], FTYPE U[] ); FTYPE U_tmp[NPR], U_tmp2[NPR], prim_tmp[NPR]; int i, j, k,ret; FTYPE gcov[NDIM][NDIM], gcon[NDIM][NDIM], alpha; const int ltrace = 0; #if( WHICHVEL != VELREL4 ) fprintf(stderr,"Utoprim_2d() Not implemented for WHICHVEL = %d \n", WHICHVEL ); return(1); #endif /* First update the primitive B-fields */ // remove EOM factor for(i = BCON1; i <= BCON3; i++) prim[i] = U[i] ; /* Set the geometry variables: */ alpha = 1.0/sqrt(-ptrgeom->gcon[0][0]); /* Calculate the transform the CONSERVATIVE variables into the new system */ for( i = RHO; i <= BCON3; i++ ) { U_tmp[i] = alpha * U[i] ; } /* Calculate the transform the PRIMITIVE variables into the new system */ for( i = 0; i < BCON1; i++ ) { prim_tmp[i] = prim[i]; } for( i = BCON1; i <= BCON3; i++ ) { prim_tmp[i] = alpha*prim[i]; } ret = Utoprim_new_body(U_tmp, ptrgeom, prim_tmp); /* Check conservative variable transformation: */ #if(!OPTIMIZED) if( ltrace ) { for(i = 0; i < NDIM; i++ ) { for(j = 0; j < NDIM; j++ ) { gcov[i][j] = ptrgeom->gcov[i][j]; gcon[i][j] = ptrgeom->gcon[i][j]; dualfprintf(fail_file,"gcov,gcon %d %d = %21.15g %21.15g \n", i, j, gcov[i][j], gcon[i][j]); } } dualfprintf(fail_file,"gdet = %21.15g \n", ptrgeom->g); primtoU_g( prim_tmp, gcov, gcon, U_tmp2 ); for( i = 0; i < NPR; i++ ) { dualfprintf(fail_file, "Utoprim_1d(): Utmp1[%d] = %21.15g , Utmp2[%d] = %21.15g , dUtmp[%d] = %21.15g \n", i, U_tmp[i], i, U_tmp2[i], i, fabs( (U_tmp[i]-U_tmp2[i]) / ( (U_tmp2[i]!=0.) ? U_tmp2[i] : 1. ) ) ); } } #endif /* Transform new primitive variables back : */ if( ret == 0 ) { for( i = 0; i < BCON1; i++ ) { prim[i] = prim_tmp[i]; } } // only output if failed if(pflag[ptrgeom->i][ptrgeom->j][FLAGUTOPRIMFAIL]&&(debugfail>=1)) dualfprintf(fail_file, "Failed to find a prim. var. solution!! t=%21.15g nstep=%ld i=%d j=%d : fail=%d\n",t,realnstep,startpos[1]+ptrgeom->i,startpos[2]+ptrgeom->j,pflag[ptrgeom->i][ptrgeom->j][FLAGUTOPRIMFAIL]); /* // only output if failed */ /* if(pflag[ptrgeom->i][ptrgeom->j][FLAGUTOPRIMFAIL]&&(debugfail>=1)) dualfprintf(fail_file, "utoprim_2d(): Failed to find a prim. var. solution!! t=%21.15g nstep=%ld i=%d j=%d\n",t,nstep,ptrgeom->i,ptrgeom->j); */ return( 0 ) ; }