1 /***********************************************************************
5 The following is a notice of limited availability of the code and
6 Government license and disclaimer which must be included in the
7 prologue of the code and in all source listings of the code.
10 (c) 1977 University of Chicago
12 Permission is hereby granted to use, reproduce, prepare
13 derivative works, and to redistribute to others at no charge. If
14 you distribute a copy or copies of the Software, or you modify a
15 copy or copies of the Software or any portion of it, thus forming
16 a work based on the Software and make and/or distribute copies of
17 such work, you must meet the following conditions:
19 a) If you make a copy of the Software (modified or verbatim)
20 it must include the copyright notice and Government
21 license and disclaimer.
23 b) You must cause the modified Software to carry prominent
24 notices stating that you changed specified portions of
27 This software was authored by:
29 Argonne National Laboratory
30 J. Michalakes: (630) 252-6646; email: michalak@mcs.anl.gov
31 Mathematics and Computer Science Division
32 Argonne National Laboratory, Argonne, IL 60439
34 ARGONNE NATIONAL LABORATORY (ANL), WITH FACILITIES IN THE STATES
35 OF ILLINOIS AND IDAHO, IS OWNED BY THE UNITED STATES GOVERNMENT,
36 AND OPERATED BY THE UNIVERSITY OF CHICAGO UNDER PROVISION OF A
37 CONTRACT WITH THE DEPARTMENT OF ENERGY.
39 GOVERNMENT LICENSE AND DISCLAIMER
41 This computer code material was prepared, in part, as an account
42 of work sponsored by an agency of the United States Government.
43 The Government is granted for itself and others acting on its
44 behalf a paid-up, nonexclusive, irrevocable worldwide license in
45 this data to reproduce, prepare derivative works, distribute
46 copies to the public, perform publicly and display publicly, and
47 to permit others to do so. NEITHER THE UNITED STATES GOVERNMENT
48 NOR ANY AGENCY THEREOF, NOR THE UNIVERSITY OF CHICAGO, NOR ANY OF
49 THEIR EMPLOYEES, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
50 ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY,
51 COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS,
52 PRODUCT, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD
53 NOT INFRINGE PRIVATELY OWNED RIGHTS.
55 ***************************************************************************/
62 #define INDEX_2(A,B,NB) ( (B) + (A)*(NB) )
64 mark_line( wrk
, m
, n
, x1
, y1
, x2
, y2
, val
)
66 int m
, n
, x1
, y1
, x2
, y2
, val
;
71 double SLOPE
, X
, Y
, DX
, DY
, dY
, X1
, X2
, Y1
, Y2
;
82 for ( i
= y1
; i
<= y2
; i
++ )
83 wrk
[ INDEX_2( x1
, i
, m
)] = val
;
85 for ( i
= y2
; i
<= y1
; i
++ )
86 wrk
[ INDEX_2( x1
, i
, m
)] = val
;
98 for ( X
= x1
+.5 ; X
< x2
+.5 ; X
= X
+.5 )
102 for ( i
= Y
; i
<= (k
=Y
+dY
) ; i
++ ) /* k business converts to int */
103 wrk
[ INDEX_2( j
, i
, m
)] = val
;
105 for ( i
= Y
; i
>= (k
=Y
+dY
) ; i
-- )
106 wrk
[ INDEX_2( j
, i
, m
)] = val
;
109 wrk
[ INDEX_2( x2
, y2
, m
)] = val
;
114 for ( X
= x2
+.5 ; X
< x1
+.5 ; X
= X
+.5 )
118 for ( i
= Y
; i
<= (k
=Y
+dY
) ; i
++ ) /* k business converts to int */
119 wrk
[ INDEX_2( j
, i
, m
)] = val
;
121 for ( i
= Y
; i
>= (k
=Y
+dY
) ; i
-- )
122 wrk
[ INDEX_2( j
, i
, m
)] = val
;
125 wrk
[ INDEX_2( x1
, y1
, m
)] = val
;
129 fill_region( wrk
, m
, n
, v
, v2
)
130 int wrk
[], m
, n
, v
, v2
;
134 for ( y
= 0 ; y
< m
; y
++ )
136 flood( 0, y
, v
, v2
, wrk
, m
, n
) ;
137 flood( n
-1, y
, v
, v2
, wrk
, m
, n
) ;
139 for ( x
= 0 ; x
< n
; x
++ )
141 flood( x
, 0, v
, v2
, wrk
, m
, n
) ;
142 flood( x
, m
-1, v
, v2
, wrk
, m
, n
) ;
146 decomp_region_1( wrk
, m
, n
, py
, px
)
147 int wrk
[], m
, n
, py
, px
;
150 int x
, y
, ncells
, nprocs
, n_p
, n_py
, n_px
, i
, pid
, p
;
152 wk
= (int*)malloc(m
*n
*sizeof(int)) ;
156 for ( x
= 0 ; x
< m
*n
; x
++ )
159 if ( wrk
[x
] != 0 ) ncells
++ ;
162 n_p
= ncells
/ nprocs
;
164 /* divide over py in m dimension first */
168 for ( y
= 0 ; y
< m
; y
++ )
170 for ( x
= 0 ; x
< n
; x
++ )
172 if ( wrk
[INDEX_2(x
,y
,m
)] != 0 ) /* only do cells in partition */
174 if ( i
% n_py
== 0 ) pid
++ ;
176 if ( pid
> px
-1 ) pid
= px
-1 ;
177 wk
[INDEX_2(x
,y
,m
)] = pid
;
182 /* now divide over px in n dimension */
184 for ( p
= 0 ; p
< py
; p
++ )
188 for ( x
= 0 ; x
< n
; x
++ )
190 for ( y
= 0 ; y
< m
; y
++ )
192 if ( wk
[INDEX_2(x
,y
,m
)] == p
)
194 if ( i
% n_px
== 0 ) pid
++ ;
196 if ( pid
> py
-1 ) pid
= py
-1 ;
197 wk
[INDEX_2(x
,y
,m
)] = pid
*10000 + p
;
203 for ( x
= 0 ; x
< n
; x
++ )
204 for ( y
= 0 ; y
< m
; y
++ )
206 if (( p
= wk
[ INDEX_2( x
, y
, m
) ] ) != -1 )
210 wrk
[INDEX_2( x
, y
, m
)] = n_py
*px
+ n_px
;
214 wrk
[INDEX_2( x
, y
, m
)] = wk
[INDEX_2( x
, y
, m
)] ;
221 decomp_region_2( wrk
, m
, n
, py
, px
)
222 int wrk
[], m
, n
, py
, px
;
225 int x
, y
, ncells
, nprocs
, n_p
, n_py
, n_px
, i
, pid
, p
;
228 printf("decomp_region_2( wrk, %d, %d, %d, %d )\n",m
, n
, py
, px
) ;
229 wk
= (int*)malloc(m
*n
*sizeof(int)) ;
233 for ( x
= 0 ; x
< m
*n
; x
++ )
236 if ( wrk
[x
] != 0 ) ncells
++ ;
239 n_p
= ncells
/ nprocs
;
241 dc2( 0, nprocs
, wk
, wrk
, m
, n
, py
, px
, n_p
) ;
243 for ( x
= 0 ; x
< n
; x
++ )
244 for ( y
= 0 ; y
< m
; y
++ )
246 if (( p
= wk
[ INDEX_2( x
, y
, m
) ] ) != -1 )
250 wrk
[INDEX_2( x
, y
, m
)] = n_py
*px
+ n_px
;
254 wrk
[INDEX_2( x
, y
, m
)] = wk
[INDEX_2( x
, y
, m
)] ;
261 dc2( p
, nprocs
, wk
, wrk
, m
, n
, py
, px
, n_p
)
262 int p
, nprocs
, wk
[], wrk
[], m
, n
, py
, px
, n_p
;
264 int x
, y
, i
, v
, flg
, reach
, oldi
;
266 if ( p
>= nprocs
) return ;
268 printf("dc2(%d, %d, wk, wk, %d, %d, %d, %d, %d)\n",p
, nprocs
,m
, n
, py
, px
, n_p
);
271 for ( x
= 0 ; x
< n
; x
++ )
274 for ( y
= 0 ; y
< m
&& flg
; y
++ )
276 if ( wrk
[INDEX_2(x
,y
,m
)] != 0 )
278 if ( wk
[INDEX_2(x
,y
,m
)] == -1 ) goto breakout
;
279 if ( wk
[INDEX_2(x
,y
,m
)] != -1 ) flg
= 0 ;
284 for ( y
= 0 ; y
< m
; y
++ )
287 for ( x
= n
-1 ; x
>= 0 && flg
; x
-- )
289 if ( wrk
[INDEX_2(x
,y
,m
)] != 0 )
291 if ( wk
[INDEX_2(x
,y
,m
)] == -1 ) goto breakout
;
292 if ( wk
[INDEX_2(x
,y
,m
)] != -1 ) flg
= 0 ;
297 for ( x
= n
-1 ; x
>=0 ; x
-- )
300 for ( y
= m
-1 ; y
>=0 && flg
; y
-- )
302 if ( wrk
[INDEX_2(x
,y
,m
)] != 0 )
304 if ( wk
[INDEX_2(x
,y
,m
)] == -1 ) goto breakout
;
305 if ( wk
[INDEX_2(x
,y
,m
)] != -1 ) flg
= 0 ;
310 for ( y
= m
-1 ; y
>= 0 ; y
-- )
313 for ( x
= 0 ; x
< n
&& flg
; x
++ )
315 if ( wrk
[INDEX_2(x
,y
,m
)] != 0 )
317 if ( wk
[INDEX_2(x
,y
,m
)] == -1 ) goto breakout
;
318 if ( wk
[INDEX_2(x
,y
,m
)] != -1 ) flg
= 0 ;
323 for ( x
= 0 ; x
< n
; x
++ )
325 for ( y
= 0 ; y
< m
; y
++ )
327 v
= wk
[INDEX_2(x
,y
,m
)] ;
328 if ( v
== -1 && wrk
[INDEX_2(x
,y
,m
)] != 0 )
336 if ( x
== n
) return ; /* done, none found */
338 printf("dc2: p %d v %d x %d y %d wrk %d\n", p
,v
,x
,y
,wrk
[INDEX_2(x
,y
,m
)]) ;
342 /* start acreting outward until we're stopped dead or we get enough */
347 acrete( wk
, wrk
, p
, &i
, n_p
, reach
, x
, y
, m
, n
) ;
348 if ( i
== oldi
) break ;
352 print_region( wk
, m
, n
) ;
354 dc2( p
+1, nprocs
, wk
, wrk
, m
, n
, py
, px
, n_p
) ;
359 if( (X) >= 0 && (X) < n && (Y) >= 0 && (Y) < m && *i < n_p ) \
360 if (wk[INDEX_2((X),(Y),m)]==-1&&wrk[INDEX_2((X),(Y),m)]!=0) \
363 wk[INDEX_2((X),(Y),m)] = p ; \
368 acrete( wk
, wrk
, p
, i
, n_p
, reach
, x
, y
, m
, n
)
369 int wk
[], wrk
[], p
, *i
, n_p
;
373 if ( reach
== 0 ) return ;
374 if ( *i
>= n_p
) return ;
375 if ( !(x
>= 0 && x
< n
&& y
>= 0 && y
< m
) ) return ;
376 if ( wrk
[INDEX_2(x
,y
,m
)]==0 ) return ;
377 if ( wk
[INDEX_2(x
,y
,m
)]!=-1 && wk
[INDEX_2(x
,y
,m
)]!= p
) return ;
380 if ( p == 5 && reach == 1 )
381 printf("acrete(wk,wrk, p %d, *i %d, n_p %d, reach %d, x %d, y %d, m %d, n %d)\n",p, *i, n_p, reach, x, y, m, n ) ;
394 acrete( wk
, wrk
, p
, i
, n_p
, reach
-1, x
-1 , y
-1 , m
, n
) ;
395 acrete( wk
, wrk
, p
, i
, n_p
, reach
-1, x
-1 , y
, m
, n
) ;
396 acrete( wk
, wrk
, p
, i
, n_p
, reach
-1, x
-1 , y
+1 , m
, n
) ;
397 acrete( wk
, wrk
, p
, i
, n_p
, reach
-1, x
, y
+1 , m
, n
) ;
398 acrete( wk
, wrk
, p
, i
, n_p
, reach
-1, x
+1 , y
+1 , m
, n
) ;
399 acrete( wk
, wrk
, p
, i
, n_p
, reach
-1, x
+1 , y
, m
, n
) ;
400 acrete( wk
, wrk
, p
, i
, n_p
, reach
-1, x
+1 , y
-1 , m
, n
) ;
401 acrete( wk
, wrk
, p
, i
, n_p
, reach
-1, x
, y
-1 , m
, n
) ;
406 flood( x
, y
, v
, v2
, wrk
, m
, n
)
407 int x
, y
, v
, v2
, wrk
[], m
, n
;
409 if ( x
< 0 || x
>= n
|| y
< 0 || y
>= m
)
411 if ( wrk
[INDEX_2(x
,y
,m
)] == v
)
413 wrk
[INDEX_2(x
,y
,m
)] = v2
;
414 flood( x
+1, y
, v
, v2
, wrk
, m
, n
) ;
415 flood( x
-1, y
, v
, v2
, wrk
, m
, n
) ;
416 flood( x
, y
+1, v
, v2
, wrk
, m
, n
) ;
417 flood( x
, y
-1, v
, v2
, wrk
, m
, n
) ;
421 print_region( wrk
, m
, n
)
425 for ( i
= m
-1 ; i
>= 0 ; i
-- )
427 for ( j
= 0 ; j
< n
; j
++ )
429 if ( wrk
[ INDEX_2( j
, i
, m
) ] == -1 )
432 printf("%3d", wrk
[ INDEX_2( j
, i
, m
) ] ) ;
444 int i
, j
, m
, n
, x1
, y1
, x2
, y2
, py
, px
, opt
;
446 for ( i
= 0 ; i
< 100*100 ; i
++ ) wrk
[i
] = 0 ;
448 scanf("%d %d", &m
, &n
) ;
449 scanf("%d %d %d", &py
, &px
, &opt
) ;
450 scanf("%d %d", &x1
, &y1
) ;
451 while ( scanf("%d %d", &x2
, &y2
) != EOF
)
453 mark_line( wrk
, m
, n
, x1
, y1
, x2
, y2
, 1 ) ;
458 print_region( wrk
, m
, n
) ;
460 fill_region( wrk
, m
, n
, 0, 2 ) ;
461 for ( j
= 0 ; j
< n
; j
++ )
462 for ( i
= 0 ; i
< m
; i
++ )
464 if ( wrk
[ INDEX_2( j
, i
, m
) ] == 2 )
465 wrk
[ INDEX_2( j
, i
, m
) ] = 0 ;
467 wrk
[ INDEX_2( j
, i
, m
) ] = 1 ;
470 print_region( wrk
, m
, n
) ;
474 case 1 : decomp_region_1( wrk
, m
, n
, py
, px
) ;
475 print_region( wrk
, m
, n
) ;
477 case 2 : decomp_region_2( wrk
, m
, n
, py
, px
) ;