File: SectionCompletion.hh.html

package info (click to toggle)
petsc 3.1.dfsg-7
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 131,360 kB
  • ctags: 491,710
  • sloc: ansic: 288,064; cpp: 66,909; python: 28,799; fortran: 19,153; makefile: 13,945; sh: 3,502; f90: 1,655; xml: 620; csh: 230; java: 13
file content (173 lines) | stat: -rw-r--r-- 16,468 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
<center><a href="SectionCompletion.hh">Actual source code: SectionCompletion.hh</a></center><br>

<html>
<head>
<title></title>
<meta name="generator" content="c2html 0.9.5">
<meta name="date" content="2010-04-08T19:56:03+00:00">
</head>

<body bgcolor="#FFFFFF">
<pre width="80"><a name="line1">  1: </a><font color="#A020F0">#ifndef included_ALE_SectionCompletion_hh</font>
<a name="line2">  2: </a><strong><font color="#228B22">#define included_ALE_SectionCompletion_hh</font></strong>

<a name="line4">  4: </a><font color="#A020F0">#ifndef  included_ALE_Topology_hh</font>
<a name="line5">  5: </a><font color="#A020F0">#include &lt;Topology.hh&gt;</font>
<a name="line6">  6: </a><font color="#A020F0">#endif</font>

<a name="line8">  8: </a><font color="#A020F0">#ifndef  included_ALE_Field_hh</font>
<a name="line9">  9: </a><font color="#A020F0">#include &lt;Field.hh&gt;</font>
<a name="line10"> 10: </a><font color="#A020F0">#endif</font>

<a name="line12"> 12: </a>namespace ALE {
<a name="line13"> 13: </a>  namespace New {
<a name="line14"> 14: </a>    template&lt;typename Topology_, typename Value_, typename Alloc_ = typename Topology_::alloc_type&gt;
<a name="line15"> 15: </a>    class SectionCompletion {
<a name="line16"> 16: </a><strong><font color="#FF0000">    public:</font></strong>
<a name="line17"> 17: </a>      <font color="#4169E1">typedef</font> int                                                                              point_type;
<a name="line18"> 18: </a>      <font color="#4169E1">typedef</font> Topology_                                                                        mesh_topology_type;
<a name="line19"> 19: </a>      <font color="#4169E1">typedef</font> Value_                                                                           value_type;
<a name="line20"> 20: </a>      <font color="#4169E1">typedef</font> Alloc_                                                                           alloc_type;
<a name="line21"> 21: </a>      <font color="#4169E1">typedef</font> typename alloc_type::template rebind&lt;point_type&gt;::other                          point_alloc_type;
<a name="line22"> 22: </a>      <font color="#4169E1">typedef</font> typename mesh_topology_type::sieve_type                                          sieve_type;
<a name="line23"> 23: </a>      <font color="#4169E1">typedef</font> typename ALE::DiscreteSieve&lt;point_type, point_alloc_type&gt;                        dsieve_type;
<a name="line24"> 24: </a>      <font color="#4169E1">typedef</font> typename ALE::Topology&lt;int, dsieve_type, alloc_type&gt;                             topology_type;
<a name="line25"> 25: </a>      // TODO: Fix this <font color="#4169E1">typedef</font> typename ALE::Partitioner&lt;&gt;::part_type                         rank_type;
<a name="line26"> 26: </a>      <font color="#4169E1">typedef</font> short int                                                                        rank_type;
<a name="line27"> 27: </a>      <font color="#4169E1">typedef</font> typename ALE::New::SectionCompletion&lt;mesh_topology_type, int, alloc_type&gt;        int_completion;
<a name="line28"> 28: </a>      <font color="#4169E1">typedef</font> typename ALE::New::SectionCompletion&lt;mesh_topology_type, value_type, alloc_type&gt; completion;
<a name="line29"> 29: </a><strong><font color="#FF0000">    public:</font></strong>
<a name="line30"> 30: </a>      // Creates a DiscreteTopology with the overlap information
<a name="line31"> 31: </a>      template&lt;typename SendOverlap&gt;
<a name="line32"> 32: </a>      static Obj&lt;topology_type&gt; createSendTopology(const Obj&lt;SendOverlap&gt;&amp; sendOverlap) {
<a name="line33"> 33: </a>        const Obj&lt;typename SendOverlap::traits::baseSequence&gt; ranks = sendOverlap-&gt;base();
<a name="line34"> 34: </a>        Obj&lt;topology_type&gt; topology = new topology_type(sendOverlap-&gt;comm(), sendOverlap-&gt;debug());

<a name="line36"> 36: </a>        <font color="#4169E1">for</font>(typename SendOverlap::traits::baseSequence::iterator r_iter = ranks-&gt;begin(); r_iter != ranks-&gt;end(); ++r_iter) {
<a name="line37"> 37: </a>          Obj&lt;dsieve_type&gt; sendSieve = new dsieve_type(sendOverlap-&gt;cone(*r_iter));
<a name="line38"> 38: </a>          topology-&gt;setPatch(*r_iter, sendSieve);
<a name="line39"> 39: </a>        }
<a name="line40"> 40: </a>        <font color="#4169E1">return</font> topology;
<a name="line41"> 41: </a>      };
<a name="line42"> 42: </a>      template&lt;typename RecvOverlap&gt;
<a name="line43"> 43: </a>      static Obj&lt;topology_type&gt; createRecvTopology(const Obj&lt;RecvOverlap&gt;&amp; recvOverlap) {
<a name="line44"> 44: </a>        const Obj&lt;typename RecvOverlap::traits::capSequence&gt; ranks = recvOverlap-&gt;cap();
<a name="line45"> 45: </a>        Obj&lt;topology_type&gt; topology = new topology_type(recvOverlap-&gt;comm(), recvOverlap-&gt;debug());

<a name="line47"> 47: </a>        <font color="#4169E1">for</font>(typename RecvOverlap::traits::capSequence::iterator r_iter = ranks-&gt;begin(); r_iter != ranks-&gt;end(); ++r_iter) {
<a name="line48"> 48: </a>          Obj&lt;dsieve_type&gt; recvSieve = new dsieve_type();
<a name="line49"> 49: </a>          const Obj&lt;typename RecvOverlap::supportSequence&gt;&amp; points  = recvOverlap-&gt;support(*r_iter);

<a name="line51"> 51: </a>          <font color="#4169E1">for</font>(typename RecvOverlap::supportSequence::iterator p_iter = points-&gt;begin(); p_iter != points-&gt;end(); ++p_iter) {
<a name="line52"> 52: </a>            recvSieve-&gt;addPoint(p_iter.color());
<a name="line53"> 53: </a>          }
<a name="line54"> 54: </a>          topology-&gt;setPatch(*r_iter, recvSieve);
<a name="line55"> 55: </a>        }
<a name="line56"> 56: </a>        <font color="#4169E1">return</font> topology;
<a name="line57"> 57: </a>      };
<a name="line58"> 58: </a>      template&lt;typename Sizer, typename Section&gt;
<a name="line59"> 59: </a>      static void setupSend(const Obj&lt;topology_type&gt;&amp; sendChart, const Obj&lt;Sizer&gt;&amp; sendSizer, const Obj&lt;Section&gt;&amp; sendSection) {
<a name="line60"> 60: </a>        // Here we should just use the overlap as the topology (once it is a new-style sieve)
<a name="line61"> 61: </a>        sendSection-&gt;clear();
<a name="line62"> 62: </a>        sendSection-&gt;setTopology(sendChart);
<a name="line63"> 63: </a>        sendSection-&gt;construct(sendSizer);
<a name="line64"> 64: </a>        sendSection-&gt;allocate();
<a name="line65"> 65: </a>        <font color="#4169E1">if</font> (sendSection-&gt;debug() &gt; 10) {sendSection-&gt;view(<font color="#666666">"Send section after setup"</font>, MPI_COMM_SELF);}
<a name="line66"> 66: </a>        sendSection-&gt;constructCommunication(Section::SEND);
<a name="line67"> 67: </a>      };
<a name="line68"> 68: </a>      template&lt;typename Filler, typename Section&gt;
<a name="line69"> 69: </a>      static void fillSend(const Filler&amp; sendFiller, const Obj&lt;Section&gt;&amp; sendSection) {
<a name="line70"> 70: </a>        const typename Section::sheaf_type&amp; patches = sendSection-&gt;getPatches();

<a name="line72"> 72: </a>        <font color="#4169E1">for</font>(typename Section::sheaf_type::const_iterator p_iter = patches.begin(); p_iter != patches.end(); ++p_iter) {
<a name="line73"> 73: </a>          const Obj&lt;typename Section::section_type&gt;&amp;        section = p_iter-&gt;second;
<a name="line74"> 74: </a>          const typename Section::section_type::chart_type&amp; chart   = section-&gt;getChart();

<a name="line76"> 76: </a>          <font color="#4169E1">for</font>(typename Section::section_type::chart_type::const_iterator c_iter = chart.begin(); c_iter != chart.end(); ++c_iter) {
<a name="line77"> 77: </a>            <font color="#4169E1">if</font> (sendFiller-&gt;hasPoint(*c_iter)) {
<a name="line78"> 78: </a>              section-&gt;updatePoint(*c_iter, sendFiller-&gt;restrictPoint(*c_iter));
<a name="line79"> 79: </a>            }
<a name="line80"> 80: </a>          }
<a name="line81"> 81: </a>        }
<a name="line82"> 82: </a>      };
<a name="line83"> 83: </a>      template&lt;typename RecvOverlap, typename Sizer, typename Section&gt;
<a name="line84"> 84: </a>      static void setupReceive(const Obj&lt;RecvOverlap&gt;&amp; recvOverlap, const Obj&lt;Sizer&gt;&amp; recvSizer, const Obj&lt;Section&gt;&amp; recvSection) {
<a name="line85"> 85: </a>        // Create section
<a name="line86"> 86: </a>        const Obj&lt;typename RecvOverlap::traits::capSequence&gt; ranks = recvOverlap-&gt;cap();

<a name="line88"> 88: </a>        recvSection-&gt;clear();
<a name="line89"> 89: </a>        <font color="#4169E1">for</font>(typename RecvOverlap::traits::capSequence::iterator r_iter = ranks-&gt;begin(); r_iter != ranks-&gt;end(); ++r_iter) {
<a name="line90"> 90: </a>          const Obj&lt;typename RecvOverlap::supportSequence&gt;&amp; points  = recvOverlap-&gt;support(*r_iter);
<a name="line91"> 91: </a>          const Obj&lt;typename Section::section_type&gt;&amp;        section = recvSection-&gt;getSection(*r_iter);

<a name="line93"> 93: </a>          // Want to replace this loop with a slice through color
<a name="line94"> 94: </a>          <font color="#4169E1">for</font>(typename RecvOverlap::supportSequence::iterator p_iter = points-&gt;begin(); p_iter != points-&gt;end(); ++p_iter) {
<a name="line95"> 95: </a>            const typename dsieve_type::point_type&amp; point = p_iter.color();

<a name="line97"> 97: </a>            section-&gt;setFiberDimension(point, 1);
<a name="line98"> 98: </a>          }
<a name="line99"> 99: </a>        }
<a name="line100">100: </a>        recvSection-&gt;construct(recvSizer);
<a name="line101">101: </a>        recvSection-&gt;allocate();
<a name="line102">102: </a>        recvSection-&gt;constructCommunication(Section::RECEIVE);
<a name="line103">103: </a>      };
<a name="line104">104: </a>      template&lt;typename SendOverlap, typename RecvOverlap, typename SizerFiller, typename Filler, typename SendSection, typename RecvSection&gt;
<a name="line105">105: </a>      static void completeSection(const Obj&lt;SendOverlap&gt;&amp; sendOverlap, const Obj&lt;RecvOverlap&gt;&amp; recvOverlap, const Obj&lt;SizerFiller&gt;&amp; sizerFiller, const Filler&amp; filler, const Obj&lt;SendSection&gt;&amp; sendSection, const Obj&lt;RecvSection&gt;&amp; recvSection) {
<a name="line106">106: </a>        <font color="#4169E1">typedef</font> typename alloc_type::template rebind&lt;int&gt;::other int_alloc_type;
<a name="line107">107: </a>        <font color="#4169E1">typedef</font> typename ALE::Field&lt;SendOverlap, int, ALE::Section&lt;point_type, int, int_alloc_type&gt; &gt; send_sizer_type;
<a name="line108">108: </a>        <font color="#4169E1">typedef</font> typename ALE::Field&lt;RecvOverlap, int, ALE::Section&lt;point_type, int, int_alloc_type&gt; &gt; recv_sizer_type;
<a name="line109">109: </a>        <font color="#4169E1">typedef</font> typename ALE::Field&lt;SendOverlap, int, ALE::ConstantSection&lt;point_type, int&gt; &gt;         constant_send_sizer;
<a name="line110">110: </a>        <font color="#4169E1">typedef</font> typename ALE::Field&lt;RecvOverlap, int, ALE::ConstantSection&lt;point_type, int&gt; &gt;         constant_recv_sizer;
<a name="line111">111: </a>        Obj&lt;send_sizer_type&gt;     sendSizer      = new send_sizer_type(sendSection-&gt;comm(), sendSection-&gt;debug());
<a name="line112">112: </a>        Obj&lt;recv_sizer_type&gt;     recvSizer      = new recv_sizer_type(recvSection-&gt;comm(), sendSizer-&gt;getTag(), recvSection-&gt;debug());
<a name="line113">113: </a>        Obj&lt;constant_send_sizer&gt; constSendSizer = new constant_send_sizer(sendSection-&gt;comm(), sendSection-&gt;debug());
<a name="line114">114: </a>        Obj&lt;constant_recv_sizer&gt; constRecvSizer = new constant_recv_sizer(recvSection-&gt;comm(), recvSection-&gt;debug());
<a name="line115">115: </a>        Obj&lt;topology_type&gt;       sendChart      = completion::createSendTopology(sendOverlap);
<a name="line116">116: </a>        Obj&lt;topology_type&gt;       recvChart      = completion::createRecvTopology(recvOverlap);

<a name="line118">118: </a>        // 1) Create the sizer sections
<a name="line119">119: </a>        constSendSizer-&gt;setTopology(sendChart);
<a name="line120">120: </a>        const typename topology_type::sheaf_type&amp; sendRanks = sendChart-&gt;getPatches();
<a name="line121">121: </a>        <font color="#4169E1">for</font>(typename topology_type::sheaf_type::const_iterator r_iter = sendRanks.begin(); r_iter != sendRanks.end(); ++r_iter) {
<a name="line122">122: </a>          const int rank = r_iter-&gt;first;
<a name="line123">123: </a>          const int one  = 1;
<a name="line124">124: </a>          constSendSizer-&gt;getSection(rank)-&gt;updatePoint(*r_iter-&gt;second-&gt;base()-&gt;begin(), &amp;one);
<a name="line125">125: </a>        }
<a name="line126">126: </a>        constRecvSizer-&gt;setTopology(recvChart);
<a name="line127">127: </a>        const typename topology_type::sheaf_type&amp; recvRanks = recvChart-&gt;getPatches();
<a name="line128">128: </a>        <font color="#4169E1">for</font>(typename topology_type::sheaf_type::const_iterator r_iter = recvRanks.begin(); r_iter != recvRanks.end(); ++r_iter) {
<a name="line129">129: </a>          const int rank = r_iter-&gt;first;
<a name="line130">130: </a>          const int one  = 1;
<a name="line131">131: </a>          constRecvSizer-&gt;getSection(rank)-&gt;updatePoint(*r_iter-&gt;second-&gt;base()-&gt;begin(), &amp;one);
<a name="line132">132: </a>        }
<a name="line133">133: </a><strong><font color="#FF0000">        int_completion:</font></strong>:setupSend(sendChart, constSendSizer, sendSizer);
<a name="line134">134: </a><strong><font color="#FF0000">        int_completion:</font></strong>:setupReceive(recvOverlap, constRecvSizer, recvSizer);
<a name="line135">135: </a>        // 2) Fill the sizer section and communicate
<a name="line136">136: </a><strong><font color="#FF0000">        int_completion:</font></strong>:fillSend(sizerFiller, sendSizer);
<a name="line137">137: </a>        <font color="#4169E1">if</font> (sendSizer-&gt;debug()) {sendSizer-&gt;view(<font color="#666666">"Send Sizer in Completion"</font>, MPI_COMM_SELF);}
<a name="line138">138: </a>        sendSizer-&gt;startCommunication();
<a name="line139">139: </a>        recvSizer-&gt;startCommunication();
<a name="line140">140: </a>        sendSizer-&gt;endCommunication();
<a name="line141">141: </a>        recvSizer-&gt;endCommunication();
<a name="line142">142: </a>        <font color="#4169E1">if</font> (recvSizer-&gt;debug()) {recvSizer-&gt;view(<font color="#666666">"Receive Sizer in Completion"</font>, MPI_COMM_SELF);}
<a name="line143">143: </a>        // No need to update a global section since the receive sizes are all on the interface
<a name="line144">144: </a>        // 3) Create the send and receive sections
<a name="line145">145: </a><strong><font color="#FF0000">        completion:</font></strong>:setupSend(sendChart, sendSizer, sendSection);
<a name="line146">146: </a><strong><font color="#FF0000">        completion:</font></strong>:setupReceive(recvOverlap, recvSizer, recvSection);
<a name="line147">147: </a>        // 4) Fill up send section and communicate
<a name="line148">148: </a><strong><font color="#FF0000">        completion:</font></strong>:fillSend(filler, sendSection);
<a name="line149">149: </a>        <font color="#4169E1">if</font> (sendSection-&gt;debug()) {sendSection-&gt;view(<font color="#666666">"Send Section in Completion"</font>, MPI_COMM_SELF);}
<a name="line150">150: </a>        sendSection-&gt;startCommunication();
<a name="line151">151: </a>        recvSection-&gt;startCommunication();
<a name="line152">152: </a>        sendSection-&gt;endCommunication();
<a name="line153">153: </a>        recvSection-&gt;endCommunication();
<a name="line154">154: </a>        <font color="#4169E1">if</font> (recvSection-&gt;debug()) {recvSection-&gt;view(<font color="#666666">"Receive Section in Completion"</font>, MPI_COMM_SELF);}
<a name="line155">155: </a>      };
<a name="line156">156: </a>    };
<a name="line157">157: </a>  }
<a name="line158">158: </a>}
<a name="line159">159: </a><font color="#A020F0">#endif</font>
</pre>
</body>

</html>