[cig-commits] r19654 - mc/3D/CitcomCU/trunk/src

becker at geodynamics.org becker at geodynamics.org
Sun Feb 19 15:31:27 PST 2012


Author: becker
Date: 2012-02-19 15:31:26 -0800 (Sun, 19 Feb 2012)
New Revision: 19654

Modified:
   mc/3D/CitcomCU/trunk/src/Boundary_conditions.c
   mc/3D/CitcomCU/trunk/src/Ggrd_handling.c
   mc/3D/CitcomCU/trunk/src/Parallel_related.c
Log:
Initital periodic boundary condition for either x and y implemented using
routines from Shijie Zhong. Working for 4x4 CPU test case, perhaps problems
for 2x2. Still debugging.



Modified: mc/3D/CitcomCU/trunk/src/Boundary_conditions.c
===================================================================
--- mc/3D/CitcomCU/trunk/src/Boundary_conditions.c	2012-02-19 23:14:17 UTC (rev 19653)
+++ mc/3D/CitcomCU/trunk/src/Boundary_conditions.c	2012-02-19 23:31:26 UTC (rev 19654)
@@ -201,149 +201,131 @@
 }
 
 /* ========================================== */
-
-void velocity_refl_vert_bc(struct All_variables *E)
+void velocity_refl_vert_bc(E)
+     struct All_variables *E;
 {
-	int i, j, ii, jj;
-	int node1, node2;
-	int level, nox, noy, noz;
-	//const int dims = E->mesh.nsd;
+  int i,j,ii,jj;
+  int node1,node2;
+  int level,nox,noy,noz;
+  const int dims=E->mesh.nsd;
 
-	/* except one side with XOZ and y=0, all others are not reflecting BC */
-	/* for two YOZ planes if 3-D, or two OZ side walls for 2-D */
+  /* except one side with XOZ and y=0, all others are not reflecting BC*/
+  /* for two YOZ planes if 3-D, or two OZ side walls for 2-D */
 
-	if(E->parallel.me_loc[1] == 0 || E->parallel.me_loc[1] == E->parallel.nprocx - 1)
-		for(j = 1; j <= E->lmesh.noy; j++)
-			for(i = 1; i <= E->lmesh.noz; i++)
-			{
-				node1 = i + (j - 1) * E->lmesh.noz * E->lmesh.nox;
-				node2 = node1 + (E->lmesh.nox - 1) * E->lmesh.noz;
+  if (E->parallel.me_loc[1]==0 || E->parallel.me_loc[1]==E->parallel.nprocx-1)
+    for(j=1;j<=E->lmesh.noy;j++)
+      for(i=1;i<=E->lmesh.noz;i++)  {
+        node1 = i  + (j-1)*E->lmesh.noz*E->lmesh.nox;
+	node2 = node1 + (E->lmesh.nox-1)*E->lmesh.noz;
 
-				ii = i + E->lmesh.nzs - 1;
-				if(E->parallel.me_loc[1] == 0)
-				{
-					E->VB[1][node1] = 0.0;
-					if((ii != 1) && (ii != E->mesh.noz))
-						E->VB[3][node1] = 0.0;
-				}
-				if(E->parallel.me_loc[1] == E->parallel.nprocx - 1)
-				{
-					E->VB[1][node2] = 0.0;
-					if((ii != 1) && (ii != E->mesh.noz))
-						E->VB[3][node2] = 0.0;
-				}
-			}					/* end loop for i and j */
+	ii = i + E->lmesh.nzs - 1;
+        if (E->parallel.me_loc[1]==0 )  {
+	  E->VB[1][node1] = 0.0;
+	  if((ii != 1) && (ii != E->mesh.noz))
+	      E->VB[3][node1] = 0.0;  
+	  }
+        if (E->parallel.me_loc[1]==E->parallel.nprocx-1)  {
+	  E->VB[1][node2] = 0.0;
+	  if((ii != 1) && (ii != E->mesh.noz))
+	      E->VB[3][node2] = 0.0;
+	  }
+        }      /* end loop for i and j */
 
-	/* for two XOZ planes if 3-D */
+  /* for two XOZ planes if 3-D */
+	
+    if (E->parallel.me_loc[2]==0 || E->parallel.me_loc[2]==E->parallel.nprocy-1)
+      for(j=1;j<=E->lmesh.nox;j++)
+        for(i=1;i<=E->lmesh.noz;i++)       {
+	  node1 = i +(j-1)*E->lmesh.noz;
+	  node2 = node1+(E->lmesh.noy-1)*E->lmesh.noz*E->lmesh.nox;
+	  ii = i + E->lmesh.nzs - 1;
 
-	if(E->parallel.me_loc[2] == 0 || E->parallel.me_loc[2] == E->parallel.nprocy - 1)
-		for(j = 1; j <= E->lmesh.nox; j++)
-			for(i = 1; i <= E->lmesh.noz; i++)
-			{
-				node1 = i + (j - 1) * E->lmesh.noz;
-				node2 = node1 + (E->lmesh.noy - 1) * E->lmesh.noz * E->lmesh.nox;
-				ii = i + E->lmesh.nzs - 1;
+          if (E->parallel.me_loc[2]==0)  {
+	     E->VB[2][node1] = 0.0;
+	     if((ii != 1) && (ii != E->mesh.noz))
+	        E->VB[3][node1] = 0.0;  
+	     }
+          if (E->parallel.me_loc[2]==E->parallel.nprocy-1)  {
+	     E->VB[2][node2] = 0.0;
+	     if((ii != 1) && (ii != E->mesh.noz))
+	        E->VB[3][node2] = 0.0;  
+	     }
+          }    /* end of loop i & j */
+ 
+  /* all vbc's apply at all levels  */
+  for(level=E->mesh.levmax;level>=E->mesh.levmin;level--) {
+    nox = E->lmesh.NOX[level] ;
+    noz = E->lmesh.NOZ[level] ;
+    noy = E->lmesh.NOY[level] ;
 
-				if(E->parallel.me_loc[2] == 0)
-				{
-					E->VB[2][node1] = 0.0;
-					if((ii != 1) && (ii != E->mesh.noz))
-						E->VB[3][node1] = 0.0;
-				}
-				if(E->parallel.me_loc[2] == E->parallel.nprocy - 1)
-				{
-					E->VB[2][node2] = 0.0;
-					if((ii != 1) && (ii != E->mesh.noz))
-						E->VB[3][node2] = 0.0;
-				}
-			}					/* end of loop i & j */
+    if (E->parallel.me_loc[1]==0 || E->parallel.me_loc[1]==E->parallel.nprocx-1)
+      for(j=1;j<=noy;j++)
+        for(i=1;i<=noz;i++) {
+	  node1 = i + (j-1)*noz*nox ;
+	  node2 = node1 + (nox-1) * noz ;
+	  ii = i + E->lmesh.NZS[level] - 1;
+          if (E->parallel.me_loc[1]==0 )  {
+	      E->NODE[level][node1] = E->NODE[level][node1] & (~SBX);
+	      E->NODE[level][node1] = E->NODE[level][node1] | (VBX);
+	      if((ii!=1) && (ii!=E->mesh.NOZ[level])) {
+		  E->NODE[level][node1] = E->NODE[level][node1] & (~VBY);
+		  E->NODE[level][node1] = E->NODE[level][node1] | SBY;
+		  E->NODE[level][node1] = E->NODE[level][node1] & (~ VBZ);
+		  E->NODE[level][node1] = E->NODE[level][node1] | SBZ;    
+		  }
+	      }
+          if (E->parallel.me_loc[1]==E->parallel.nprocx-1)  {
+	      E->NODE[level][node2] = E->NODE[level][node2] & (~SBX);
+	      E->NODE[level][node2] = E->NODE[level][node2] | (VBX);
+	      if((ii!=1) && (ii!=E->mesh.NOZ[level])) {
+		  E->NODE[level][node2] = E->NODE[level][node2] & (~VBY);
+		  E->NODE[level][node2] = E->NODE[level][node2] | SBY;
+		  E->NODE[level][node2] = E->NODE[level][node2] & (~ VBZ);
+		  E->NODE[level][node2] = E->NODE[level][node2] | SBZ;
+            	  }
+	      }
+	  }   /* end for loop i & j */
+	   
+      if (E->parallel.me_loc[2]==0 || E->parallel.me_loc[2]==E->parallel.nprocy-1)
+        for(j=1;j<=nox;j++) 
+          for(i=1;i<=noz;i++) {
+	    node1 = i + (j-1)*noz;
+	    node2 = node1+(noy-1)*noz*nox;
+	    ii = i + E->lmesh.NZS[level] - 1;
+	    jj = j + E->lmesh.NXS[level] - 1;
+            if (E->parallel.me_loc[2]==0)  {
+	       E->NODE[level][node1] = E->NODE[level][node1] | VBY;
+               E->NODE[level][node1] = E->NODE[level][node1] & (~SBY);
+	       if((ii!= 1) && (ii != E->mesh.NOZ[level]))  {
+		  E->NODE[level][node1] = E->NODE[level][node1] & (~VBZ);
+		  E->NODE[level][node1] = E->NODE[level][node1] | SBZ;
+		  } 
+	       if((jj!=1) && (jj!=E->mesh.NOX[level]) && (ii!=1) && (ii!=E->mesh.NOZ[level])){
+		  E->NODE[level][node1] = E->NODE[level][node1] & (~VBX);
+		  E->NODE[level][node1] = E->NODE[level][node1] | SBX;
+		  }
+	       }
+            if (E->parallel.me_loc[2]==E->parallel.nprocy-1) {
+	       E->NODE[level][node2] = E->NODE[level][node2] | VBY;
+	       E->NODE[level][node2] = E->NODE[level][node2] & (~SBY);
+	       if((ii!= 1) && (ii != E->mesh.NOZ[level]))  {
+		  E->NODE[level][node2] = E->NODE[level][node2] & (~VBZ);
+		  E->NODE[level][node2] = E->NODE[level][node2] | SBZ;
+		  } 
+	       if((jj!=1) && (jj!=E->mesh.NOX[level]) && (ii!=1) && (ii!=E->mesh.NOZ[level])){
+		  E->NODE[level][node2] = E->NODE[level][node2] & (~VBX);
+		  E->NODE[level][node2] = E->NODE[level][node2] | SBX;
+		  }
+	       }
 
-	/* all vbc's apply at all levels  */
-	for(level = E->mesh.levmax; level >= E->mesh.levmin; level--)
-	{
-		nox = E->lmesh.NOX[level];
-		noz = E->lmesh.NOZ[level];
-		noy = E->lmesh.NOY[level];
+	    }    /* end for loop i & j  */
+  }                   /* end for loop level */
 
-		if(E->parallel.me_loc[1] == 0 || E->parallel.me_loc[1] == E->parallel.nprocx - 1)
-			for(j = 1; j <= noy; j++)
-				for(i = 1; i <= noz; i++)
-				{
-					node1 = i + (j - 1) * noz * nox;
-					node2 = node1 + (nox - 1) * noz;
-					ii = i + E->lmesh.NZS[level] - 1;
-					if(E->parallel.me_loc[1] == 0)
-					{
-						E->NODE[level][node1] = E->NODE[level][node1] & (~SBX);
-						E->NODE[level][node1] = E->NODE[level][node1] | (VBX);
-						if((ii != 1) && (ii != E->mesh.NOZ[level]))
-						{
-							E->NODE[level][node1] = E->NODE[level][node1] & (~VBY);
-							E->NODE[level][node1] = E->NODE[level][node1] | SBY;
-							E->NODE[level][node1] = E->NODE[level][node1] & (~VBZ);
-							E->NODE[level][node1] = E->NODE[level][node1] | SBZ;
-						}
-					}
-					if(E->parallel.me_loc[1] == E->parallel.nprocx - 1)
-					{
-						E->NODE[level][node2] = E->NODE[level][node2] & (~SBX);
-						E->NODE[level][node2] = E->NODE[level][node2] | (VBX);
-						if((ii != 1) && (ii != E->mesh.NOZ[level]))
-						{
-							E->NODE[level][node2] = E->NODE[level][node2] & (~VBY);
-							E->NODE[level][node2] = E->NODE[level][node2] | SBY;
-							E->NODE[level][node2] = E->NODE[level][node2] & (~VBZ);
-							E->NODE[level][node2] = E->NODE[level][node2] | SBZ;
-						}
-					}
-				}				/* end for loop i & j */
+ 
+  return;
+}
 
-		if(E->parallel.me_loc[2] == 0 || E->parallel.me_loc[2] == E->parallel.nprocy - 1)
-			for(j = 1; j <= nox; j++)
-				for(i = 1; i <= noz; i++)
-				{
-					node1 = i + (j - 1) * noz;
-					node2 = node1 + (noy - 1) * noz * nox;
-					ii = i + E->lmesh.NZS[level] - 1;
-					jj = j + E->lmesh.NXS[level] - 1;
-					if(E->parallel.me_loc[2] == 0)
-					{
-						E->NODE[level][node1] = E->NODE[level][node1] | VBY;
-						E->NODE[level][node1] = E->NODE[level][node1] & (~SBY);
-						if((ii != 1) && (ii != E->mesh.NOZ[level]))
-						{
-							E->NODE[level][node1] = E->NODE[level][node1] & (~VBZ);
-							E->NODE[level][node1] = E->NODE[level][node1] | SBZ;
-						}
-						if((jj != 1) && (jj != E->mesh.NOX[level]) && (ii != 1) && (ii != E->mesh.NOZ[level]))
-						{
-							E->NODE[level][node1] = E->NODE[level][node1] & (~VBX);
-							E->NODE[level][node1] = E->NODE[level][node1] | SBX;
-						}
-					}
-					if(E->parallel.me_loc[2] == E->parallel.nprocy - 1)
-					{
-						E->NODE[level][node2] = E->NODE[level][node2] | VBY;
-						E->NODE[level][node2] = E->NODE[level][node2] & (~SBY);
-						if((ii != 1) && (ii != E->mesh.NOZ[level]))
-						{
-							E->NODE[level][node2] = E->NODE[level][node2] & (~VBZ);
-							E->NODE[level][node2] = E->NODE[level][node2] | SBZ;
-						}
-						if((jj != 1) && (jj != E->mesh.NOX[level]) && (ii != 1) && (ii != E->mesh.NOZ[level]))
-						{
-							E->NODE[level][node2] = E->NODE[level][node2] & (~VBX);
-							E->NODE[level][node2] = E->NODE[level][node2] | SBX;
-						}
-					}
 
-				}				/* end for loop i & j  */
-	}							/* end for loop level */
-
-
-	return;
-}
-
 void temperature_refl_vert_bc(struct All_variables *E)
 {
 	int i, j;
@@ -396,6 +378,7 @@
 }
 
 
+
 void temperature_imposed_botm_bcs(struct All_variables *E, float *BC[], int dirn)
 {
 	//int i, j, node, rowl;
@@ -473,30 +456,212 @@
 }
 
 
-void velocity_apply_periodic_bcs(struct All_variables *E)
+void velocity_apply_periodic_bcs(E)
+    struct All_variables *E;
 {
-	//int n1, n2, level;
-	//int i, j, ii, jj;
-	//const int dims = E->mesh.nsd;
 
-	fprintf(E->fp, "Periodic boundary conditions\n");
+  int i,j,ii,jj;
+  int node1,node2;
+  int level,nox,noy,noz;
+  const int dims=E->mesh.nsd;
 
-	return;
+  fprintf(E->fp,"Periodic boundary conditions\n");
+
+ if (E->mesh.periodic_y && E->mesh.periodic_x)    {
+    return;
+   }
+
+ else if (E->mesh.periodic_y)     {
+
+  /* except one side with XOZ and y=0, all others are not reflecting BC*/
+  /* for two YOZ planes if 3-D, or two OZ side walls for 2-D */
+
+  if (E->parallel.me_loc[1]==0 || E->parallel.me_loc[1]==E->parallel.nprocx-1)
+    for(j=1;j<=E->lmesh.noy;j++)
+      for(i=1;i<=E->lmesh.noz;i++)  {
+        node1 = i  + (j-1)*E->lmesh.noz*E->lmesh.nox;
+        node2 = node1 + (E->lmesh.nox-1)*E->lmesh.noz;
+
+        ii = i + E->lmesh.nzs - 1;
+        if (E->parallel.me_loc[1]==0 )  {
+          E->VB[1][node1] = 0.0;
+          if((ii != 1) && (ii != E->mesh.noz))
+              E->VB[3][node1] = 0.0;
+          }
+        if (E->parallel.me_loc[1]==E->parallel.nprocx-1)  {
+          E->VB[1][node2] = 0.0;
+          if((ii != 1) && (ii != E->mesh.noz))
+              E->VB[3][node2] = 0.0;
+          }
+        }      /* end loop for i and j */
+
+   }
+
+ else if (E->mesh.periodic_x)     {
+
+  /* for two XOZ planes if 3-D */
+
+    if (E->parallel.me_loc[2]==0 || E->parallel.me_loc[2]==E->parallel.nprocy-1)
+      for(j=1;j<=E->lmesh.nox;j++)
+        for(i=1;i<=E->lmesh.noz;i++)       {
+          node1 = i +(j-1)*E->lmesh.noz;
+          node2 = node1+(E->lmesh.noy-1)*E->lmesh.noz*E->lmesh.nox;
+          ii = i + E->lmesh.nzs - 1;
+
+          if (E->parallel.me_loc[2]==0)  {
+             E->VB[2][node1] = 0.0;
+             if((ii != 1) && (ii != E->mesh.noz))
+                E->VB[3][node1] = 0.0;
+             }
+          if (E->parallel.me_loc[2]==E->parallel.nprocy-1)  {
+             E->VB[2][node2] = 0.0;
+             if((ii != 1) && (ii != E->mesh.noz))
+                E->VB[3][node2] = 0.0;
+             }
+          }    /* end of loop i & j */
+   }
+
+  /* all vbc's apply at all levels  */
+for(level=E->mesh.levmax;level>=E->mesh.levmin;level--) {
+    nox = E->lmesh.NOX[level] ;
+    noz = E->lmesh.NOZ[level] ;
+    noy = E->lmesh.NOY[level] ;
+
+  if (E->mesh.periodic_y)     {
+
+    if (E->parallel.me_loc[1]==0 || E->parallel.me_loc[1]==E->parallel.nprocx-1)
+      for(j=1;j<=noy;j++)
+        for(i=1;i<=noz;i++) {
+          node1 = i + (j-1)*noz*nox ;
+          node2 = node1 + (nox-1) * noz ;
+          ii = i + E->lmesh.NZS[level] - 1;
+          if (E->parallel.me_loc[1]==0 )  {
+              E->NODE[level][node1] = E->NODE[level][node1] & (~SBX);
+              E->NODE[level][node1] = E->NODE[level][node1] | (VBX);
+              if((ii!=1) && (ii!=E->mesh.NOZ[level])) {
+                  E->NODE[level][node1] = E->NODE[level][node1] & (~VBY);
+                  E->NODE[level][node1] = E->NODE[level][node1] | SBY;
+                  E->NODE[level][node1] = E->NODE[level][node1] & (~ VBZ);
+                  E->NODE[level][node1] = E->NODE[level][node1] | SBZ;
+                  }
+              }
+          if (E->parallel.me_loc[1]==E->parallel.nprocx-1)  {
+              E->NODE[level][node2] = E->NODE[level][node2] & (~SBX);
+              E->NODE[level][node2] = E->NODE[level][node2] | (VBX);
+              if((ii!=1) && (ii!=E->mesh.NOZ[level])) {
+                  E->NODE[level][node2] = E->NODE[level][node2] & (~VBY);
+                  E->NODE[level][node2] = E->NODE[level][node2] | SBY;
+                  E->NODE[level][node2] = E->NODE[level][node2] & (~ VBZ);
+                  E->NODE[level][node2] = E->NODE[level][node2] | SBZ;
+                  }
+              }
+          }   /* end for loop i & j */
+     }
+
+  if (E->mesh.periodic_x)     {
+
+      if (E->parallel.me_loc[2]==0 || E->parallel.me_loc[2]==E->parallel.nprocy-1)
+        for(j=1;j<=nox;j++)
+          for(i=1;i<=noz;i++) {
+            node1 = i + (j-1)*noz;
+            node2 = node1+(noy-1)*noz*nox;
+            ii = i + E->lmesh.NZS[level] - 1;
+            jj = j + E->lmesh.NXS[level] - 1;
+            if (E->parallel.me_loc[2]==0)  {
+               E->NODE[level][node1] = E->NODE[level][node1] | VBY;
+               E->NODE[level][node1] = E->NODE[level][node1] & (~SBY);
+               if((ii!= 1) && (ii != E->mesh.NOZ[level]))  {
+                  E->NODE[level][node1] = E->NODE[level][node1] & (~VBZ);
+                  E->NODE[level][node1] = E->NODE[level][node1] | SBZ;
+                  }
+               if((jj!=1) && (jj!=E->mesh.NOX[level]) && (ii!=1) && (ii!=E->mesh.NOZ[level])){
+                  E->NODE[level][node1] = E->NODE[level][node1] & (~VBX);
+                  E->NODE[level][node1] = E->NODE[level][node1] | SBX;
+                  }
+               }
+            if (E->parallel.me_loc[2]==E->parallel.nprocy-1) {
+               E->NODE[level][node2] = E->NODE[level][node2] | VBY;
+               E->NODE[level][node2] = E->NODE[level][node2] & (~SBY);
+               if((ii!= 1) && (ii != E->mesh.NOZ[level]))  {
+                  E->NODE[level][node2] = E->NODE[level][node2] & (~VBZ);
+                  E->NODE[level][node2] = E->NODE[level][node2] | SBZ;
+                  }
+               if((jj!=1) && (jj!=E->mesh.NOX[level]) && (ii!=1) && (ii!=E->mesh.NOZ[level])){
+                  E->NODE[level][node2] = E->NODE[level][node2] & (~VBX);
+                  E->NODE[level][node2] = E->NODE[level][node2] | SBX;
+                  }
+               }
+
+            }    /* end for loop i & j  */
+     }
+
+  }                   /* end for loop level */
+
+    return;
+
 }
 
-void temperature_apply_periodic_bcs(struct All_variables *E)
+void temperature_apply_periodic_bcs(E)
+    struct All_variables *E;
 {
-	//int n1, n2, e1, level;
-	//int i, j, ii, jj;
-	//const int dims = E->mesh.nsd;
+  int i,j;
+  int node1,node2;
+  const int dims=E->mesh.nsd;
 
-	fprintf(E->fp, "Periodic temperature boundary conditions\n");
+ /* Temps and bc-values  at top level only */
+/* fixed temperature at x=0 */
 
-	return;
-}
+ if (E->mesh.periodic_x && E->mesh.periodic_y)  {
+   return;
+   }
 
+ else if (E->mesh.periodic_y)  {
 
+  if (E->parallel.me_loc[1]==0 || E->parallel.me_loc[1]==E->parallel.nprocx-1)
+    for(j=1;j<=E->lmesh.noy;j++)
+      for(i=1;i<=E->lmesh.noz;i++) {
+        node1 = i  + (j-1)*E->lmesh.noz*E->lmesh.nox;
+        node2 = node1 + (E->lmesh.nox-1)*E->lmesh.noz;
+        if (E->parallel.me_loc[1]==0 )                   {
+          E->node[node1] = E->node[node1] & (~TBX);
+          E->node[node1] = E->node[node1] | FBX;
+          E->TB[1][node1] = 0.0;
+          }
+        if (E->parallel.me_loc[1]==E->parallel.nprocx-1)   {
+          E->node[node2] = E->node[node2] & (~TBX);
+          E->node[node2] = E->node[node2] | FBX;
+          E->TB[1][node2] = 0.0;
+          }
+        }       /* end for loop i & j */
+      }
 
+ else if (E->mesh.periodic_x)  {
+    if (E->parallel.me_loc[2]==0 || E->parallel.me_loc[2]==E->parallel.nprocy-1)
+      for(j=1;j<=E->lmesh.nox;j++)
+        for(i=1;i<=E->lmesh.noz;i++) {
+          node1 = i +(j-1)*E->lmesh.noz;
+          node2 = node1 +  (E->lmesh.noy-1)*E->lmesh.noz*E->lmesh.nox;
+          if (E->parallel.me_loc[2]==0 ) {
+             E->node[node1] = E->node[node1] & (~TBY);
+             E->node[node1] = E->node[node1] | FBY;
+             E->TB[2][node1] = 0.0;
+             }
+          if (E->parallel.me_loc[2]==E->parallel.nprocy-1) {
+             E->node[node2] = E->node[node2] & (~TBY);
+             E->node[node2] = E->node[node2] | FBY;
+             E->TB[2][node2] = 0.0;
+             }
+      }
+    }
+
+ fprintf(E->fp,"Periodic temperature boundary conditions\n");
+
+  return;
+  }
+
+
+
+
 void strip_bcs_from_residual(struct All_variables *E, double *Res, int level)
 {
 	int i;

Modified: mc/3D/CitcomCU/trunk/src/Ggrd_handling.c
===================================================================
--- mc/3D/CitcomCU/trunk/src/Ggrd_handling.c	2012-02-19 23:14:17 UTC (rev 19653)
+++ mc/3D/CitcomCU/trunk/src/Ggrd_handling.c	2012-02-19 23:31:26 UTC (rev 19654)
@@ -371,7 +371,7 @@
 	  setflag =1;
 	}						// end for if else if of geometry
 	
-    }	/* end perturnbation branch  */
+    }	/* end perturbation branch  */
     /* 
 
     now deal with composition
@@ -417,9 +417,7 @@
     MPI_Allreduce(&c1_local, &c1_total,1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
     E->tracers_dense_frac = (float)c1_total/(float)n_total;
     /* check if we restrict assignment */
-    if(E->parallel.me==0)
-      fprintf(stderr,"assigned C>0.5 %i/%i times out of %i/%i, %.1f%%\n",
-	      c1_local,c1_total,E->lmesh.nno,n_total,E->tracers_dense_frac*100.);
+   
     if(E->tracers_assign_dense_only){
       if(E->parallel.me == 0)
 	fprintf(stderr,"compares with restricted set dense fraction estimate of %g%%\n",
@@ -428,8 +426,13 @@
 	myerror("increase the dense fraction for assignment, too small",E);
     }
 
-    if(E->control.composition)
+    if(E->control.composition){
+
+      if(E->parallel.me==0)
+	fprintf(stderr,"assigned C>0.5 %i/%i times out of %i/%i, %.1f%%\n",
+		c1_local,c1_total,E->lmesh.nno,n_total,E->tracers_dense_frac*100.);
       convection_initial_markers(E,1);
+    }
   }							// end for restart==0
   else if(E->control.restart)
     {

Modified: mc/3D/CitcomCU/trunk/src/Parallel_related.c
===================================================================
--- mc/3D/CitcomCU/trunk/src/Parallel_related.c	2012-02-19 23:14:17 UTC (rev 19653)
+++ mc/3D/CitcomCU/trunk/src/Parallel_related.c	2012-02-19 23:31:26 UTC (rev 19654)
@@ -187,178 +187,271 @@
 	return;
 }
 
+
 void parallel_shuffle_ele_and_id_bc1(struct All_variables *E)
-{
-	//int i, ii, j, k, l, node, node1, el, elt, lnode, llnode, jj, k1, k2;
-	int i, ii, j, k, node, node1, llnode;
-	//int lev, elx, elz, ely, nel, nno, nox, noz, noy;
-	int lev, elx, elz, ely, nel, nox, noz, noy;
+  {
 
-	for(lev = E->mesh.levmax; lev >= E->mesh.levmin; lev--)
-	{
-		nel = E->lmesh.NEL[lev];
-		elx = E->lmesh.ELX[lev];
-		elz = E->lmesh.ELZ[lev];
-		ely = E->lmesh.ELY[lev];
-		nox = E->lmesh.NOX[lev];
-		noy = E->lmesh.NOY[lev];
-		noz = E->lmesh.NOZ[lev];
+  int i,ii,j,k,l,node,node1,el,elt,lnode,llnode,jj,k1,k2;
+  int lev,elx,elz,ely,nel,nno,nox,noz,noy;
 
-		ii = 0;
+  for(lev=E->mesh.levmax;lev>=E->mesh.levmin;lev--){
+      nel = E->lmesh.NEL[lev];
+      elx = E->lmesh.ELX[lev];
+      elz = E->lmesh.ELZ[lev];
+      ely = E->lmesh.ELY[lev];
+      nox = E->lmesh.NOX[lev];
+      noy = E->lmesh.NOY[lev];
+      noz = E->lmesh.NOZ[lev];
+ 
+      ii = 0;
 
-		for(i = 1; i <= 2; i++)
-		{						/* do the ZOY boundary elements first */
-			ii++;
-			if((i == 1 && E->parallel.me_loc[1] != 0) || (i == 2 && E->parallel.me_loc[1] != E->parallel.nprocx - 1))
-			{
-				for(k = 1; k <= noy; k++)
-					for(j = 1; j <= noz; j++)
-					{
-						node = j + (((i == 1) ? 1 : nox) - 1) * noz + (k - 1) * noz * nox;
-						llnode = j + (k - 1) * noz;
-						E->parallel.NODE[lev][llnode].bound[1][i] = node;
-						E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
-						E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
-						node1 = node + (((i == 1) ? 1 : -1)) * noz;
-						E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
-					}
-				E->parallel.NUM_NNO[lev].bound[1][i] = noy * noz;
-			}
-		}						/* end for i   */
+      for(i=1;i<=2;i++)       {       /* do the ZOY boundary elements first */
+         ii ++;
+         if ( (i==1&&E->parallel.me_loc[1]!=0) || (i==2&&E->parallel.me_loc[1]!=E->parallel.nprocx-1))        {
+   	     for(k=1;k<=noy;k++)
+ 	       for(j=1;j<=noz;j++)   {
+	         node = j + ( ((i==1)?1:nox)-1 )*noz + (k-1)*noz*nox;
+	         llnode = j+(k-1)*noz;
+	         E->parallel.NODE[lev][llnode].bound[1][i] = node;
+                 E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                 E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+	         node1 = node + ( ((i==1)?1:-1) )*noz;
+                 E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+	         }
+	     E->parallel.NUM_NNO[lev].bound[1][i] = noy*noz;
+             }
+	 }         /* end for i   */
 
-		for(j = 1; j <= 2; j++)
-		{						/* do XOY boundary elements */
-			ii++;
-			if((j == 1 && E->parallel.me_loc[3] != 0) || (j == 2 && E->parallel.me_loc[3] != E->parallel.nprocz - 1))
-			{
-				for(k = 1; k <= noy; k++)
-					for(i = 1; i <= nox; i++)
-					{
-						node = ((j == 1) ? 1 : noz) + (i - 1) * noz + (k - 1) * noz * nox;
-						llnode = i + (k - 1) * nox;
-						E->parallel.NODE[lev][llnode].bound[3][j] = node;
-						E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
-						E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
-						node1 = node + (((j == 1) ? 1 : -1));
-						E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
-					}
-				E->parallel.NUM_NNO[lev].bound[3][j] = nox * noy;
-			}
-		}						/* end for j   */
+      for(j=1;j<=2;j++)       {   /* do XOY boundary elements */
+         ii ++;
+         if ( (j==1&&E->parallel.me_loc[3]!=0) || (j==2&&E->parallel.me_loc[3]!=E->parallel.nprocz-1))        {
+  	     for(k=1;k<=noy;k++)
+ 	       for(i=1;i<=nox;i++)   {
+	         node = ((j==1)?1:noz) + (i-1)*noz + (k-1)*noz*nox;
+	         llnode = i+(k-1)*nox;
+	         E->parallel.NODE[lev][llnode].bound[3][j] = node;
+                 E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                 E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+	         node1 = node + ( ((j==1)?1:-1) );
+                 E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+	         }
+	     E->parallel.NUM_NNO[lev].bound[3][j] = nox*noy;
+	     }
+	  }         /* end for j   */
 
-		for(k = 1; k <= 2; k++)
-		{						/* do XOZ boundary elements for 3D */
-			ii++;
-			if((k == 1 && E->parallel.me_loc[2] != 0) || (k == 2 && E->parallel.me_loc[2] != E->parallel.nprocy - 1))
-			{
-				for(j = 1; j <= noz; j++)
-					for(i = 1; i <= nox; i++)
-					{
-						node = j + (i - 1) * noz + (((k == 1) ? 1 : noy) - 1) * noz * nox;
-						llnode = j + (i - 1) * noz;
-						E->parallel.NODE[lev][llnode].bound[2][k] = node;
-						E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
-						E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
-						node1 = node + (((k == 1) ? 1 : -1)) * noz * nox;
-						E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
-					}
-				E->parallel.NUM_NNO[lev].bound[2][k] = nox * noz;
-			}
-		}						/* end for k */
+      for(k=1;k<=2;k++)        {  /* do XOZ boundary elements for 3D */
+           ii ++;
+           if ( (k==1&&E->parallel.me_loc[2]!=0) || (k==2&&E->parallel.me_loc[2]!=E->parallel.nprocy-1))        {
+ 	       for(j=1;j<=noz;j++)
+ 	         for(i=1;i<=nox;i++)   {
+	           node = j + (i-1)*noz + (((k==1)?1:noy)-1)*noz*nox;
+	           llnode = j+(i-1)*noz;
+	           E->parallel.NODE[lev][llnode].bound[2][k] = node;
+                   E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                   E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+	           node1 = node + ( ((k==1)?1:-1) )*noz*nox;
+                   E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+	           }
+	       E->parallel.NUM_NNO[lev].bound[2][k] = nox*noz;
+	       }       
+	     }       /* end for k */
 
 
-		E->parallel.num_b = ii;
+      E->parallel.num_b = ii;
 
-	}							/* end for level */
+      }   /* end for level */
+  
+  return;
+  }
 
-	return;
-}
-
 // for periodic BC 
 //
 void parallel_shuffle_ele_and_id_bc2(struct All_variables *E)
-{
-	//int i, ii, j, k, l, node, node1, el, elt, lnode, llnode, jj, k1, k2;
-	int i, ii, j, k, node, node1, llnode;
-	//int lev, elx, elz, ely, nel, nno, nox, noz, noy;
-	int lev, elx, elz, ely, nel, nox, noz, noy;
 
-	for(lev = E->mesh.levmax; lev >= E->mesh.levmin; lev--)
-	{
-		nel = E->lmesh.NEL[lev];
-		elx = E->lmesh.ELX[lev];
-		elz = E->lmesh.ELZ[lev];
-		ely = E->lmesh.ELY[lev];
-		nox = E->lmesh.NOX[lev];
-		noy = E->lmesh.NOY[lev];
-		noz = E->lmesh.NOZ[lev];
+  {
 
-		ii = 0;
+  int i,ii,j,k,l,node,node1,el,elt,lnode,llnode,jj,k1,k2;
+  int lev,elx,elz,ely,nel,nno,nox,noz,noy;
 
-		for(i = 1; i <= 2; i++)
-		{						/* do the ZOY boundary elements first */
-			ii++;
-			for(k = 1; k <= noy; k++)
-				for(j = 1; j <= noz; j++)
-				{
-					node = j + (((i == 1) ? 1 : nox) - 1) * noz + (k - 1) * noz * nox;
-					llnode = j + (k - 1) * noz;
-					E->parallel.NODE[lev][llnode].bound[1][i] = node;
-					E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
-					E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
-					node1 = node + (((i == 1) ? 1 : -1)) * noz;
-					E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
-				}
-			E->parallel.NUM_NNO[lev].bound[1][i] = noy * noz;
-		}						/* end for i   */
+  for(lev=E->mesh.levmax;lev>=E->mesh.levmin;lev--){
+      nel = E->lmesh.NEL[lev];
+      elx = E->lmesh.ELX[lev];
+      elz = E->lmesh.ELZ[lev];
+      ely = E->lmesh.ELY[lev];
+      nox = E->lmesh.NOX[lev];
+      noy = E->lmesh.NOY[lev];
+      noz = E->lmesh.NOZ[lev];
 
-		for(j = 1; j <= 2; j++)
-		{						/* do XOY boundary elements */
-			ii++;
-			if((j == 1 && E->parallel.me_loc[3] != 0) || (j == 2 && E->parallel.me_loc[3] != E->parallel.nprocz - 1))
-			{
-				for(k = 1; k <= noy; k++)
-					for(i = 1; i <= nox; i++)
-					{
-						node = ((j == 1) ? 1 : noz) + (i - 1) * noz + (k - 1) * noz * nox;
-						llnode = i + (k - 1) * nox;
-						E->parallel.NODE[lev][llnode].bound[3][j] = node;
-						E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
-						E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
-						node1 = node + (((j == 1) ? 1 : -1));
-						E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
-					}
-			}
-			E->parallel.NUM_NNO[lev].bound[3][j] = nox * noy;
-		}						/* end for j   */
+      ii = 0;
 
-		for(k = 1; k <= 2; k++)
-		{						/* do XOZ boundary elements for 3D */
-			ii++;
-			for(j = 1; j <= noz; j++)
-				for(i = 1; i <= nox; i++)
-				{
-					node = j + (i - 1) * noz + (((k == 1) ? 1 : noy) - 1) * noz * nox;
-					llnode = j + (i - 1) * noz;
-					E->parallel.NODE[lev][llnode].bound[2][k] = node;
-					E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
-					E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
-					node1 = node + (((k == 1) ? 1 : -1)) * noz * nox;
-					E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
-				}
-			E->parallel.NUM_NNO[lev].bound[2][k] = nox * noz;
-		}						/* end for k */
+      for(j=1;j<=2;j++)       {   /* do XOY boundary elements */
+         ii ++;
+         if ( (j==1&&E->parallel.me_loc[3]!=0) || (j==2&&E->parallel.me_loc[3]!=E->parallel.nprocz-1))        {
+             for(k=1;k<=noy;k++)
+               for(i=1;i<=nox;i++)   {
+                 node = ((j==1)?1:noz) + (i-1)*noz + (k-1)*noz*nox;
+                 llnode = i+(k-1)*nox;
+                 E->parallel.NODE[lev][llnode].bound[3][j] = node;
+                 E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                 E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+                 node1 = node + ( ((j==1)?1:-1) );
+                 E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+                 }
+                 }
+             E->parallel.NUM_NNO[lev].bound[3][j] = nox*noy;
+          }         /* end for j   */
 
+  }
 
-		E->parallel.num_b = ii;
+if (E->mesh.periodic_y && E->mesh.periodic_x)    {
 
-	}							/* end for level */
+  for(lev=E->mesh.levmax;lev>=E->mesh.levmin;lev--){
+      nel = E->lmesh.NEL[lev];
+      elx = E->lmesh.ELX[lev];
+      elz = E->lmesh.ELZ[lev];
+      ely = E->lmesh.ELY[lev];
+      nox = E->lmesh.NOX[lev];
+      noy = E->lmesh.NOY[lev];
+      noz = E->lmesh.NOZ[lev];
 
-	return;
-}
+      ii = 0;
 
+      for(i=1;i<=2;i++)       {       /* do the ZOY boundary elements first */
+         ii ++;
+             for(k=1;k<=noy;k++)
+               for(j=1;j<=noz;j++)   {
+                 node = j + ( ((i==1)?1:nox)-1 )*noz + (k-1)*noz*nox;
+                 llnode = j+(k-1)*noz;
+                 E->parallel.NODE[lev][llnode].bound[1][i] = node;
+                 E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                 E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+                 node1 = node + ( ((i==1)?1:-1) )*noz;
+                 E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+                 }
+             E->parallel.NUM_NNO[lev].bound[1][i] = noy*noz;
+         }         /* end for i   */
 
+      for(k=1;k<=2;k++)        {  /* do XOZ boundary elements for 3D */
+           ii ++;
+               for(j=1;j<=noz;j++)
+                 for(i=1;i<=nox;i++)   {
+                   node = j + (i-1)*noz + (((k==1)?1:noy)-1)*noz*nox;
+                   llnode = j+(i-1)*noz;
+                   E->parallel.NODE[lev][llnode].bound[2][k] = node;
+                   E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                   E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+                   node1 = node + ( ((k==1)?1:-1) )*noz*nox;
+                   E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+                   }
+               E->parallel.NUM_NNO[lev].bound[2][k] = nox*noz;
+             }       /* end for k */
 
+
+      }   /* end for level */
+   }
+
+else if (E->mesh.periodic_x)    {
+
+  for(lev=E->mesh.levmax;lev>=E->mesh.levmin;lev--){
+      nel = E->lmesh.NEL[lev];
+      elx = E->lmesh.ELX[lev];
+      elz = E->lmesh.ELZ[lev];
+      ely = E->lmesh.ELY[lev];
+      nox = E->lmesh.NOX[lev];
+      noy = E->lmesh.NOY[lev];
+      noz = E->lmesh.NOZ[lev];
+
+      ii = 0;
+
+      for(i=1;i<=2;i++)       {       /* do the ZOY boundary elements first */
+         ii ++;
+             for(k=1;k<=noy;k++)
+               for(j=1;j<=noz;j++)   {
+                 node = j + ( ((i==1)?1:nox)-1 )*noz + (k-1)*noz*nox;
+                 llnode = j+(k-1)*noz;
+                 E->parallel.NODE[lev][llnode].bound[1][i] = node;
+                 E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                 E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+                 node1 = node + ( ((i==1)?1:-1) )*noz;
+                 E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+                 }
+             E->parallel.NUM_NNO[lev].bound[1][i] = noy*noz;
+         }         /* end for i   */
+
+      for(k=1;k<=2;k++)        {  /* do XOZ boundary elements for 3D */
+           ii ++;
+           if ( (k==1&&E->parallel.me_loc[2]!=0) || (k==2&&E->parallel.me_loc[2]!=E->parallel.nprocy-1))        {
+               for(j=1;j<=noz;j++)
+                 for(i=1;i<=nox;i++)   {
+                   node = j + (i-1)*noz + (((k==1)?1:noy)-1)*noz*nox;
+                   llnode = j+(i-1)*noz;
+                   E->parallel.NODE[lev][llnode].bound[2][k] = node;
+                   E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                   E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+                   node1 = node + ( ((k==1)?1:-1) )*noz*nox;
+                   E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+                   }
+                   }
+               E->parallel.NUM_NNO[lev].bound[2][k] = nox*noz;
+             }       /* end for k */
+
+      }   /* end for level */
+   }
+
+else if (E->mesh.periodic_y)    {
+
+  for(lev=E->mesh.levmax;lev>=E->mesh.levmin;lev--){
+      nel = E->lmesh.NEL[lev];
+      elx = E->lmesh.ELX[lev];
+      elz = E->lmesh.ELZ[lev];
+      ely = E->lmesh.ELY[lev];
+      nox = E->lmesh.NOX[lev];
+      noy = E->lmesh.NOY[lev];
+      noz = E->lmesh.NOZ[lev];
+
+      ii = 0;
+
+      for(i=1;i<=2;i++)       {       /* do the ZOY boundary elements first */
+         ii ++;
+           if ( (i==1&&E->parallel.me_loc[1]!=0) || (i==2&&E->parallel.me_loc[1]!=E->parallel.nprocx-1))        {
+             for(k=1;k<=noy;k++)
+               for(j=1;j<=noz;j++)   {
+                 node = j + ( ((i==1)?1:nox)-1 )*noz + (k-1)*noz*nox;
+                 llnode = j+(k-1)*noz;
+                 E->parallel.NODE[lev][llnode].bound[1][i] = node;
+                 E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                 E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+                 node1 = node + ( ((i==1)?1:-1) )*noz;
+                 E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+                 }
+                 }
+             E->parallel.NUM_NNO[lev].bound[1][i] = noy*noz;
+         }         /* end for i   */
+
+      for(k=1;k<=2;k++)        {  /* do XOZ boundary elements for 3D */
+           ii ++;
+               for(j=1;j<=noz;j++)
+                 for(i=1;i<=nox;i++)   {
+                   node = j + (i-1)*noz + (((k==1)?1:noy)-1)*noz*nox;
+                   llnode = j+(i-1)*noz;
+                   E->parallel.NODE[lev][llnode].bound[2][k] = node;
+                   E->NODE[lev][node] = E->NODE[lev][node] | OFFSIDE;
+                   E->NODE[lev][node] = E->NODE[lev][node] | LIDN;
+                   node1 = node + ( ((k==1)?1:-1) )*noz*nox;
+                   E->NODE[lev][node1] = E->NODE[lev][node1] | LIDN;
+                   }
+               E->parallel.NUM_NNO[lev].bound[2][k] = nox*noz;
+             }       /* end for k */
+
+      }   /* end for level */
+   }
+
+
+  return;
+  }
+
+
+
 /* ============================================ 
  determine communication routs  and boundary ID for 
  exchange info across the boundaries
@@ -366,591 +459,572 @@
 
 void parallel_communication_routs(struct All_variables *E)
 {
-	if(E->mesh.periodic_x || E->mesh.periodic_y)
-	{
-		parallel_communication_routs2(E);
-		if(E->control.composition)
-			parallel_communication_routs4(E);
-	}
-	else
-	{
-		parallel_communication_routs1(E);
-		if(E->control.composition)
-			parallel_communication_routs3(E);
-	}
-
-	return;
+  if(E->mesh.periodic_x || E->mesh.periodic_y)
+    {
+      parallel_communication_routs2(E);
+      if(E->control.composition)
+	parallel_communication_routs4(E);
+    }
+  else
+    {
+      parallel_communication_routs1(E);
+      if(E->control.composition)
+	parallel_communication_routs3(E);
+    }
+  
+  return;
 }
 
 
-
 void parallel_communication_routs1(struct All_variables *E)
-{
-	//int i, ii, j, k, l, node, el, elt, lnode, jj, doff;
-	int i, ii, j, k, node, lnode, jj, doff;
-	int lev, elx, elz, ely, nno, nox, noz, noy, p, kkk, kk;
-	int me, nprocz, nprocx, nprocy;
 
-	me = E->parallel.me;
-	nprocx = E->parallel.nprocx;
-	nprocz = E->parallel.nprocz;
-	nprocy = E->parallel.nprocy;
+  {
+  int i,ii,j,k,l,node,el,elt,lnode,jj,doff;
+  int lev,elx,elz,ely,nno,nox,noz,noy,p,kkk,kk;
+  int me, nprocz,nprocx, nprocy;
 
-	for(lev = E->mesh.levmax; lev >= E->mesh.levmin; lev--)
-	{
-		elx = E->lmesh.ELX[lev];
-		elz = E->lmesh.ELZ[lev];
-		ely = E->lmesh.ELY[lev];
-		nox = E->lmesh.NOX[lev];
-		noy = E->lmesh.NOY[lev];
-		noz = E->lmesh.NOZ[lev];
-		nno = E->lmesh.NNO[lev];
+  me = E->parallel.me;
+  nprocx = E->parallel.nprocx;
+  nprocz = E->parallel.nprocz;
+  nprocy = E->parallel.nprocy;
+  
+  for(lev=E->mesh.levmax;lev>=E->mesh.levmin;lev--){
+     elx = E->lmesh.ELX[lev];
+     elz = E->lmesh.ELZ[lev];
+     ely = E->lmesh.ELY[lev];
+     nox = E->lmesh.NOX[lev];
+     noy = E->lmesh.NOY[lev];
+     noz = E->lmesh.NOZ[lev];
+     nno = E->lmesh.NNO[lev];
+ 
+     ii = 0;
+     kkk = 0;
+     if (E->mesh.nsd == 2) {     
 
-		ii = 0;
-		kkk = 0;
-		if(E->mesh.nsd == 2)
-		{
+       for(i=1;i<=2;i++)    {     /* do the OZ boundaries */
 
-			for(i = 1; i <= 2; i++)
-			{					/* do the OZ boundaries */
+         ii ++;
 
-				ii++;
+	     E->parallel.NUM_PASS[lev].bound[1][i] = 1;
+	     if (E->parallel.me_loc[1]==0 && i==1)
+	       E->parallel.NUM_PASS[lev].bound[1][i] = 0;
+	     else if (E->parallel.me_loc[1]==nprocx-1 && i==2)
+	       E->parallel.NUM_PASS[lev].bound[1][i] = 0;
 
-				E->parallel.NUM_PASS[lev].bound[1][i] = 1;
-				if(E->parallel.me_loc[1] == 0 && i == 1)
-					E->parallel.NUM_PASS[lev].bound[1][i] = 0;
-				else if(E->parallel.me_loc[1] == nprocx - 1 && i == 2)
-					E->parallel.NUM_PASS[lev].bound[1][i] = 0;
+         for (p=1;p<=E->parallel.NUM_PASS[lev].bound[1][i];p++)  {
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[1][i]; p++)
-				{
+	       kkk ++;
+                 /* determine the pass ID for ii-th boundary and p-th pass */
 
-					kkk++;
-					/* determine the pass ID for ii-th boundary and p-th pass */
+                 /* for kkk th pass, get the # of data to be passed */
+	       E->parallel.NUM_NEQ[lev].pass[1][i] = ((p==1)?E->parallel.NUM_NNO[lev].bound[1][i]:noy) *E->mesh.nsd;
+	       E->parallel.NUM_NODE[lev].pass[1][i] = ((p==1)?E->parallel.NUM_NNO[lev].bound[1][i]:noy);
 
-					/* for kkk th pass, get the # of data to be passed */
-					E->parallel.NUM_NEQ[lev].pass[1][i] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[1][i] : noy) * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[1][i] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[1][i] : noy);
+  /* for kkk th pass, determine the target processor */
 
-					/* for kkk th pass, determine the target processor */
+	       E->parallel.PROCESSOR[lev].pass[1][i]=me-((i==1)?1:-1)*nprocz;
 
-					E->parallel.PROCESSOR[lev].pass[1][i] = me - ((i == 1) ? 1 : -1) * nprocz;
+  /* for kkk th pass, determine the ID of equations to be passed */
 
-					/* for kkk th pass, determine the ID of equations to be passed */
+               for (node=1;node<=E->parallel.NUM_NODE[lev].pass[1][i];node++)   {
+		      lnode = E->parallel.NODE[lev][node].bound[1][i]; 
+		      E->parallel.EXCHANGE_NODE[lev][node].pass[1][i] = lnode; 
+		      for(doff=1;doff<=E->mesh.nsd;doff++)     {
+		         jj = doff + (node-1)*E->mesh.nsd;
+	 	         E->parallel.EXCHANGE_ID[lev][jj].pass[1][i] = E->ID[lev][lnode].doff[doff];
+		         }
+		      }
 
-					for(node = 1; node <= E->parallel.NUM_NODE[lev].pass[1][i]; node++)
-					{
-						lnode = E->parallel.NODE[lev][node].bound[1][i];
-						E->parallel.EXCHANGE_NODE[lev][node].pass[1][i] = lnode;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (node - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[1][i] = E->ID[lev][lnode].doff[doff];
-						}
-					}
+	       }     /* end for loop p */
+         }       /* end for loop i */
 
-				}				/* end for loop p */
-			}					/* end for loop i */
+       for(j=1;j<=2;j++)       {    /* do OX boundary */
 
-			for(j = 1; j <= 2; j++)
-			{					/* do OX boundary */
+         ii ++;
 
-				ii++;
+	     E->parallel.NUM_PASS[lev].bound[2][j] = 1;
+	     if (E->parallel.me_loc[2]==0 && j==1)
+	       E->parallel.NUM_PASS[lev].bound[2][j] = 0;
+	     else if (E->parallel.me_loc[2]==nprocz-1 && j==2)
+	       E->parallel.NUM_PASS[lev].bound[2][j] = 0;
 
-				E->parallel.NUM_PASS[lev].bound[2][j] = 1;
-				if(E->parallel.me_loc[2] == 0 && j == 1)
-					E->parallel.NUM_PASS[lev].bound[2][j] = 0;
-				else if(E->parallel.me_loc[2] == nprocz - 1 && j == 2)
-					E->parallel.NUM_PASS[lev].bound[2][j] = 0;
+         for (p=1;p<=E->parallel.NUM_PASS[lev].bound[2][j];p++)  {
+	       kkk ++;
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[2][j]; p++)
-				{
-					kkk++;
+                 /* for kkk th pass, get the # of data to be passed */
+	       E->parallel.NUM_NEQ[lev].pass[2][j] = E->parallel.NUM_NNO[lev].bound[2][j]*E->mesh.nsd;
+	       E->parallel.NUM_NODE[lev].pass[2][j] = E->parallel.NUM_NNO[lev].bound[2][j];
 
-					/* for kkk th pass, get the # of data to be passed */
-					E->parallel.NUM_NEQ[lev].pass[2][j] = E->parallel.NUM_NNO[lev].bound[2][j] * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[2][j] = E->parallel.NUM_NNO[lev].bound[2][j];
+  /* for kkk th pass, determine the target processor */
 
-					/* for kkk th pass, determine the target processor */
+	       E->parallel.PROCESSOR[lev].pass[2][j]=me-((j==1)?1:-1);
 
-					E->parallel.PROCESSOR[lev].pass[2][j] = me - ((j == 1) ? 1 : -1);
+  /* for kkk th pass, determine the ID of equations to be passed */
 
-					/* for kkk th pass, determine the ID of equations to be passed */
+	       for (node=1;node<=E->parallel.NUM_NODE[lev].pass[2][j];node++)   {
+		     lnode = E->parallel.NODE[lev][node].bound[2][j]; 
+		     E->parallel.EXCHANGE_NODE[lev][node].pass[2][j] = lnode; 
+		     for(doff=1;doff<=E->mesh.nsd;doff++)  {
+		       jj = doff + (node-1)*E->mesh.nsd;
+	 	       E->parallel.EXCHANGE_ID[lev][jj].pass[2][j] = E->ID[lev][lnode].doff[doff];
+		       }
+		     }      /* end loop for node */
 
-					for(node = 1; node <= E->parallel.NUM_NODE[lev].pass[2][j]; node++)
-					{
-						lnode = E->parallel.NODE[lev][node].bound[2][j];
-						E->parallel.EXCHANGE_NODE[lev][node].pass[2][j] = lnode;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (node - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[2][j] = E->ID[lev][lnode].doff[doff];
-						}
-					}			/* end loop for node */
+	       }     /* end for loop p */
+         }    /* end for loop j */
 
-				}				/* end for loop p */
-			}					/* end for loop j */
+        }         /* end for 2D */
 
-		}						/* end for 2D */
 
 
+    else if (E->mesh.nsd ==3)  {
 
-		else if(E->mesh.nsd == 3)
-		{
+      for(i=1;i<=2;i++)       {       /* do YOZ boundaries & OY lines */
 
-			for(i = 1; i <= 2; i++)
-			{					/* do YOZ boundaries & OY lines */
+        ii ++;
+        E->parallel.NUM_PASS[lev].bound[1][i] = 1;
+        if(E->parallel.me_loc[1]==0 && i==1)
+          E->parallel.NUM_PASS[lev].bound[1][i] = 0;
+        else if(E->parallel.me_loc[1]==nprocx-1 && i==2)
+          E->parallel.NUM_PASS[lev].bound[1][i] = 0;
 
-				ii++;
-				E->parallel.NUM_PASS[lev].bound[1][i] = 1;
-				if(E->parallel.me_loc[1] == 0 && i == 1)
-					E->parallel.NUM_PASS[lev].bound[1][i] = 0;
-				else if(E->parallel.me_loc[1] == nprocx - 1 && i == 2)
-					E->parallel.NUM_PASS[lev].bound[1][i] = 0;
+        for (p=1;p<=E->parallel.NUM_PASS[lev].bound[1][i];p++)  {
+          kkk ++;
+              /* determine the pass ID for ii-th boundary and p-th pass */
+          E->parallel.NUM_NEQ[lev].pass[1][i] = ((p==1)?E->parallel.NUM_NNO[lev].bound[1][i]:noy) *E->mesh.nsd;
+          E->parallel.NUM_NODE[lev].pass[1][i] = ((p==1)?E->parallel.NUM_NNO[lev].bound[1][i]:noy);
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[1][i]; p++)
-				{
-					kkk++;
-					/* determine the pass ID for ii-th boundary and p-th pass */
-					E->parallel.NUM_NEQ[lev].pass[1][i] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[1][i] : noy) * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[1][i] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[1][i] : noy);
+          E->parallel.PROCESSOR[lev].pass[1][i]=me-((i==1)?1:-1)*nprocz;
 
-					E->parallel.PROCESSOR[lev].pass[1][i] = me - ((i == 1) ? 1 : -1) * nprocz;
+          for (k=1;k<=E->parallel.NUM_NODE[lev].pass[1][i];k++)   {
+            lnode = k;
+            node = E->parallel.NODE[lev][lnode].bound[1][i];
+            E->parallel.EXCHANGE_NODE[lev][k].pass[1][i] = node;
+            for(doff=1;doff<=E->mesh.nsd;doff++)     {
+              jj = doff + (k-1)*E->mesh.nsd;
+              E->parallel.EXCHANGE_ID[lev][jj].pass[1][i] = E->ID[lev][node].doff[doff];
+              }
+            }  /* end for node k */
 
-					for(k = 1; k <= E->parallel.NUM_NODE[lev].pass[1][i]; k++)
-					{
-						lnode = k;
-						node = E->parallel.NODE[lev][lnode].bound[1][i];
-						E->parallel.EXCHANGE_NODE[lev][k].pass[1][i] = node;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (k - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[1][i] = E->ID[lev][node].doff[doff];
-						}
-					}			/* end for node k */
+          }   /* end for loop p */
+	    }  /* end for i */
 
-				}				/* end for loop p */
-			}					/* end for i */
+ 	  for(j=1;j<=2;j++)       {       /* do XOY boundaries & OX lines */
 
-			for(j = 1; j <= 2; j++)
-			{					/* do XOY boundaries & OX lines */
+        ii ++;
+        E->parallel.NUM_PASS[lev].bound[3][j] = 1;
+        if(E->parallel.me_loc[3]==0 && j==1)
+          E->parallel.NUM_PASS[lev].bound[3][j] = 0;
+        else if(E->parallel.me_loc[3]==nprocz-1 && j==2)
+          E->parallel.NUM_PASS[lev].bound[3][j] = 0;
 
-				ii++;
-				E->parallel.NUM_PASS[lev].bound[3][j] = 1;
-				if(E->parallel.me_loc[3] == 0 && j == 1)
-					E->parallel.NUM_PASS[lev].bound[3][j] = 0;
-				else if(E->parallel.me_loc[3] == nprocz - 1 && j == 2)
-					E->parallel.NUM_PASS[lev].bound[3][j] = 0;
+        for (p=1;p<=E->parallel.NUM_PASS[lev].bound[3][j];p++)  {
+          kkk ++;
+              /* determine the pass ID for ii-th boundary and p-th pass */
+          E->parallel.NUM_NEQ[lev].pass[3][j] = ((p==1)?E->parallel.NUM_NNO[lev].bound[3][j]:nox) *E->mesh.nsd;
+          E->parallel.NUM_NODE[lev].pass[3][j] = ((p==1)?E->parallel.NUM_NNO[lev].bound[3][j]:nox);
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[3][j]; p++)
-				{
-					kkk++;
-					/* determine the pass ID for ii-th boundary and p-th pass */
-					E->parallel.NUM_NEQ[lev].pass[3][j] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[3][j] : nox) * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[3][j] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[3][j] : nox);
+          E->parallel.PROCESSOR[lev].pass[3][j]=me-((j==1)?1:-1);
 
-					E->parallel.PROCESSOR[lev].pass[3][j] = me - ((j == 1) ? 1 : -1);
+          for (k=1;k<=E->parallel.NUM_NODE[lev].pass[3][j];k++)   {
+            lnode = k;
+            node = E->parallel.NODE[lev][lnode].bound[3][j];
+            E->parallel.EXCHANGE_NODE[lev][k].pass[3][j] = node;
+            for(doff=1;doff<=E->mesh.nsd;doff++)     {
+              jj = doff + (k-1)*E->mesh.nsd;
+              E->parallel.EXCHANGE_ID[lev][jj].pass[3][j] = E->ID[lev][node].doff[doff];
+              }
+            }  /* end for node k */
 
-					for(k = 1; k <= E->parallel.NUM_NODE[lev].pass[3][j]; k++)
-					{
-						lnode = k;
-						node = E->parallel.NODE[lev][lnode].bound[3][j];
-						E->parallel.EXCHANGE_NODE[lev][k].pass[3][j] = node;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (k - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[3][j] = E->ID[lev][node].doff[doff];
-						}
-					}			/* end for node k */
+          }   /* end for loop p */
 
-				}				/* end for loop p */
+	    }     /* end for j */
 
-			}					/* end for j */
+ 	  for(k=1;k<=2;k++)        {      /* do XOZ boundaries & OZ lines */
 
-			for(k = 1; k <= 2; k++)
-			{					/* do XOZ boundaries & OZ lines */
+        ii ++;
+        E->parallel.NUM_PASS[lev].bound[2][k] = 1;
+        if(E->parallel.me_loc[2]==0 && k==1)
+          E->parallel.NUM_PASS[lev].bound[2][k] = 0;
+        else if(E->parallel.me_loc[2]==nprocy-1 && k==2)
+          E->parallel.NUM_PASS[lev].bound[2][k] = 0;
 
-				ii++;
-				E->parallel.NUM_PASS[lev].bound[2][k] = 1;
-				if(E->parallel.me_loc[2] == 0 && k == 1)
-					E->parallel.NUM_PASS[lev].bound[2][k] = 0;
-				else if(E->parallel.me_loc[2] == nprocy - 1 && k == 2)
-					E->parallel.NUM_PASS[lev].bound[2][k] = 0;
+        for (p=1;p<=E->parallel.NUM_PASS[lev].bound[2][k];p++)  {
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[2][k]; p++)
-				{
+          kkk ++;
+              /* determine the pass ID for ii-th boundary and p-th pass */
+          E->parallel.NUM_NEQ[lev].pass[2][k] = ((p==1)?E->parallel.NUM_NNO[lev].bound[2][k]:noz) *E->mesh.nsd;
+          E->parallel.NUM_NODE[lev].pass[2][k] = ((p==1)?E->parallel.NUM_NNO[lev].bound[2][k]:noz);
 
-					kkk++;
-					/* determine the pass ID for ii-th boundary and p-th pass */
-					E->parallel.NUM_NEQ[lev].pass[2][k] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[2][k] : noz) * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[2][k] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[2][k] : noz);
+          E->parallel.PROCESSOR[lev].pass[2][k]=me-((k==1)?1:-1)*nprocx*nprocz;
 
-					E->parallel.PROCESSOR[lev].pass[2][k] = me - ((k == 1) ? 1 : -1) * nprocx * nprocz;
+          for (kk=1;kk<=E->parallel.NUM_NODE[lev].pass[2][k];kk++)   {
+            lnode = kk;
+            node = E->parallel.NODE[lev][lnode].bound[2][k];
+            E->parallel.EXCHANGE_NODE[lev][kk].pass[2][k] = node;
+            for(doff=1;doff<=E->mesh.nsd;doff++)     {
+              jj = doff + (kk-1)*E->mesh.nsd;
+              E->parallel.EXCHANGE_ID[lev][jj].pass[2][k] = E->ID[lev][node].doff[doff];
+              }
+            }  /* end for node kk */
 
-					for(kk = 1; kk <= E->parallel.NUM_NODE[lev].pass[2][k]; kk++)
-					{
-						lnode = kk;
-						node = E->parallel.NODE[lev][lnode].bound[2][k];
-						E->parallel.EXCHANGE_NODE[lev][kk].pass[2][k] = node;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (kk - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[2][k] = E->ID[lev][node].doff[doff];
-						}
-					}			/* end for node kk */
+          }   /* end for loop p */
 
-				}				/* end for loop p */
+	    }  /* end for k */
 
-			}					/* end for k */
+	  }       /* end of dims==3 */
 
-		}						/* end of dims==3 */
+      E->parallel.TNUM_PASS[lev] = kkk;
 
-		E->parallel.TNUM_PASS[lev] = kkk;
 
-
 /*    fprintf(E->fp," me= %d  pass  %d \n",E->parallel.me,E->parallel.TNUM_PASS[lev]);
     for (k=1;k<=E->parallel.TNUM_PASS[lev];k++)  
 fprintf(E->fp,"proc %d and pass  %d to proc %d with %d eqn\n",E->parallel.me,k,E->parallel.PROCESSOR[lev].pass[k],E->parallel.NUM_NEQ[lev].pass[k]);
- */
+ */        
 
 
-	}							/* end for level */
+    }        /* end for level */
+  
+  return;
+  }
 
-	return;
-}
 
+// periodic BC
 
-// periodic BC
 void parallel_communication_routs2(struct All_variables *E)
-{
-	//int i, ii, j, k, l, node, el, elt, lnode, jj, doff;
-	int i, ii, j, k, node, lnode, jj, doff;
-	int lev, elx, elz, ely, nno, nox, noz, noy, p, kkk, kk;
-	int me, nprocz, nprocx, nprocy;
 
-	me = E->parallel.me;
-	nprocx = E->parallel.nprocx;
-	nprocz = E->parallel.nprocz;
-	nprocy = E->parallel.nprocy;
+  {
+  int i,ii,j,k,l,node,el,elt,lnode,jj,doff;
+  int lev,elx,elz,ely,nno,nox,noz,noy,p,kkk,kk;
+  int me, nprocz,nprocx, nprocy;
 
-	for(lev = E->mesh.levmax; lev >= E->mesh.levmin; lev--)
-	{
-		elx = E->lmesh.ELX[lev];
-		elz = E->lmesh.ELZ[lev];
-		ely = E->lmesh.ELY[lev];
-		nox = E->lmesh.NOX[lev];
-		noy = E->lmesh.NOY[lev];
-		noz = E->lmesh.NOZ[lev];
-		nno = E->lmesh.NNO[lev];
+  me = E->parallel.me;
+  nprocx = E->parallel.nprocx;
+  nprocz = E->parallel.nprocz;
+  nprocy = E->parallel.nprocy;
 
-		ii = 0;
-		kkk = 0;
-		if(E->mesh.nsd == 2)
-		{
+  for(lev=E->mesh.levmax;lev>=E->mesh.levmin;lev--){
+     elx = E->lmesh.ELX[lev];
+     elz = E->lmesh.ELZ[lev];
+     ely = E->lmesh.ELY[lev];
+     nox = E->lmesh.NOX[lev];
+     noy = E->lmesh.NOY[lev];
+     noz = E->lmesh.NOZ[lev];
+     nno = E->lmesh.NNO[lev];
 
-			for(i = 1; i <= 2; i++)
-			{					/* do the OZ boundaries */
+     ii = 0;
+     kkk = 0;
+     if (E->mesh.nsd == 2) {
 
-				ii++;
+       for(i=1;i<=2;i++)    {     /* do the OZ boundaries */
 
-				E->parallel.NUM_PASS[lev].bound[1][i] = 1;
+         ii ++;
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[1][i]; p++)
-				{
+         if (E->mesh.periodic_x)
+             E->parallel.NUM_PASS[lev].bound[1][i] = 1;
+         else {
+             if (E->parallel.me_loc[1]==0 && i==1)
+               E->parallel.NUM_PASS[lev].bound[1][i] = 0;
+             else if (E->parallel.me_loc[1]==nprocx-1 && i==2)
+               E->parallel.NUM_PASS[lev].bound[1][i] = 0;
+            }
 
-					kkk++;
-					/* determine the pass ID for ii-th boundary and p-th pass */
 
-					/* for kkk th pass, get the # of data to be passed */
-					E->parallel.NUM_NEQ[lev].pass[1][i] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[1][i] : noy) * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[1][i] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[1][i] : noy);
+         for (p=1;p<=E->parallel.NUM_PASS[lev].bound[1][i];p++)  {
 
-					/* for kkk th pass, determine the target processor */
+               kkk ++;
+                 /* determine the pass ID for ii-th boundary and p-th pass */
 
-					E->parallel.PROCESSOR[lev].pass[1][i] = me - ((i == 1) ? 1 : -1) * nprocz;
-					if(i == 1 && E->parallel.me_loc[1] == 0)
-						E->parallel.PROCESSOR[lev].pass[1][i] = me + (nprocx - 1) * nprocz;
-					else if(i == 2 && E->parallel.me_loc[1] == nprocx - 1)
-						E->parallel.PROCESSOR[lev].pass[1][i] = me - (nprocx - 1) * nprocz;
+                 /* for kkk th pass, get the # of data to be passed */
+               E->parallel.NUM_NEQ[lev].pass[1][i] = ((p==1)?E->parallel.NUM_NNO[lev].bound[1][i]:noy) *E->mesh.nsd;
+               E->parallel.NUM_NODE[lev].pass[1][i] = ((p==1)?E->parallel.NUM_NNO[lev].bound[1][i]:noy);
 
-					/* for kkk th pass, determine the ID of equations to be passed */
+  /* for kkk th pass, determine the target processor */
 
-					for(node = 1; node <= E->parallel.NUM_NODE[lev].pass[1][i]; node++)
-					{
-						lnode = E->parallel.NODE[lev][node].bound[1][i];
-						E->parallel.EXCHANGE_NODE[lev][node].pass[1][i] = lnode;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (node - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[1][i] = E->ID[lev][lnode].doff[doff];
-						}
-					}
+               E->parallel.PROCESSOR[lev].pass[1][i]=me-((i==1)?1:-1)*nprocz;
+               if (E->mesh.periodic_x)   {
+                 if (i==1 && E->parallel.me_loc[1]==0)
+                   E->parallel.PROCESSOR[lev].pass[1][i]=me+(nprocx-1)*nprocz;
+                 else if (i==2 && E->parallel.me_loc[1]==nprocx-1)
+                   E->parallel.PROCESSOR[lev].pass[1][i]=me-(nprocx-1)*nprocz;
+                 }
 
-				}				/* end for loop p */
-			}					/* end for loop i */
+  /* for kkk th pass, determine the ID of equations to be passed */
 
+           for (node=1;node<=E->parallel.NUM_NODE[lev].pass[1][i];node++)   {
+                      lnode = E->parallel.NODE[lev][node].bound[1][i];
+                      E->parallel.EXCHANGE_NODE[lev][node].pass[1][i] = lnode;
+                      for(doff=1;doff<=E->mesh.nsd;doff++)     {
+                         jj = doff + (node-1)*E->mesh.nsd;
+                         E->parallel.EXCHANGE_ID[lev][jj].pass[1][i] = E->ID[lev][lnode].doff[doff];
+                         }
+                      }
 
-			for(j = 1; j <= 2; j++)
-			{					/* do OX boundary */
+               }     /* end for loop p */
+         }       /* end for loop i */
 
-				ii++;
 
-				E->parallel.NUM_PASS[lev].bound[2][j] = 1;
-				if(E->parallel.me_loc[2] == 0 && j == 1)
-					E->parallel.NUM_PASS[lev].bound[2][j] = 0;
-				else if(E->parallel.me_loc[2] == nprocz - 1 && j == 2)
-					E->parallel.NUM_PASS[lev].bound[2][j] = 0;
+       for(j=1;j<=2;j++)       {    /* do OX boundary */
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[2][j]; p++)
-				{
-					kkk++;
+         ii ++;
 
-					/* for kkk th pass, get the # of data to be passed */
-					E->parallel.NUM_NEQ[lev].pass[2][j] = E->parallel.NUM_NNO[lev].bound[2][j] * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[2][j] = E->parallel.NUM_NNO[lev].bound[2][j];
+             E->parallel.NUM_PASS[lev].bound[2][j] = 1;
+             if (E->parallel.me_loc[2]==0 && j==1)
+               E->parallel.NUM_PASS[lev].bound[2][j] = 0;
+             else if (E->parallel.me_loc[2]==nprocz-1 && j==2)
+               E->parallel.NUM_PASS[lev].bound[2][j] = 0;
 
-					/* for kkk th pass, determine the target processor */
+         for (p=1;p<=E->parallel.NUM_PASS[lev].bound[2][j];p++)  {
+               kkk ++;
 
-					E->parallel.PROCESSOR[lev].pass[2][j] = me - ((j == 1) ? 1 : -1);
+                 /* for kkk th pass, get the # of data to be passed */
+               E->parallel.NUM_NEQ[lev].pass[2][j] = E->parallel.NUM_NNO[lev].bound[2][j]*E->mesh.nsd;
+               E->parallel.NUM_NODE[lev].pass[2][j] = E->parallel.NUM_NNO[lev].bound[2][j];
 
-					/* for kkk th pass, determine the ID of equations to be passed */
+  /* for kkk th pass, determine the target processor */
 
-					for(node = 1; node <= E->parallel.NUM_NODE[lev].pass[2][j]; node++)
-					{
-						lnode = E->parallel.NODE[lev][node].bound[2][j];
-						E->parallel.EXCHANGE_NODE[lev][node].pass[2][j] = lnode;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (node - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[2][j] = E->ID[lev][lnode].doff[doff];
-						}
-					}			/* end loop for node */
+               E->parallel.PROCESSOR[lev].pass[2][j]=me-((j==1)?1:-1);
 
-				}				/* end for loop p */
-			}					/* end for loop j */
+  /* for kkk th pass, determine the ID of equations to be passed */
 
-		}						/* end for 2D */
+               for (node=1;node<=E->parallel.NUM_NODE[lev].pass[2][j];node++)   {
+                     lnode = E->parallel.NODE[lev][node].bound[2][j];
+                     E->parallel.EXCHANGE_NODE[lev][node].pass[2][j] = lnode;
+                     for(doff=1;doff<=E->mesh.nsd;doff++)  {
+                       jj = doff + (node-1)*E->mesh.nsd;
+                       E->parallel.EXCHANGE_ID[lev][jj].pass[2][j] = E->ID[lev][lnode].doff[doff];
+                       }
+                     }      /* end loop for node */
 
+               }     /* end for loop p */
+         }    /* end for loop j */
 
+         }         /* end for 2D */
 
-		else if(E->mesh.nsd == 3)
-		{
 
-			for(i = 1; i <= 2; i++)
-			{					/* do YOZ boundaries & OY lines */
+    else if (E->mesh.nsd ==3)  {
 
-				ii++;
-				E->parallel.NUM_PASS[lev].bound[1][i] = 1;
+      for(i=1;i<=2;i++)       {       /* do YOZ boundaries & OY lines */
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[1][i]; p++)
-				{
-					kkk++;
-					/* determine the pass ID for ii-th boundary and p-th pass */
-					E->parallel.NUM_NEQ[lev].pass[1][i] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[1][i] : noy) * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[1][i] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[1][i] : noy);
+        ii ++;
+        E->parallel.NUM_PASS[lev].bound[1][i] = 1;
+        if (!E->mesh.periodic_x) {
+             if (E->parallel.me_loc[1]==0 && i==1)
+               E->parallel.NUM_PASS[lev].bound[1][i] = 0;
+             else if (E->parallel.me_loc[1]==nprocx-1 && i==2)
+               E->parallel.NUM_PASS[lev].bound[1][i] = 0;
+            }
 
-					E->parallel.PROCESSOR[lev].pass[1][i] = me - ((i == 1) ? 1 : -1) * nprocz;
-					if(i == 1 && E->parallel.me_loc[1] == 0)
-						E->parallel.PROCESSOR[lev].pass[1][i] = me + (nprocx - 1) * nprocz;
-					else if(i == 2 && E->parallel.me_loc[1] == nprocx - 1)
-						E->parallel.PROCESSOR[lev].pass[1][i] = me - (nprocx - 1) * nprocz;
+        for (p=1;p<=E->parallel.NUM_PASS[lev].bound[1][i];p++)  {
+          kkk ++;
+              /* determine the pass ID for ii-th boundary and p-th pass */
+          E->parallel.NUM_NEQ[lev].pass[1][i] = ((p==1)?E->parallel.NUM_NNO[lev].bound[1][i]:noy) *E->mesh.nsd;
+          E->parallel.NUM_NODE[lev].pass[1][i] = ((p==1)?E->parallel.NUM_NNO[lev].bound[1][i]:noy);
 
-					for(k = 1; k <= E->parallel.NUM_NODE[lev].pass[1][i]; k++)
-					{
-						lnode = k;
-						node = E->parallel.NODE[lev][lnode].bound[1][i];
-						E->parallel.EXCHANGE_NODE[lev][k].pass[1][i] = node;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (k - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[1][i] = E->ID[lev][node].doff[doff];
-						}
-					}			/* end for node k */
+          E->parallel.PROCESSOR[lev].pass[1][i]=me-((i==1)?1:-1)*nprocz;
+          if (E->mesh.periodic_x)    {
+            if (i==1 && E->parallel.me_loc[1]==0)
+              E->parallel.PROCESSOR[lev].pass[1][i]=me+(nprocx-1)*nprocz;
+            else if (i==2 && E->parallel.me_loc[1]==nprocx-1)
+              E->parallel.PROCESSOR[lev].pass[1][i]=me-(nprocx-1)*nprocz;
+            }
 
-				}				/* end for loop p */
-			}					/* end for i */
+          for (k=1;k<=E->parallel.NUM_NODE[lev].pass[1][i];k++)   {
+            lnode = k;
+            node = E->parallel.NODE[lev][lnode].bound[1][i];
+            E->parallel.EXCHANGE_NODE[lev][k].pass[1][i] = node;
+            for(doff=1;doff<=E->mesh.nsd;doff++)     {
+              jj = doff + (k-1)*E->mesh.nsd;
+              E->parallel.EXCHANGE_ID[lev][jj].pass[1][i] = E->ID[lev][node].doff[doff];
+              }
+            }  /* end for node k */
 
-			for(j = 1; j <= 2; j++)
-			{					/* do XOY boundaries & OX lines */
+          }   /* end for loop p */
+        }  /* end for i */
 
-				ii++;
-				E->parallel.NUM_PASS[lev].bound[3][j] = 1;
-				if(E->parallel.me_loc[3] == 0 && j == 1)
-					E->parallel.NUM_PASS[lev].bound[3][j] = 0;
-				else if(E->parallel.me_loc[3] == nprocz - 1 && j == 2)
-					E->parallel.NUM_PASS[lev].bound[3][j] = 0;
+      for(j=1;j<=2;j++)       {       /* do XOY boundaries & OX lines */
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[3][j]; p++)
-				{
-					kkk++;
-					/* determine the pass ID for ii-th boundary and p-th pass */
-					E->parallel.NUM_NEQ[lev].pass[3][j] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[3][j] : nox) * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[3][j] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[3][j] : nox);
+        ii ++;
+        E->parallel.NUM_PASS[lev].bound[3][j] = 1;
+        if(E->parallel.me_loc[3]==0 && j==1)
+          E->parallel.NUM_PASS[lev].bound[3][j] = 0;
+        else if(E->parallel.me_loc[3]==nprocz-1 && j==2)
+          E->parallel.NUM_PASS[lev].bound[3][j] = 0;
 
-					E->parallel.PROCESSOR[lev].pass[3][j] = me - ((j == 1) ? 1 : -1);
+        for (p=1;p<=E->parallel.NUM_PASS[lev].bound[3][j];p++)  {
+          kkk ++;
+              /* determine the pass ID for ii-th boundary and p-th pass */
+          E->parallel.NUM_NEQ[lev].pass[3][j] = ((p==1)?E->parallel.NUM_NNO[lev].bound[3][j]:nox) *E->mesh.nsd;
+          E->parallel.NUM_NODE[lev].pass[3][j] = ((p==1)?E->parallel.NUM_NNO[lev].bound[3][j]:nox);
 
-					for(k = 1; k <= E->parallel.NUM_NODE[lev].pass[3][j]; k++)
-					{
-						lnode = k;
-						node = E->parallel.NODE[lev][lnode].bound[3][j];
-						E->parallel.EXCHANGE_NODE[lev][k].pass[3][j] = node;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (k - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[3][j] = E->ID[lev][node].doff[doff];
-						}
-					}			/* end for node k */
+          E->parallel.PROCESSOR[lev].pass[3][j]=me-((j==1)?1:-1);
 
-				}				/* end for loop p */
+          for (k=1;k<=E->parallel.NUM_NODE[lev].pass[3][j];k++)   {
+            lnode = k;
+            node = E->parallel.NODE[lev][lnode].bound[3][j];
+            E->parallel.EXCHANGE_NODE[lev][k].pass[3][j] = node;
+            for(doff=1;doff<=E->mesh.nsd;doff++)     {
+              jj = doff + (k-1)*E->mesh.nsd;
+              E->parallel.EXCHANGE_ID[lev][jj].pass[3][j] = E->ID[lev][node].doff[doff];
+              }
+            }  /* end for node k */
 
-			}					/* end for j */
+          }   /* end for loop p */
 
-			for(k = 1; k <= 2; k++)
-			{					/* do XOZ boundaries & OZ lines */
+        }     /* end for j */
 
-				ii++;
-				E->parallel.NUM_PASS[lev].bound[2][k] = 1;
+      for(k=1;k<=2;k++)        {      /* do XOZ boundaries & OZ lines */
 
-				for(p = 1; p <= E->parallel.NUM_PASS[lev].bound[2][k]; p++)
-				{
+        ii ++;
+        E->parallel.NUM_PASS[lev].bound[2][k] = 1;
+        if (!E->mesh.periodic_y)  {
+          if(E->parallel.me_loc[2]==0 && k==1)
+            E->parallel.NUM_PASS[lev].bound[2][k] = 0;
+          else if(E->parallel.me_loc[2]==nprocy-1 && k==2)
+            E->parallel.NUM_PASS[lev].bound[2][k] = 0;
+          }
 
-					kkk++;
-					/* determine the pass ID for ii-th boundary and p-th pass */
-					E->parallel.NUM_NEQ[lev].pass[2][k] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[2][k] : noz) * E->mesh.nsd;
-					E->parallel.NUM_NODE[lev].pass[2][k] = ((p == 1) ? E->parallel.NUM_NNO[lev].bound[2][k] : noz);
+        for (p=1;p<=E->parallel.NUM_PASS[lev].bound[2][k];p++)  {
 
-					E->parallel.PROCESSOR[lev].pass[2][k] = me - ((k == 1) ? 1 : -1) * nprocx * nprocz;
-					if(k == 1 && E->parallel.me_loc[2] == 0)
-						E->parallel.PROCESSOR[lev].pass[2][k] = me + (nprocy - 1) * nprocx * nprocz;
-					else if(k == 2 && E->parallel.me_loc[2] == nprocy - 1)
-						E->parallel.PROCESSOR[lev].pass[2][k] = me - (nprocy - 1) * nprocx * nprocz;
+          kkk ++;
+              /* determine the pass ID for ii-th boundary and p-th pass */
+          E->parallel.NUM_NEQ[lev].pass[2][k] = ((p==1)?E->parallel.NUM_NNO[lev].bound[2][k]:noz) *E->mesh.nsd;
+          E->parallel.NUM_NODE[lev].pass[2][k] = ((p==1)?E->parallel.NUM_NNO[lev].bound[2][k]:noz);
 
-					for(kk = 1; kk <= E->parallel.NUM_NODE[lev].pass[2][k]; kk++)
-					{
-						lnode = kk;
-						node = E->parallel.NODE[lev][lnode].bound[2][k];
-						E->parallel.EXCHANGE_NODE[lev][kk].pass[2][k] = node;
-						for(doff = 1; doff <= E->mesh.nsd; doff++)
-						{
-							jj = doff + (kk - 1) * E->mesh.nsd;
-							E->parallel.EXCHANGE_ID[lev][jj].pass[2][k] = E->ID[lev][node].doff[doff];
-						}
-					}			/* end for node kk */
+          E->parallel.PROCESSOR[lev].pass[2][k]=me-((k==1)?1:-1)*nprocx*nprocz;
+          if (E->mesh.periodic_y)    {
+            if (k==1 && E->parallel.me_loc[2]==0)
+              E->parallel.PROCESSOR[lev].pass[2][k]=me+(nprocy-1)*nprocx*nprocz;
+            else if (k==2 && E->parallel.me_loc[2]==nprocy-1)
+              E->parallel.PROCESSOR[lev].pass[2][k]=me-(nprocy-1)*nprocx*nprocz;
+            }
 
-				}				/* end for loop p */
+          for (kk=1;kk<=E->parallel.NUM_NODE[lev].pass[2][k];kk++)   {
+            lnode = kk;
+            node = E->parallel.NODE[lev][lnode].bound[2][k];
+            E->parallel.EXCHANGE_NODE[lev][kk].pass[2][k] = node;
+            for(doff=1;doff<=E->mesh.nsd;doff++)     {
+              jj = doff + (kk-1)*E->mesh.nsd;
+              E->parallel.EXCHANGE_ID[lev][jj].pass[2][k] = E->ID[lev][node].doff[doff];
+              }
+            }  /* end for node kk */
 
-			}					/* end for k */
+          }   /* end for loop p */
 
-		}						/* end of dims==3 */
+         }  /* end for k */
 
-		E->parallel.TNUM_PASS[lev] = kkk;
+       }       /* end of dims==3 */
 
+      E->parallel.TNUM_PASS[lev] = kkk;
 
+
+
 /*
-    fprintf(E->fp," me= %d  pass  %d \n",E->parallel.me,E->parallel.TNUM_PASS[lev]);
-    for (k=1;k<=E->parallel.TNUM_PASS[lev];k++)  
-fprintf(E->fp,"proc %d and pass  %d to proc %d with %d eqn\n",E->parallel.me,k,E->parallel.PROCESSOR[lev].pass[k],E->parallel.NUM_NEQ[lev].pass[k]);
- */
+ *     fprintf(E->fp," me= %d  pass  %d \n",E->parallel.me,E->parallel.TNUM_PASS[lev]);
+ *         for (k=1;k<=E->parallel.TNUM_PASS[lev];k++)
+ *         fprintf(E->fp,"proc %d and pass  %d to proc %d with %d eqn\n",E->parallel.me,k,E->parallel.PROCESSOR[lev].pass[k],E->parallel.NUM_NEQ[lev].pass[k]);
+ *         */
 
-	}							/* end for level */
+    }        /* end for level */
+  
+  return;
+  }
 
-	return;
-}
-
 void parallel_communication_routs3(struct All_variables *E)
-{
-	//int i, ii, j, k, l, node, el, elt, lnode, jj, doff;
-	int i, j, k, el;
-	//int lev, elx, elz, ely, nno, nox, noz, noy, p, kkk, kk;
-	int lev, elx, elz, ely;
-	int m1, m2, m3, me, nprocz, nprocx, nprocy, proc;
 
-	me = E->parallel.me;
-	nprocx = E->parallel.nprocx;
-	nprocz = E->parallel.nprocz;
-	nprocy = E->parallel.nprocy;
+  {
 
+  int i,ii,j,k,l,node,el,elt,lnode,jj,doff;
+  int lev,elx,elz,ely,nno,nox,noz,noy,p,kkk,kk;
+  int m1,m2,m3,me, nprocz,nprocx, nprocy,proc;
 
-	E->parallel.no_neighbors = 0;
+  me = E->parallel.me;
+  nprocx = E->parallel.nprocx;
+  nprocz = E->parallel.nprocz;
+  nprocy = E->parallel.nprocy;
 
-	E->parallel.neighbors_rev = (int *)malloc((E->parallel.nproc + 1) * sizeof(int));
+  
+  E->parallel.no_neighbors  = 0;
 
-	for(k = -1; k <= 1; k++)
-		for(i = -1; i <= 1; i++)
-			for(j = -1; j <= 1; j++)
-			{
+  E->parallel.neighbors_rev = (int *)malloc((E->parallel.nproc+1)*sizeof(int));
 
-				m1 = E->parallel.me_loc[1] + i;
-				m2 = E->parallel.me_loc[2] + k;
-				m3 = E->parallel.me_loc[3] + j;
-				if(m1 >= 0 && m1 < nprocx && m2 >= 0 && m2 < nprocy && m3 >= 0 && m3 < nprocz)
-				{
-					proc = m3 + m1 * nprocz + m2 * E->parallel.nprocxz;
-					if(proc != me)
-					{
-						E->parallel.no_neighbors++;
-						E->parallel.neighbors[E->parallel.no_neighbors] = proc;
-						E->parallel.neighbors_rev[proc] = E->parallel.no_neighbors;
-					}
-				}
-			}
+  for (k=-1;k<=1;k++)  
+  for (i=-1;i<=1;i++)  
+  for (j=-1;j<=1;j++)   {
 
+    m1 = E->parallel.me_loc[1]+i; 
+    m2 = E->parallel.me_loc[2]+k; 
+    m3 = E->parallel.me_loc[3]+j; 
+    if (m1>=0 && m1<nprocx && m2>=0 && m2<nprocy && m3>=0 && m3<nprocz)  {
+      proc = m3 + m1*nprocz + m2*E->parallel.nprocxz;
+      if (proc!=me)  {
+        E->parallel.no_neighbors ++;
+        E->parallel.neighbors[E->parallel.no_neighbors] = proc;
+        E->parallel.neighbors_rev[proc] = E->parallel.no_neighbors;
+        }
+      }
+  }
 
-	for(i = 1; i <= E->parallel.no_neighbors; i++)
-		fprintf(E->fp, "aaa %d %d %d\n", i, E->parallel.neighbors[i], E->parallel.neighbors_rev[E->parallel.neighbors[i]]);
-	fflush(E->fp);
 
+  for (i=1;i<=E->parallel.no_neighbors;i++)   
+	  fprintf(E->fp,"aaa %d %d %d\n",i,E->parallel.neighbors[i],E->parallel.neighbors_rev[E->parallel.neighbors[i]]);
+  fflush(E->fp);
 
-	lev = E->mesh.levmax;
 
-	elx = E->lmesh.ELX[lev];
-	elz = E->lmesh.ELZ[lev];
-	ely = E->lmesh.ELY[lev];
+  lev=E->mesh.levmax;
 
-	for(el = 1; el <= E->lmesh.nel; el++)
-		E->Element[el] = 0;
+  elx = E->lmesh.ELX[lev];
+  elz = E->lmesh.ELZ[lev];
+  ely = E->lmesh.ELY[lev];
 
-	for(k = 1; k <= ely; k++)
-		for(j = 1; j <= elz; j++)
-		{
-			el = j + (k - 1) * elx * elz;
-			E->Element[el] = E->Element[el] | SIDEE;
-			el = j + (elx - 1) * elz + (k - 1) * elx * elz;
-			E->Element[el] = E->Element[el] | SIDEE;
-		}
+  for (el=1;el<=E->lmesh.nel;el++)
+      E->Element[el] = 0;
 
-	for(i = 1; i <= elx; i++)
-		for(j = 1; j <= elz; j++)
-		{
-			el = j + (i - 1) * elz;
-			E->Element[el] = E->Element[el] | SIDEE;
-			el = j + (i - 1) * elz + (ely - 1) * elx * elz;
-			E->Element[el] = E->Element[el] | SIDEE;
-		}
+    for (k=1;k<=ely;k++)  
+    for (j=1;j<=elz;j++)  {
+      el = j + (k-1)*elx*elz;
+      E->Element[el] = E->Element[el] | SIDEE;
+      el = j + (elx-1)*elz + (k-1)*elx*elz;
+      E->Element[el] = E->Element[el] | SIDEE;
+      }
 
-	for(k = 1; k <= ely; k++)
-		for(i = 1; i <= elx; i++)
-		{
-			el = elz + (i - 1) * elz + (k - 1) * elx * elz;
-			E->Element[el] = E->Element[el] | SIDEE;
-			el = 1 + (i - 1) * elz + (k - 1) * elx * elz;
-			E->Element[el] = E->Element[el] | SIDEE;
-		}
+    for (i=1;i<=elx;i++)  
+    for (j=1;j<=elz;j++)  {
+      el = j + (i-1)*elz;
+      E->Element[el] = E->Element[el] | SIDEE;
+      el = j + (i-1)*elz + (ely-1)*elx*elz;
+      E->Element[el] = E->Element[el] | SIDEE;
+      }
 
+    for (k=1;k<=ely;k++)  
+    for (i=1;i<=elx;i++)  {
+      el = elz + (i-1)*elz + (k-1)*elx*elz;
+      E->Element[el] = E->Element[el] | SIDEE;
+      el = 1 + (i-1)*elz + (k-1)*elx*elz;
+      E->Element[el] = E->Element[el] | SIDEE;
+      }
 
-	return;
-}
 
+  return;
+  }
+
 void parallel_communication_routs4(struct All_variables *E)
-{
-	//int i, ii, j, k, l, node, el, elt, lnode, jj, doff;
-	//int lev, elx, elz, ely, nno, nox, noz, noy, p, kkk, kk;
-	//int me, nprocz, nprocx, nprocy;
 
-	return;
-}
+  {
+  int i,ii,j,k,l,node,el,elt,lnode,jj,doff;
+  int lev,elx,elz,ely,nno,nox,noz,noy,p,kkk,kk;
+  int me, nprocz,nprocx, nprocy;
 
+  fprintf(stderr,"you are using periodic conditions with tracers, an option not being implemented at the moment!!!\n");
+  fprintf(stderr,"quit!!!\n");
+  fprintf(E->fp,"you are using periodic conditions with tracers, an option not being implemented at the moment!!!\n");
+  fprintf(E->fp,"quit!!!\n");
 
+  return;
+  }
+
+
+
 void exchange_number_rec_markers(struct All_variables *E)
 {
 	//int target_proc, kk, e, node, i, ii, j, k, bound, type, idb, msginfo[8];



More information about the CIG-COMMITS mailing list