aboutsummaryrefslogtreecommitdiff
path: root/src/RobinBoundary.c
diff options
context:
space:
mode:
authorlanfer <lanfer@6a38eb6e-646e-4a02-a296-d141613ad6c4>1999-11-01 12:55:17 +0000
committerlanfer <lanfer@6a38eb6e-646e-4a02-a296-d141613ad6c4>1999-11-01 12:55:17 +0000
commitb0d928469291c1cdd4301c06a4b316d588769487 (patch)
treeaf11393e88a02e9c47b3a4c957f36b6c1bf1bd4d /src/RobinBoundary.c
parentb77a02dc282b020ce72a5e68dccca1b54f0c621e (diff)
Robin BC in C - not tested yet, not in make file
git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/Boundary/trunk@61 6a38eb6e-646e-4a02-a296-d141613ad6c4
Diffstat (limited to 'src/RobinBoundary.c')
-rw-r--r--src/RobinBoundary.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/RobinBoundary.c b/src/RobinBoundary.c
new file mode 100644
index 0000000..b7b84ad
--- /dev/null
+++ b/src/RobinBoundary.c
@@ -0,0 +1,128 @@
+
+#include "cctk.h"
+#include "cctk_parameters.h"
+#include "math.h"
+
+void RobinBCi(cGH *GH, int *sw, int *doBC, int *lsh,
+ CCTK_REAL *var, CCTK_REAL *r, CCTK_REAL finf, CCTK_INT npow) {
+
+ int xgp1,xgp2,xgp3,xgp4;
+ int ygp1,ygp2,ygp3,ygp4;
+ int zgp1,zgp2,zgp3,zgp4;
+
+ int i,j,k;
+
+ if ((sw[0]!=1) || (sw[1]!=1) || (sw[2]!=1))
+ CCTK_WARN(0,"Robin BC only with stencil_size=1");
+
+ /* Lower x-bound: x(2,:,:) --> x[xgp2] */
+ if (doBC[0]==1) {
+ for (k=0;k<lsh[2];k++) {
+ for (j=0;j<lsh[1];j++) {
+
+ xgp1 = CCTK_GFINDEX3D(GH,0,j,k);
+ xgp2 = CCTK_GFINDEX3D(GH,1,j,k);
+ xgp3 = CCTK_GFINDEX3D(GH,2,j,k);
+ xgp4 = CCTK_GFINDEX3D(GH,3,j,k);
+
+ var[xgp1] = finf + (
+ pow(r[xgp4],npow)*( var[xgp4] - finf )
+ -3.0*pow(r[xgp3],npow)*( var[xgp3] - finf )
+ +3.0*pow(r[xgp2],npow)*( var[xgp2] - finf )
+ )/pow(r[xgp1],npow);
+ }
+ }
+ }
+
+ /* Upper x-bound: x(nx,:,:) --> xgp[xgp0] */
+ if (doBC[1]==1){
+ for (k=0;k<lsh[2];k++) {
+ for (j=0;j<lsh[1];j++) {
+ xgp1 = CCTK_GFINDEX3D(GH,lsh[0]-1,j,k);
+ xgp2 = CCTK_GFINDEX3D(GH,lsh[0]-2,j,k);
+ xgp3 = CCTK_GFINDEX3D(GH,lsh[0]-3,j,k);
+ xgp4 = CCTK_GFINDEX3D(GH,lsh[0]-4,j,k);
+
+ var[xgp1] = finf + (
+ pow(r[xgp3],npow)*( var[xgp4] - finf )
+ -3.0*pow(r[xgp3],npow)*( var[xgp3] - finf )
+ +3.0*pow(r[xgp2],npow)*( var[xgp2] - finf )
+ )/(r[xgp1],npow);
+ }
+ }
+ }
+
+ /* Lower y-bound */
+ if (doBC[2] == 1) {
+ for (k=0;k<lsh[2];k++) {
+ for (i=0;i<lsh[0];i++) {
+ ygp1 = CCTK_GFINDEX3D(GH,i,0,k);
+ ygp2 = CCTK_GFINDEX3D(GH,i,1,k);
+ ygp3 = CCTK_GFINDEX3D(GH,i,2,k);
+ ygp4 = CCTK_GFINDEX3D(GH,i,3,k);
+
+ var[ygp1] = finf + (
+ pow(r[ygp4],npow)*( var[ygp4] - finf )
+ -3.0*pow(r[ygp3],npow)*( var[ygp3] - finf )
+ +3.0*pow(r[ygp2],npow)*( var[ygp2] - finf )
+ )/pow(r[ygp1],npow);
+
+ }
+ }
+ }
+
+ /* Upper y bound */
+ if (doBC[3] == 1) {
+ for (k=0;k<lsh[2];k++) {
+ for (i=0;i<lsh[0];i++) {
+ ygp1 = CCTK_GFINDEX3D(GH,i,lsh[1]-1,k);
+ ygp2 = CCTK_GFINDEX3D(GH,i,lsh[1]-2,k);
+ ygp3 = CCTK_GFINDEX3D(GH,i,lsh[1]-3,k);
+ ygp4 = CCTK_GFINDEX3D(GH,i,lsh[1]-4,k);
+
+ var[ygp1] = finf + (
+ pow(r[ygp3],npow)*( var[ygp4] - finf )
+ -3.0*pow(r[ygp3],npow)*( var[ygp3] - finf )
+ +3.0*pow(r[ygp2],npow)*( var[ygp2] - finf )
+ )/(r[ygp1],npow);
+ }
+ }
+ }
+
+ /* Lower z-bound */
+ if (doBC[4]==1) {
+ for (j=0;j<lsh[1];j++) {
+ for (i=0;i<lsh[0];i++) {
+ zgp1 = CCTK_GFINDEX3D(GH,i,j,1);
+ zgp2 = CCTK_GFINDEX3D(GH,i,j,2);
+ zgp3 = CCTK_GFINDEX3D(GH,i,j,3);
+ zgp4 = CCTK_GFINDEX3D(GH,i,j,4);
+
+ var[zgp1] = finf + (
+ pow(r[zgp4],npow)*( var[zgp4] - finf )
+ -3.0*pow(r[zgp3],npow)*( var[zgp3] - finf )
+ +3.0*pow(r[zgp2],npow)*( var[zgp2] - finf )
+ )/pow(r[zgp1],npow);
+ }
+ }
+ }
+
+ /* Upper z-bound */
+ if (doBC[5] == 1) {
+ for (j=0;j<lsh[1];j++) {
+ for (i=0;i<lsh[0];i++) {
+ zgp1 = CCTK_GFINDEX3D(GH,i,j,lsh[2]-1);
+ zgp2 = CCTK_GFINDEX3D(GH,i,j,lsh[2]-2);
+ zgp3 = CCTK_GFINDEX3D(GH,i,j,lsh[2]-3);
+ zgp4 = CCTK_GFINDEX3D(GH,i,j,lsh[2]-4);
+
+ var[zgp1] = finf + (
+ pow(r[zgp3],npow)*( var[zgp4] - finf )
+ -3.0*pow(r[zgp3],npow)*( var[zgp3] - finf )
+ +3.0*pow(r[zgp2],npow)*( var[zgp2] - finf )
+ )/(r[zgp1],npow);
+
+ }
+ }
+ }
+}