     1	/*
     2	** The program was compiled using the zc ZPL Compiler Version 1.9.0
     3	** Current working directory: /tmp_mnt/nfs/research/paraducks/users/sameer/rs/zpl/zpl2/home/examples
     4	**                   command: /home/grads/sameer/z/altered/src/oldzpl -V3 -zguard jacobi.z 
     5	*/
     6	#include <stdlib.h>
     7	#include <stdio.h>
     8	#include <math.h>
     9	#include <string.h>
    10	#include <limits.h>
    11	#include "md_zinc.h"
    12	#include "jacobi_reg.h"
    13	#include "jacobi_ens.h"
    14	#define _IRONMAN
    15	#include "stand_inc.h"
    16	int _allregionsflat=0;
    17	
    18	int numdirections=_NUM_DIRECTIONS;
    19	
    20	typedef struct _rmsf {
    21	  _region_pnc reg;
    22	  _ensemble_pnc mask;
    23	  int withflag;
    24	} _rmsframe;
    25	
    26	_PRIVATE _rmsframe _RMStack[_MAXRANK+1];/* this should go elsewhere */
    27	#define _MAXENS 64
    28	
    29	/* loop counters for mloops */
    30	_PRIVATE int _i0, _i1, _i2, _i3, _i4, _i5;
    31	
    32	/* loop counters for reflect mloops */
    33	_PRIVATE int _i0d, _i0s, _i1d, _i1s, _i2d, _i2s, _i3d, _i3s, _i4d, _i4s, _i5d, _i5s;
    34	
    35	/* communication buffer */
    36	_PRIVATE char *_globuff;
    37	_PRIVATE int _globuff_size = 0;
    38	
    39	/* config var */   _PRIVATE int n;
    40	/* config var */   _PRIVATE double delta;
    41	/* region _AnonReg0 class=3 */
    42	/* region R class=1 */
    43	_PRIVATE _ens_info _E_A;
    44	_PRIVATE _ensemble_fnc A = &(_E_A);
    45	_PRIVATE _ens_info _E_Temp;
    46	_PRIVATE _ensemble_fnc Temp = &(_E_Temp);
    47	_PRIVATE double err;
    48	/* direction #0: north rank=2 [-1 0 0 ...] */
    49	/* direction #1: east rank=2 [0 1 0 ...] */
    50	/* direction #2: west rank=2 [0 -1 0 ...] */
    51	/* direction #3: south rank=2 [1 0 0 ...] */
    52	/* region _R_north_of_R class=0 */
    53	/* region _R_east_of_R class=0 */
    54	/* region _R_west_of_R class=0 */
    55	/* region _R_south_of_R class=0 */
    56	/* region _R_IMPLICIT_A class=2 */
    57	#include "jacobi_usr.h"
    58	void Jacobi() {
    59	  {  /* Push region scope */
    60	    _region _Tempreg2 = _RMStack[2].reg;
    61	    _ensemble _TempMask2 = _RMStack[2].mask;
    62	
    63	    _RMStack[2].reg = R;
    64	    _RMStack[2].mask = NULL;
    65	
    66	    {
    67	      /* begin MLOOP *** line 19 of jacobi.z */
    68	      for (_i0 = _REG_MYLO(R,0); _i0 <= _REG_MYHI(R,0); _i0 += _REG_STRIDE(R,0))  {
    69	        for (_i1 = _REG_MYLO(R,1); _i1 <= _REG_MYHI(R,1); _i1 += _REG_STRIDE(R,1))  {
    70	          (*((double *)_F_ACCESS_2D(A,_i0,_i1))) = 0.0;
    71	        }
    72	      }
    73	    }
    74	    /* end MLOOP */
    75	
    76	    /* Pop region scope */ 
    77	    _RMStack[2].reg = _Tempreg2;
    78	    _RMStack[2].mask = _TempMask2;
    79	  }  /* End region scope node */
    80	  {  /* Push region scope */
    81	    _region _Tempreg2 = _RMStack[2].reg;
    82	    _ensemble _TempMask2 = _RMStack[2].mask;
    83	
    84	    _RMStack[2].reg = _R_north_of_R;
    85	    _RMStack[2].mask = NULL;
    86	
    87	    {
    88	      /* begin MLOOP *** line 20 of jacobi.z */
    89	      for (_i0 = _REG_MYLO(_R_north_of_R,0); _i0 <= _REG_MYHI(_R_north_of_R,0); _i0 += _REG_STRIDE(_R_north_of_R,0))  {
    90	        for (_i1 = _REG_MYLO(_R_north_of_R,1); _i1 <= _REG_MYHI(_R_north_of_R,1); _i1 += _REG_STRIDE(_R_north_of_R,1))  {
    91	          (*((double *)_F_ACCESS_2D(A,_i0,_i1))) = 0.0;
    92	        }
    93	      }
    94	    }
    95	    /* end MLOOP */
    96	
    97	    /* Pop region scope */ 
    98	    _RMStack[2].reg = _Tempreg2;
    99	    _RMStack[2].mask = _TempMask2;
   100	  }  /* End region scope node */
   101	  {  /* Push region scope */
   102	    _region _Tempreg2 = _RMStack[2].reg;
   103	    _ensemble _TempMask2 = _RMStack[2].mask;
   104	
   105	    _RMStack[2].reg = _R_east_of_R;
   106	    _RMStack[2].mask = NULL;
   107	
   108	    {
   109	      /* begin MLOOP *** line 21 of jacobi.z */
   110	      for (_i0 = _REG_MYLO(_R_east_of_R,0); _i0 <= _REG_MYHI(_R_east_of_R,0); _i0 += _REG_STRIDE(_R_east_of_R,0))  {
   111	        for (_i1 = _REG_MYLO(_R_east_of_R,1); _i1 <= _REG_MYHI(_R_east_of_R,1); _i1 += _REG_STRIDE(_R_east_of_R,1))  {
   112	          (*((double *)_F_ACCESS_2D(A,_i0,_i1))) = 0.0;
   113	        }
   114	      }
   115	    }
   116	    /* end MLOOP */
   117	
   118	    /* Pop region scope */ 
   119	    _RMStack[2].reg = _Tempreg2;
   120	    _RMStack[2].mask = _TempMask2;
   121	  }  /* End region scope node */
   122	  {  /* Push region scope */
   123	    _region _Tempreg2 = _RMStack[2].reg;
   124	    _ensemble _TempMask2 = _RMStack[2].mask;
   125	
   126	    _RMStack[2].reg = _R_west_of_R;
   127	    _RMStack[2].mask = NULL;
   128	
   129	    {
   130	      /* begin MLOOP *** line 22 of jacobi.z */
   131	      for (_i0 = _REG_MYLO(_R_west_of_R,0); _i0 <= _REG_MYHI(_R_west_of_R,0); _i0 += _REG_STRIDE(_R_west_of_R,0))  {
   132	        for (_i1 = _REG_MYLO(_R_west_of_R,1); _i1 <= _REG_MYHI(_R_west_of_R,1); _i1 += _REG_STRIDE(_R_west_of_R,1))  {
   133	          (*((double *)_F_ACCESS_2D(A,_i0,_i1))) = 0.0;
   134	        }
   135	      }
   136	    }
   137	    /* end MLOOP */
   138	
   139	    /* Pop region scope */ 
   140	    _RMStack[2].reg = _Tempreg2;
   141	    _RMStack[2].mask = _TempMask2;
   142	  }  /* End region scope node */
   143	  {  /* Push region scope */
   144	    _region _Tempreg2 = _RMStack[2].reg;
   145	    _ensemble _TempMask2 = _RMStack[2].mask;
   146	
   147	    _RMStack[2].reg = _R_south_of_R;
   148	    _RMStack[2].mask = NULL;
   149	
   150	    {
   151	      /* begin MLOOP *** line 23 of jacobi.z */
   152	      for (_i0 = _REG_MYLO(_R_south_of_R,0); _i0 <= _REG_MYHI(_R_south_of_R,0); _i0 += _REG_STRIDE(_R_south_of_R,0))  {
   153	        for (_i1 = _REG_MYLO(_R_south_of_R,1); _i1 <= _REG_MYHI(_R_south_of_R,1); _i1 += _REG_STRIDE(_R_south_of_R,1))  {
   154	          (*((double *)_F_ACCESS_2D(A,_i0,_i1))) = 1.0;
   155	        }
   156	      }
   157	    }
   158	    /* end MLOOP */
   159	
   160	    /* Pop region scope */ 
   161	    _RMStack[2].reg = _Tempreg2;
   162	    _RMStack[2].mask = _TempMask2;
   163	  }  /* End region scope node */
   164	  {  /* Push region scope */
   165	    _region _Tempreg2 = _RMStack[2].reg;
   166	    _ensemble _TempMask2 = _RMStack[2].mask;
   167	
   168	    _RMStack[2].reg = R;
   169	    _RMStack[2].mask = NULL;
   170	
   171	    do {
   172	
   173	      /* pre-RECV (near line 26 of jacobi) */
   174	      {
   175	        _ensemble_pnc _ensvect[2];
   176	        _direction _subdirvect0[] = {west,_NO_DIRECTION};
   177	        _direction * _dirvect[2];
   178	        unsigned int _sizevect[] = {sizeof(double)};
   179	        _ensvect[0] = A;
   180	        _ensvect[1] = NULL;
   181	        _dirvect[0] = _subdirvect0;
   182	        _dirvect[1] = NULL;
   183	        _RHSCommI(R,_ensvect,_dirvect,_sizevect,0);
   184	      }
   185	
   186	      /* pre-RECV (near line 26 of jacobi) */
   187	      {
   188	        _ensemble_pnc _ensvect[2];
   189	        _direction _subdirvect0[] = {south,_NO_DIRECTION};
   190	        _direction * _dirvect[2];
   191	        unsigned int _sizevect[] = {sizeof(double)};
   192	        _ensvect[0] = A;
   193	        _ensvect[1] = NULL;
   194	        _dirvect[0] = _subdirvect0;
   195	        _dirvect[1] = NULL;
   196	        _RHSCommI(R,_ensvect,_dirvect,_sizevect,1);
   197	      }
   198	
   199	      /* pre-RECV (near line 26 of jacobi) */
   200	      {
   201	        _ensemble_pnc _ensvect[2];
   202	        _direction _subdirvect0[] = {east,_NO_DIRECTION};
   203	        _direction * _dirvect[2];
   204	        unsigned int _sizevect[] = {sizeof(double)};
   205	        _ensvect[0] = A;
   206	        _ensvect[1] = NULL;
   207	        _dirvect[0] = _subdirvect0;
   208	        _dirvect[1] = NULL;
   209	        _RHSCommI(R,_ensvect,_dirvect,_sizevect,2);
   210	      }
   211	
   212	      /* pre-RECV (near line 26 of jacobi) */
   213	      {
   214	        _ensemble_pnc _ensvect[2];
   215	        _direction _subdirvect0[] = {north,_NO_DIRECTION};
   216	        _direction * _dirvect[2];
   217	        unsigned int _sizevect[] = {sizeof(double)};
   218	        _ensvect[0] = A;
   219	        _ensvect[1] = NULL;
   220	        _dirvect[0] = _subdirvect0;
   221	        _dirvect[1] = NULL;
   222	        _RHSCommI(R,_ensvect,_dirvect,_sizevect,3);
   223	      }
   224	
   225	      /* SEND (near line 26 of jacobi) */
   226	      _RHSCommII(0);
   227	
   228	      /* SEND (near line 26 of jacobi) */
   229	      _RHSCommII(1);
   230	
   231	      /* SEND (near line 26 of jacobi) */
   232	      _RHSCommII(2);
   233	
   234	      /* SEND (near line 26 of jacobi) */
   235	      _RHSCommII(3);
   236	
   237	      /* RECV (near line 26 of jacobi) */
   238	      _RHSCommIII(0);
   239	
   240	      /* RECV (near line 26 of jacobi) */
   241	      _RHSCommIII(1);
   242	
   243	      /* RECV (near line 26 of jacobi) */
   244	      _RHSCommIII(2);
   245	
   246	      /* RECV (near line 26 of jacobi) */
   247	      _RHSCommIII(3);
   248	      {
   249	        /* begin MLOOP *** line 26 of jacobi.z */
   250	        for (_i0 = _REG_MYLO(R,0); _i0 <= _REG_MYHI(R,0); _i0 += _REG_STRIDE(R,0))  {
   251	          for (_i1 = _REG_MYLO(R,1); _i1 <= _REG_MYHI(R,1); _i1 += _REG_STRIDE(R,1))  {
   252	            (*((double *)_F_ACCESS_2D(Temp,_i0,_i1))) = ((*((double *)_F_ACCESS_2D(A,_i0-1,_i1))) + (*((double *)_F_ACCESS_2D(A,_i0,_i1+1))) + (*((double *)_F_ACCESS_2D(A,_i0,_i1-1))) + (*((double *)_F_ACCESS_2D(A,_i0+1,_i1)))) / 4.0;
   253	          }
   254	        }
   255	      }
   256	      /* end MLOOP */
   257	      { /* begin Reduce (line 27) */
   258	        double _red_in;
   259	        double _red_out;
   260	
   261	        _red_in=_MAX_double_IDENTITY;
   262	        for (_i0=_REG_MYLO(R,0);_i0<=_REG_MYHI(R,0);_i0++) {
   263	          for (_i1=_REG_MYLO(R,1);_i1<=_REG_MYHI(R,1);_i1++) {
   264	            _MAX_STMT(_red_in,fabs((*((double *)_F_ACCESS_2D(A,_i0,_i1))) - (*((double *)_F_ACCESS_2D(Temp,_i0,_i1)))));
   265	          }
   266	        }
   267	        _globalReduceRoutinedouble(&_red_in,&_red_out,NULL,R,3,1,_OP_MAX);
   268	        _RedBcastSimple(&_red_out,sizeof(double),0,5);
   269	        err = _red_out;
   270	      } /* end Reduce (line 27) */
   271	
   272	      /* post-SEND (near line 28 of jacobi) */
   273	      _RHSCommIV(0);
   274	
   275	      /* post-SEND (near line 28 of jacobi) */
   276	      _RHSCommIV(1);
   277	
   278	      /* post-SEND (near line 28 of jacobi) */
   279	      _RHSCommIV(2);
   280	
   281	      /* post-SEND (near line 28 of jacobi) */
   282	      _RHSCommIV(3);
   283	      {
   284	        /* begin MLOOP *** line 28 of jacobi.z */
   285	        for (_i0 = _REG_MYLO(R,0); _i0 <= _REG_MYHI(R,0); _i0 += _REG_STRIDE(R,0))  {
   286	          for (_i1 = _REG_MYLO(R,1); _i1 <= _REG_MYHI(R,1); _i1 += _REG_STRIDE(R,1))  {
   287	            (*((double *)_F_ACCESS_2D(A,_i0,_i1))) = (*((double *)_F_ACCESS_2D(Temp,_i0,_i1)));
   288	          }
   289	        }
   290	      }
   291	      /* end MLOOP */
   292	    } while (!(err < delta));
   293	
   294	    /* Pop region scope */ 
   295	    _RMStack[2].reg = _Tempreg2;
   296	    _RMStack[2].mask = _TempMask2;
   297	  }  /* End region scope node */
   298	  {  /* Push region scope */
   299	    _region _Tempreg2 = _RMStack[2].reg;
   300	    _ensemble _TempMask2 = _RMStack[2].mask;
   301	
   302	    _RMStack[2].reg = R;
   303	    _RMStack[2].mask = NULL;
   304	
   305	    _StreamEnsembleTxt(zout,R,A,_ZIO_W,_StreamOut_double,_Z_W_double);
   306	    _SCALAR_LINEFEED(zout);
   307	
   308	    /* Pop region scope */ 
   309	    _RMStack[2].reg = _Tempreg2;
   310	    _RMStack[2].mask = _TempMask2;
   311	  }  /* End region scope node */
   312	  _retpt:;
   313	}
   314	
   315	_PRIVATE int _cfginit[2] = { 0, 0};
   316	const int _max_ens_comm=1;
   317	
   318	void _main() {
   319	  extern int zcmapsize;
   320	  extern int zcmap[];
   321	
   322	  /* These lines, though useless, are required by ZGuard */
   323	  zcmapsize=zcmapsize;
   324	  zcmap[0]=zcmap[0];
   325	
   326	  _InitIronman(5);
   327	  /* ENTRY POINT */
   328	  Jacobi();
   329	}
   330	
   331	
   332	int zcmapsize = 31;
   333	int zcmap[31] = {
   334		-1,
   335		-1,
   336		-1,
   337		-1,
   338		-1,
   339		-1,
   340		-1,
   341		-1,
   342		-1,
   343		-1,
   344		-1,
   345		-1,
   346		-1,
   347		-1,
   348		-1,
   349		-1,
   350		-1,
   351		-1,
   352		70,
   353		91,
   354		112,
   355		133,
   356		154,
   357		-1,
   358		171,
   359		252,
   360		257,
   361		287,
   362		-1,
   363		-1,
   364		305 };
