[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