/* *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * * * CitcomS by Louis Moresi, Shijie Zhong, Lijie Han, Eh Tan, * Clint Conrad, Michael Gurnis, and Eun-seo Choi. * Copyright (C) 1994-2005, California Institute of Technology. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #include "global_defs.h" void strip_bcs_from_residual(E,Res,level) struct All_variables *E; double **Res; int level; { int m,i; for (m=1;m<=E->sphere.caps_per_proc;m++) if (E->num_zero_resid[level][m]) for(i=1;i<=E->num_zero_resid[level][m];i++) Res[m][E->zero_resid[level][m][i]] = 0.0; return; } void temperatures_conform_bcs(E) struct All_variables *E; { void temperatures_conform_bcs2(struct All_variables *); void assimilate_lith_conform_bcs2(struct All_variables *); if(E->control.lith_age) { /* This sequence now moved to end of PG_time_step_solve lith_age_conform_tbc(E); assimilate_lith_conform_bcs(E); */ } else temperatures_conform_bcs2(E); return; } void temperatures_conform_bcs2(E) struct All_variables *E; { int j,node; unsigned int type; for(j=1;j<=E->sphere.caps_per_proc;j++) for(node=1;node<=E->lmesh.nno;node++) { type = (E->node[j][node] & (TBX | TBZ | TBY)); switch (type) { case 0: /* no match, next node */ break; case TBX: E->T[j][node] = E->sphere.cap[j].TB[1][node]; break; case TBZ: E->T[j][node] = E->sphere.cap[j].TB[3][node]; break; case TBY: E->T[j][node] = E->sphere.cap[j].TB[2][node]; break; case (TBX | TBZ): /* clashes ! */ E->T[j][node] = 0.5 * (E->sphere.cap[j].TB[1][node] + E->sphere.cap[j].TB[3][node]); break; case (TBX | TBY): /* clashes ! */ E->T[j][node] = 0.5 * (E->sphere.cap[j].TB[1][node] + E->sphere.cap[j].TB[2][node]); break; case (TBZ | TBY): /* clashes ! */ E->T[j][node] = 0.5 * (E->sphere.cap[j].TB[3][node] + E->sphere.cap[j].TB[2][node]); break; case (TBZ | TBY | TBX): /* clashes ! */ E->T[j][node] = 0.3333333 * (E->sphere.cap[j].TB[1][node] + E->sphere.cap[j].TB[2][node] + E->sphere.cap[j].TB[3][node]); break; } /* next node */ } return; } void velocities_conform_bcs(E,U) struct All_variables *E; double **U; { int node,m; const unsigned int typex = VBX; const unsigned int typez = VBZ; const unsigned int typey = VBY; const int nno = E->lmesh.nno; for(m=1;m<=E->sphere.caps_per_proc;m++) { for(node=1;node<=nno;node++) { if (E->node[m][node] & typex) U[m][E->id[m][node].doff[1]] = E->sphere.cap[m].VB[1][node]; if (E->node[m][node] & typey) U[m][E->id[m][node].doff[2]] = E->sphere.cap[m].VB[2][node]; if (E->node[m][node] & typez) U[m][E->id[m][node].doff[3]] = E->sphere.cap[m].VB[3][node]; } } return; } /* End of file */