00001 #ifndef GRAL_GB_COMPLEX3D_CONSTRUCT_GRID_C
00002 #define GRAL_GB_COMPLEX3D_CONSTRUCT_GRID_C
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00021 #include "Gral/Grids/Complex3D/construct-grid.h"
00022
00023 #include "Gral/Grids/Complex2D/construct.h"
00024 #include "Gral/Grids/Complex2D/grid-functions.h"
00025
00026 #include "Gral/Base/grid-morphism.h"
00027
00028 #include "Container/bijective-mapping.h"
00029
00030 namespace GrAL {
00031
00032 template<class G_SRC, class VCORR, class CCORR>
00033 void ConstructGrid0(Complex3D & G_dest,
00034 G_SRC const& G_src,
00035 VCORR & v_corr,
00036 CCORR & c_corr)
00037 {
00038
00039 G_dest.clear();
00040
00041 typedef grid_types<Complex3D> gt;
00042 typedef grid_types<G_SRC> sgt;
00043 typedef gt::archetype_type dst_archetype;
00044 typedef typename sgt::archetype_type src_archetype;
00045 typedef gt::archetype_handle src_arch_handle;
00046 typedef typename sgt::archetype_handle dst_arch_handle;
00047
00048
00049 for(typename sgt::VertexIterator v_src(G_src); ! v_src.IsDone(); ++v_src) {
00050 v_corr[v_src.handle()] = G_dest.add_vertex();
00051 }
00052
00053
00054
00055 typedef vertex_morphism<src_archetype, dst_archetype> arch_morphism;
00056 ::std::vector<arch_morphism> morphism;
00057 bijective_mapping<src_arch_handle, dst_arch_handle> arch_corr;
00058 typename sgt::archetype_iterator arch_src = G_src.BeginArchetype();
00059 for(; arch_src != G_src.EndArchetype() ; ++arch_src) {
00060 dst_arch_handle a_dst = G_dest.add_archetype();
00061 src_arch_handle a_src = G_src.handle(arch_src);
00062 arch_corr[a_src] = a_dst;
00063 morphism.push_back(arch_morphism(*arch_src,G_dest.Archetype(a_dst)));
00064
00065 ConstructGrid0(G_dest.Archetype(a_dst),
00066 G_src .Archetype(a_src),
00067 morphism.back());
00068 }
00069
00070
00071
00072 for(typename sgt::CellIterator c_src(G_src); ! c_src.IsDone(); ++c_src) {
00073 src_arch_handle a_src = G_src.archetype_of((*c_src).handle());
00074 dst_arch_handle a_dst = arch_corr(a_src);
00075
00076 gt::cell_handle c = G_dest.add_cell(a_dst);
00077 c_corr[(*c_src).handle()] = c;
00078
00079
00080 typename grid_types<src_archetype>::VertexIterator
00081 lv(G_src.Archetype(a_src).FirstVertex());
00082 Complex3D::cell_vertex_incidence_map cv_incidence(G_dest,c);
00083 for(typename sgt::VertexOnCellIterator vc_src(*c_src);
00084 !vc_src.IsDone(); ++lv, ++vc_src) {
00085 cv_incidence[morphism[a_src](lv.handle())] = v_corr(vc_src.handle());
00086
00087 }
00088 }
00089 G_dest.calculate_dependent();
00090
00091 }
00092
00093 }
00094
00095 #endif
00096