diff options
Diffstat (limited to 'src/GRHydro_PPM.c')
-rw-r--r-- | src/GRHydro_PPM.c | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/src/GRHydro_PPM.c b/src/GRHydro_PPM.c new file mode 100644 index 0000000..cfa57b1 --- /dev/null +++ b/src/GRHydro_PPM.c @@ -0,0 +1,437 @@ +#include <assert.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> + +#if 1 +#include "cctk.h" +#include "cctk_Parameters.h" +#include "cctk_Arguments.h" +#include "cctk_Functions.h" +#endif + +#include "GRHydro_PPM.h" + + +void SimplePPM_1d_c(int* restrict nx, + double* restrict dx, + double* restrict rho, + double* restrict velx, + double* restrict vely, + double* restrict velz, + double* restrict eps, + double* restrict press, + double* restrict rhominus, + double* restrict velxminus, + double* restrict velyminus, + double* restrict velzminus, + double* restrict epsminus, + double* restrict rhoplus, + double* restrict velxplus, + double* restrict velyplus, + double* restrict velzplus, + double* restrict epsplus) + +{ + double drho[*nx], dpress[*nx], deps[*nx], d2rho[*nx]; + double dmrho[*nx], dmpress[*nx], dmeps[*nx]; + double dvelx[*nx], dvely[*nx], dvelz[*nx]; + double dmvelx[*nx], dmvely[*nx], dmvelz[*nx]; + double tilde_flatten[*nx]; + + const double onesixth = 1.0/6.0; + + for(int i=1;i < *nx-1;i++) { + drho[i] = 0.5 * (rho[i+1]-rho[i-1]); + d2rho[i] = rho[i+1] - 2.0 * rho[i] + rho[i-1]; + dpress[i] = (press[i+1]-press[i-1]); + deps[i] = 0.5 * (eps[i+1]-eps[i-1]); + dvelx[i] = 0.5 * (velx[i+1]-velx[i-1]); + dvely[i] = 0.5 * (vely[i+1]-vely[i-1]); + dvelz[i] = 0.5 * (velz[i+1]-velz[i-1]); + } + + for(int i=1;i<*nx-1;i++) { + steep(rho,drho,dmrho,i); + steep(eps,deps,dmeps,i); + steep(velx,dvelx,dmvelx,i); + steep(vely,dvely,dmvely,i); + steep(velz,dvelz,dmvelz,i); + } + + for(int i=1;i<*nx-1;i++) { + rhoplus[i] = 0.5 * (rho[i] + rho[i+1]) + + (dmrho[i] - dmrho[i+1]) * onesixth; + epsplus[i] = 0.5 * (eps[i] + eps[i+1]) + + (dmeps[i] - dmeps[i+1]) * onesixth; + velxplus[i] = 0.5 * (velx[i] + velx[i+1]) + + (dmvelx[i] - dmvelx[i+1]) * onesixth; + velyplus[i] = 0.5 * (vely[i] + vely[i+1]) + + (dmvely[i] - dmvely[i+1]) * onesixth; + velzplus[i] = 0.5 * (velz[i] + velz[i+1]) + + (dmvelz[i] - dmvelz[i+1]) * onesixth; + } + + for(int i=1;i<*nx-2;i++) { + rhoplus[i] = approx_at_cell_interface(rho,i); + epsplus[i] = approx_at_cell_interface(eps,i); + velxplus[i] = approx_at_cell_interface(velx,i); + velyplus[i] = approx_at_cell_interface(vely,i); + velzplus[i] = approx_at_cell_interface(velz,i); + } + + for(int i=1;i<*nx-2;i++) { + rhominus[i+1] = rhoplus[i]; + epsminus[i+1] = epsplus[i]; + velxminus[i+1] = velxplus[i]; + velyminus[i+1] = velyplus[i]; + velzminus[i+1] = velzplus[i]; + } + + const double ppm_epsilon_shock = 0.01; + const double ppm_eta1 = 20.0; + const double ppm_eta2 = 0.05; + const double ppm_k0 = 0.2; + const double ppm_epsilon = 0.33; + const double ppm_omega1 = 0.75; + const double ppm_omega2 = 10.0; + const double ppm_small = 1.0e-7; + + // steepening + for(int i=2;i<*nx-2;i++) { + double etatilde = 0.0; + if ( d2rho[i+1]*d2rho[i-1] < 0.0 + && ( fabs(rho[i+1]-rho[i-1]) - ppm_epsilon_shock + * MIN(fabs(rho[i+1]), + fabs(rho[i-1])) > 0.0) ) + { + etatilde = (rho[i-2] - rho[i+2] + 4.0 * drho[i]) / (drho[i] * 12.0); + } + double eta = MAX(0.0, MIN(1.0, ppm_eta1 * (etatilde - ppm_eta2))); + if (ppm_k0 * fabs(drho[i]) * MIN(press[i-1],press[i+1]) + < fabs(dpress[i]) * MIN(rho[i-1], rho[i+1])) + { + eta = 0.0; + } + rhominus[i] = rhominus[i] * (1.0 - eta) + + (rho[i-1] + 0.5 * dmrho[i-1]) * eta; + rhoplus[i] = rhoplus[i] * (1.0 - eta) + + (rho[i+1] - 0.5 * dmrho[i+1]) * eta; + } + + // flattening + for(int i=2;i<*nx-2;i++) { + double dpress2 = press[i+2] - press[i-2]; + double dvel = velx[i+1] - velx[i-1]; + double w=0.0; + if ( (fabs(dpress[i]) > ppm_epsilon * MIN(press[i-1],press[i+1])) + && (dvel < 0.0) ) + { + w = 1.0; + } + if (fabs(dpress2) < ppm_small) + { + tilde_flatten[i] = 1.0; + } + else + { + tilde_flatten[i] = MAX(0.0, 1.0 - w * MAX(0.0, + ppm_omega2 * (dpress[i] / dpress2 - ppm_omega1))); + } + } + + for(int i=2;i<*nx-2;i++) { + double flatten = tilde_flatten[i]; + rhoplus[i] = flatten * rhoplus[i] + (1.0 - flatten) * rho[i]; + rhominus[i] = flatten * rhominus[i] + (1.0 - flatten) * rho[i]; + epsplus[i] = flatten * epsplus[i] + (1.0 - flatten) * eps[i]; + epsminus[i] = flatten * epsminus[i] + (1.0 - flatten) * eps[i]; + velxplus[i] = flatten * velxplus[i] + (1.0 - flatten) * velx[i]; + velxminus[i] = flatten * velxminus[i] + (1.0 - flatten) * velx[i]; + velyplus[i] = flatten * velyplus[i] + (1.0 - flatten) * vely[i]; + velyminus[i] = flatten * velyminus[i] + (1.0 - flatten) * vely[i]; + velzplus[i] = flatten * velzplus[i] + (1.0 - flatten) * velz[i]; + velzminus[i] = flatten * velzminus[i] + (1.0 - flatten) * velz[i]; + } // flattening + + for(int i=2;i<*nx-2;i++) { + monotonize(rhominus,rho,rhoplus,i); + monotonize(epsminus,eps,epsplus,i); + monotonize(velxminus,velx,velxplus,i); + monotonize(velyminus,vely,velyplus,i); + monotonize(velzminus,velz,velzplus,i); + } + + return; +} + +CCTK_FCALL void CCTK_FNAME(PPMc)(int* restrict nx, + double* restrict dx, + double* restrict rho, + double* restrict velx, + double* restrict vely, + double* restrict velz, + double* restrict eps, + double* restrict press, + double* restrict rhominus, + double* restrict velxminus, + double* restrict velyminus, + double* restrict velzminus, + double* restrict epsminus, + double* restrict rhoplus, + double* restrict velxplus, + double* restrict velyplus, + double* restrict velzplus, + double* restrict epsplus) { + +void SimplePPM_1d_c(nx, dx, + rho, + velx, + vely, + velz, + eps, + press, + rhominus, + velxminus, + velyminus, + velzminus, + epsminus, + rhoplus, + velxplus, + velyplus, + velzplus, + epsplus); + +} + + +void SimplePPM_1d_tyc(int* restrict nx, + double* restrict dx, + double* restrict rho, + double* restrict velx, + double* restrict vely, + double* restrict velz, + double* restrict eps, + double* restrict temp, + double* restrict ye, + double* restrict press, + double* restrict rhominus, + double* restrict velxminus, + double* restrict velyminus, + double* restrict velzminus, + double* restrict epsminus, + double * restrict tempminus, + double * restrict yeminus, + double* restrict rhoplus, + double* restrict velxplus, + double* restrict velyplus, + double* restrict velzplus, + double* restrict epsplus, + double* restrict tempplus, + double* restrict yeplus) + +{ + double drho[*nx], dpress[*nx], deps[*nx], d2rho[*nx]; + double dtemp[*nx], dye[*nx]; + double dmrho[*nx], dmpress[*nx], dmeps[*nx]; + double dmtemp[*nx], dmye[*nx]; + double dvelx[*nx], dvely[*nx], dvelz[*nx]; + double dmvelx[*nx], dmvely[*nx], dmvelz[*nx]; + double tilde_flatten[*nx]; + + const double onesixth = 1.0/6.0; + + for(int i=1;i < *nx-1;i++) { + drho[i] = 0.5 * (rho[i+1]-rho[i-1]); + d2rho[i] = rho[i+1] - 2.0 * rho[i] + rho[i-1]; + dpress[i] = (press[i+1]-press[i-1]); + deps[i] = 0.5 * (eps[i+1]-eps[i-1]); + dtemp[i] = 0.5 * (temp[i+1]-temp[i-1]); + dye[i] = 0.5 * (ye[i+1]-ye[i-1]); + dvelx[i] = 0.5 * (velx[i+1]-velx[i-1]); + dvely[i] = 0.5 * (vely[i+1]-vely[i-1]); + dvelz[i] = 0.5 * (velz[i+1]-velz[i-1]); + } + + for(int i=1;i<*nx-1;i++) { + steep(rho,drho,dmrho,i); + steep(eps,deps,dmeps,i); + steep(temp,dtemp,dmtemp,i); + steep(ye,dye,dmye,i); + steep(velx,dvelx,dmvelx,i); + steep(vely,dvely,dmvely,i); + steep(velz,dvelz,dmvelz,i); + } + + for(int i=1;i<*nx-1;i++) { + rhoplus[i] = 0.5 * (rho[i] + rho[i+1]) + + (dmrho[i] - dmrho[i+1]) * onesixth; + epsplus[i] = 0.5 * (eps[i] + eps[i+1]) + + (dmeps[i] - dmeps[i+1]) * onesixth; + tempplus[i] = 0.5 * (temp[i] + temp[i+1]) + + (dmtemp[i] - dmtemp[i+1]) * onesixth; + yeplus[i] = 0.5 * (ye[i] + ye[i+1]) + + (dmye[i] - dmye[i+1]) * onesixth; + velxplus[i] = 0.5 * (velx[i] + velx[i+1]) + + (dmvelx[i] - dmvelx[i+1]) * onesixth; + velyplus[i] = 0.5 * (vely[i] + vely[i+1]) + + (dmvely[i] - dmvely[i+1]) * onesixth; + velzplus[i] = 0.5 * (velz[i] + velz[i+1]) + + (dmvelz[i] - dmvelz[i+1]) * onesixth; + } + + for(int i=1;i<*nx-2;i++) { + rhoplus[i] = approx_at_cell_interface(rho,i); + epsplus[i] = approx_at_cell_interface(eps,i); + tempplus[i] = approx_at_cell_interface(temp,i); + yeplus[i] = approx_at_cell_interface(ye,i); + velxplus[i] = approx_at_cell_interface(velx,i); + velyplus[i] = approx_at_cell_interface(vely,i); + velzplus[i] = approx_at_cell_interface(velz,i); + } + + for(int i=1;i<*nx-2;i++) { + rhominus[i+1] = rhoplus[i]; + epsminus[i+1] = epsplus[i]; + tempminus[i+1] = tempplus[i]; + yeminus[i+1] = yeplus[i]; + velxminus[i+1] = velxplus[i]; + velyminus[i+1] = velyplus[i]; + velzminus[i+1] = velzplus[i]; + } + + const double ppm_epsilon_shock = 0.01; + const double ppm_eta1 = 20.0; + const double ppm_eta2 = 0.05; + const double ppm_k0 = 0.2; + const double ppm_epsilon = 0.33; + const double ppm_omega1 = 0.75; + const double ppm_omega2 = 10.0; + const double ppm_small = 1.0e-7; + + // steepening + for(int i=2;i<*nx-2;i++) { + double etatilde = 0.0; + if ( d2rho[i+1]*d2rho[i-1] < 0.0 + && ( fabs(rho[i+1]-rho[i-1]) - ppm_epsilon_shock + * MIN(fabs(rho[i+1]), + fabs(rho[i-1])) > 0.0) ) + { + etatilde = (rho[i-2] - rho[i+2] + 4.0 * drho[i]) / (drho[i] * 12.0); + } + double eta = MAX(0.0, MIN(1.0, ppm_eta1 * (etatilde - ppm_eta2))); + if (ppm_k0 * fabs(drho[i]) * MIN(press[i-1],press[i+1]) + < fabs(dpress[i]) * MIN(rho[i-1], rho[i+1])) + { + eta = 0.0; + } + rhominus[i] = rhominus[i] * (1.0 - eta) + + (rho[i-1] + 0.5 * dmrho[i-1]) * eta; + rhoplus[i] = rhoplus[i] * (1.0 - eta) + + (rho[i+1] - 0.5 * dmrho[i+1]) * eta; + } + + // flattening + for(int i=2;i<*nx-2;i++) { + double dpress2 = press[i+2] - press[i-2]; + double dvel = velx[i+1] - velx[i-1]; + double w=0.0; + if ( (fabs(dpress[i]) > ppm_epsilon * MIN(press[i-1],press[i+1])) + && (dvel < 0.0) ) + { + w = 1.0; + } + if (fabs(dpress2) < ppm_small) + { + tilde_flatten[i] = 1.0; + } + else + { + tilde_flatten[i] = MAX(0.0, 1.0 - w * MAX(0.0, + ppm_omega2 * (dpress[i] / dpress2 - ppm_omega1))); + } + } + + for(int i=2;i<*nx-2;i++) { + double flatten = tilde_flatten[i]; + rhoplus[i] = flatten * rhoplus[i] + (1.0 - flatten) * rho[i]; + rhominus[i] = flatten * rhominus[i] + (1.0 - flatten) * rho[i]; + epsplus[i] = flatten * epsplus[i] + (1.0 - flatten) * eps[i]; + epsminus[i] = flatten * epsminus[i] + (1.0 - flatten) * eps[i]; + tempplus[i] = flatten * tempplus[i] + (1.0 - flatten) * temp[i]; + tempminus[i] = flatten * tempminus[i] + (1.0 - flatten) * temp[i]; + yeplus[i] = flatten * yeplus[i] + (1.0 - flatten) * ye[i]; + yeminus[i] = flatten * yeminus[i] + (1.0 - flatten) * ye[i]; + velxplus[i] = flatten * velxplus[i] + (1.0 - flatten) * velx[i]; + velxminus[i] = flatten * velxminus[i] + (1.0 - flatten) * velx[i]; + velyplus[i] = flatten * velyplus[i] + (1.0 - flatten) * vely[i]; + velyminus[i] = flatten * velyminus[i] + (1.0 - flatten) * vely[i]; + velzplus[i] = flatten * velzplus[i] + (1.0 - flatten) * velz[i]; + velzminus[i] = flatten * velzminus[i] + (1.0 - flatten) * velz[i]; + } // flattening + + for(int i=2;i<*nx-2;i++) { + monotonize(rhominus,rho,rhoplus,i); + monotonize(epsminus,eps,epsplus,i); + monotonize(tempminus,temp,tempplus,i); + monotonize(yeminus,ye,yeplus,i); + monotonize(velxminus,velx,velxplus,i); + monotonize(velyminus,vely,velyplus,i); + monotonize(velzminus,velz,velzplus,i); + } + + return; +} + + + +CCTK_FCALL void CCTK_FNAME(PPMtyc)(int* restrict nx, + double* restrict dx, + double* restrict rho, + double* restrict velx, + double* restrict vely, + double* restrict velz, + double* restrict eps, + double* restrict temp, + double* restrict ye, + double* restrict press, + double* restrict rhominus, + double* restrict velxminus, + double* restrict velyminus, + double* restrict velzminus, + double* restrict epsminus, + double* restrict tempminus, + double* restrict yeminus, + double* restrict rhoplus, + double* restrict velxplus, + double* restrict velyplus, + double* restrict velzplus, + double* restrict epsplus, + double* restrict tempplus, + double* restrict yeplus) { + +void SimplePPM_1d_tyc(nx, dx, + rho, + velx, + vely, + velz, + eps, + temp, + ye, + press, + rhominus, + velxminus, + velyminus, + velzminus, + epsminus, + tempminus, + yeminus, + rhoplus, + velxplus, + velyplus, + velzplus, + epsplus, + tempplus, + yeplus); +} + |