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 <Topology.hh></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 <Field.hh></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<typename Topology_, typename Value_, typename Alloc_ = typename Topology_::alloc_type>
<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<point_type>::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<point_type, point_alloc_type> dsieve_type;
<a name="line24"> 24: </a> <font color="#4169E1">typedef</font> typename ALE::Topology<int, dsieve_type, alloc_type> topology_type;
<a name="line25"> 25: </a> // TODO: Fix this <font color="#4169E1">typedef</font> typename ALE::Partitioner<>::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<mesh_topology_type, int, alloc_type> int_completion;
<a name="line28"> 28: </a> <font color="#4169E1">typedef</font> typename ALE::New::SectionCompletion<mesh_topology_type, value_type, alloc_type> 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<typename SendOverlap>
<a name="line32"> 32: </a> static Obj<topology_type> createSendTopology(const Obj<SendOverlap>& sendOverlap) {
<a name="line33"> 33: </a> const Obj<typename SendOverlap::traits::baseSequence> ranks = sendOverlap->base();
<a name="line34"> 34: </a> Obj<topology_type> topology = new topology_type(sendOverlap->comm(), sendOverlap->debug());
<a name="line36"> 36: </a> <font color="#4169E1">for</font>(typename SendOverlap::traits::baseSequence::iterator r_iter = ranks->begin(); r_iter != ranks->end(); ++r_iter) {
<a name="line37"> 37: </a> Obj<dsieve_type> sendSieve = new dsieve_type(sendOverlap->cone(*r_iter));
<a name="line38"> 38: </a> topology->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<typename RecvOverlap>
<a name="line43"> 43: </a> static Obj<topology_type> createRecvTopology(const Obj<RecvOverlap>& recvOverlap) {
<a name="line44"> 44: </a> const Obj<typename RecvOverlap::traits::capSequence> ranks = recvOverlap->cap();
<a name="line45"> 45: </a> Obj<topology_type> topology = new topology_type(recvOverlap->comm(), recvOverlap->debug());
<a name="line47"> 47: </a> <font color="#4169E1">for</font>(typename RecvOverlap::traits::capSequence::iterator r_iter = ranks->begin(); r_iter != ranks->end(); ++r_iter) {
<a name="line48"> 48: </a> Obj<dsieve_type> recvSieve = new dsieve_type();
<a name="line49"> 49: </a> const Obj<typename RecvOverlap::supportSequence>& points = recvOverlap->support(*r_iter);
<a name="line51"> 51: </a> <font color="#4169E1">for</font>(typename RecvOverlap::supportSequence::iterator p_iter = points->begin(); p_iter != points->end(); ++p_iter) {
<a name="line52"> 52: </a> recvSieve->addPoint(p_iter.color());
<a name="line53"> 53: </a> }
<a name="line54"> 54: </a> topology->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<typename Sizer, typename Section>
<a name="line59"> 59: </a> static void setupSend(const Obj<topology_type>& sendChart, const Obj<Sizer>& sendSizer, const Obj<Section>& 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->clear();
<a name="line62"> 62: </a> sendSection->setTopology(sendChart);
<a name="line63"> 63: </a> sendSection->construct(sendSizer);
<a name="line64"> 64: </a> sendSection->allocate();
<a name="line65"> 65: </a> <font color="#4169E1">if</font> (sendSection->debug() > 10) {sendSection->view(<font color="#666666">"Send section after setup"</font>, MPI_COMM_SELF);}
<a name="line66"> 66: </a> sendSection->constructCommunication(Section::SEND);
<a name="line67"> 67: </a> };
<a name="line68"> 68: </a> template<typename Filler, typename Section>
<a name="line69"> 69: </a> static void fillSend(const Filler& sendFiller, const Obj<Section>& sendSection) {
<a name="line70"> 70: </a> const typename Section::sheaf_type& patches = sendSection->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<typename Section::section_type>& section = p_iter->second;
<a name="line74"> 74: </a> const typename Section::section_type::chart_type& chart = section->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->hasPoint(*c_iter)) {
<a name="line78"> 78: </a> section->updatePoint(*c_iter, sendFiller->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<typename RecvOverlap, typename Sizer, typename Section>
<a name="line84"> 84: </a> static void setupReceive(const Obj<RecvOverlap>& recvOverlap, const Obj<Sizer>& recvSizer, const Obj<Section>& recvSection) {
<a name="line85"> 85: </a> // Create section
<a name="line86"> 86: </a> const Obj<typename RecvOverlap::traits::capSequence> ranks = recvOverlap->cap();
<a name="line88"> 88: </a> recvSection->clear();
<a name="line89"> 89: </a> <font color="#4169E1">for</font>(typename RecvOverlap::traits::capSequence::iterator r_iter = ranks->begin(); r_iter != ranks->end(); ++r_iter) {
<a name="line90"> 90: </a> const Obj<typename RecvOverlap::supportSequence>& points = recvOverlap->support(*r_iter);
<a name="line91"> 91: </a> const Obj<typename Section::section_type>& section = recvSection->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->begin(); p_iter != points->end(); ++p_iter) {
<a name="line95"> 95: </a> const typename dsieve_type::point_type& point = p_iter.color();
<a name="line97"> 97: </a> section->setFiberDimension(point, 1);
<a name="line98"> 98: </a> }
<a name="line99"> 99: </a> }
<a name="line100">100: </a> recvSection->construct(recvSizer);
<a name="line101">101: </a> recvSection->allocate();
<a name="line102">102: </a> recvSection->constructCommunication(Section::RECEIVE);
<a name="line103">103: </a> };
<a name="line104">104: </a> template<typename SendOverlap, typename RecvOverlap, typename SizerFiller, typename Filler, typename SendSection, typename RecvSection>
<a name="line105">105: </a> static void completeSection(const Obj<SendOverlap>& sendOverlap, const Obj<RecvOverlap>& recvOverlap, const Obj<SizerFiller>& sizerFiller, const Filler& filler, const Obj<SendSection>& sendSection, const Obj<RecvSection>& recvSection) {
<a name="line106">106: </a> <font color="#4169E1">typedef</font> typename alloc_type::template rebind<int>::other int_alloc_type;
<a name="line107">107: </a> <font color="#4169E1">typedef</font> typename ALE::Field<SendOverlap, int, ALE::Section<point_type, int, int_alloc_type> > send_sizer_type;
<a name="line108">108: </a> <font color="#4169E1">typedef</font> typename ALE::Field<RecvOverlap, int, ALE::Section<point_type, int, int_alloc_type> > recv_sizer_type;
<a name="line109">109: </a> <font color="#4169E1">typedef</font> typename ALE::Field<SendOverlap, int, ALE::ConstantSection<point_type, int> > constant_send_sizer;
<a name="line110">110: </a> <font color="#4169E1">typedef</font> typename ALE::Field<RecvOverlap, int, ALE::ConstantSection<point_type, int> > constant_recv_sizer;
<a name="line111">111: </a> Obj<send_sizer_type> sendSizer = new send_sizer_type(sendSection->comm(), sendSection->debug());
<a name="line112">112: </a> Obj<recv_sizer_type> recvSizer = new recv_sizer_type(recvSection->comm(), sendSizer->getTag(), recvSection->debug());
<a name="line113">113: </a> Obj<constant_send_sizer> constSendSizer = new constant_send_sizer(sendSection->comm(), sendSection->debug());
<a name="line114">114: </a> Obj<constant_recv_sizer> constRecvSizer = new constant_recv_sizer(recvSection->comm(), recvSection->debug());
<a name="line115">115: </a> Obj<topology_type> sendChart = completion::createSendTopology(sendOverlap);
<a name="line116">116: </a> Obj<topology_type> recvChart = completion::createRecvTopology(recvOverlap);
<a name="line118">118: </a> // 1) Create the sizer sections
<a name="line119">119: </a> constSendSizer->setTopology(sendChart);
<a name="line120">120: </a> const typename topology_type::sheaf_type& sendRanks = sendChart->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->first;
<a name="line123">123: </a> const int one = 1;
<a name="line124">124: </a> constSendSizer->getSection(rank)->updatePoint(*r_iter->second->base()->begin(), &one);
<a name="line125">125: </a> }
<a name="line126">126: </a> constRecvSizer->setTopology(recvChart);
<a name="line127">127: </a> const typename topology_type::sheaf_type& recvRanks = recvChart->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->first;
<a name="line130">130: </a> const int one = 1;
<a name="line131">131: </a> constRecvSizer->getSection(rank)->updatePoint(*r_iter->second->base()->begin(), &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->debug()) {sendSizer->view(<font color="#666666">"Send Sizer in Completion"</font>, MPI_COMM_SELF);}
<a name="line138">138: </a> sendSizer->startCommunication();
<a name="line139">139: </a> recvSizer->startCommunication();
<a name="line140">140: </a> sendSizer->endCommunication();
<a name="line141">141: </a> recvSizer->endCommunication();
<a name="line142">142: </a> <font color="#4169E1">if</font> (recvSizer->debug()) {recvSizer->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->debug()) {sendSection->view(<font color="#666666">"Send Section in Completion"</font>, MPI_COMM_SELF);}
<a name="line150">150: </a> sendSection->startCommunication();
<a name="line151">151: </a> recvSection->startCommunication();
<a name="line152">152: </a> sendSection->endCommunication();
<a name="line153">153: </a> recvSection->endCommunication();
<a name="line154">154: </a> <font color="#4169E1">if</font> (recvSection->debug()) {recvSection->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>
|