1 |
% $Header: /u/gcmpack/MITgcm/utils/exch2/matlab-topology-generator/driver.m,v 1.3 2007/03/21 02:02:12 jmc Exp $ |
2 |
% $Name: $ |
3 |
|
4 |
% Create exch2 communication map and schedule for a cube sphere grid with |
5 |
% constant tile size tnx x tny. |
6 |
|
7 |
% Use red-green-blue shorthand for cube index space specification |
8 |
% In this notation cube faces are laid out as shown below |
9 |
% |
10 |
% f5(nr,ng) f6(nb,ng) |
11 |
% f3(ng,nb) f4(nr,nb) |
12 |
% f1(nb,nr) f2(ng,nr) |
13 |
%--- |
14 |
%nr=64; nb=32; ng=128; |
15 |
%nr=576; nb=576; ng=576; |
16 |
%nr=672; nb=672; ng=672; |
17 |
%nr=32; nb=32; ng=32; |
18 |
%nr=510; nb=510; ng=510; |
19 |
nr=102; nb=102; ng=102; |
20 |
%nr=30; nb=30; ng=30; |
21 |
|
22 |
%- Choose tile subgrid sizes for each face. |
23 |
% nr,nb,ng must be integer multiples of tnx and tny. |
24 |
%--- |
25 |
%tnx=85;tny=85; |
26 |
%tnx=10;tny=10; |
27 |
%tnx=16;tny=16; |
28 |
tnx=16;tny=32; |
29 |
%tnx=32;tny=32; |
30 |
%tnx=32;tny=8; |
31 |
%tnx=192;tny=64; |
32 |
tnx=51;tny=51; |
33 |
|
34 |
% nr = 360; ng = 90; nb = 90; tnx=90; tny=90; %- polar-cap grid |
35 |
|
36 |
%- select option for global-IO mapping: mapIO |
37 |
% =-1 : old format: put domains 1 after the other in the X direction |
38 |
% this is not necessary "compact" |
39 |
% = 1 : compact format, 1 domain after the other (mostly in Y direction) |
40 |
% but needs to fold some domains (face) if too large |
41 |
% = 0 : compact format (= 1 long line), one domain after the other |
42 |
%--- |
43 |
mapIO=-1; |
44 |
|
45 |
if mapIO==1, |
46 |
%- calculate size in X of global-IO map: = greater divider of nr,nb,ng |
47 |
[divlist]=exch2_divider([nr nb ng]); |
48 |
mapIO=prod(divlist); |
49 |
end |
50 |
|
51 |
% Make list of domains. Assume MITgcm standard cube layout, three |
52 |
% color path labeling and global indexing convention. |
53 |
clear domain ndomains domain_nx domain_ny |
54 |
[ndomains,domain,domain_nx,domain_ny] = exch2_setup_cs6_domains(nr,nb,ng); |
55 |
|
56 |
% Now create basic tile definitions for each domain with their offsets |
57 |
% within the domain |
58 |
% tn[xy] :: tile extents in x and y |
59 |
% tbase[xy] :: offset of tile local coords from domain coords |
60 |
% :: tdom[xy] = tlocal[xy] + tbase[xy] |
61 |
% t[xy]globallo :: global composite domain coordinate associated with |
62 |
% :: tlocal[xy]=(1,1) |
63 |
% mydomain :: domain number the tile belongs to |
64 |
% tileid :: identifier number for tile |
65 |
% tx :: tile x coordinate within domain tiling |
66 |
% ty :: tile y coordinate within domain tiling |
67 |
clear tile |
68 |
[tile,ntiles,ierr,domain]= ... |
69 |
exch2_setup_cs6_tiles(tnx,tny,domain,ndomains,mapIO); |
70 |
|
71 |
% Set neighbor domains for each tile |
72 |
[tile] = exch2_setup_cs6_get_neighbor_domains(tile, domain, ntiles); |
73 |
|
74 |
% Let try and figure out what points I send my edges to. We do this by |
75 |
% a search procedure rather than a functional relationship. The search |
76 |
% procedure visits each edge of each tile in turn. For internal edges |
77 |
% (edges that don't cross a domain boundary) the index range at +/-1 |
78 |
% in the normal direction to the edge is searched for. This identifies |
79 |
% all the tiles that border this tile. |
80 |
[tile] = exch2_setup_cs6_get_internal_neighbor_tiles( tile, domain, ntiles); |
81 |
[tile] = exch2_setup_cs6_get_internal_neighbor_index_ranges(tile, domain, ntiles); |
82 |
|
83 |
[tile] = exch2_setup_cs6_get_external_neighbor_tiles( tile, domain, ntiles); |
84 |
|
85 |
% Draw a picture of the full domain and its tiles in the standard cube layout |
86 |
exch2_setup_cs6_plot(domain, tile, tnx, tny); |
87 |
|
88 |
% Squeeze the blank tiles out |
89 |
[tile, domain] = exch2_setup_squeeze_blanks(domain, tile, tnx, tny); |
90 |
|
91 |
% Write attributes for a tile |
92 |
exch2_setup_cs6_print( domain, tile, tnx, tny, mapIO, 1) |