Beispiel #1
0
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 ) ;

}
Beispiel #2
0
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 ) ;

}
Beispiel #3
0
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 ) ;

}