[BACK]Return to triangulations_and_subdivisions.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Dynlift

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/triangulations_and_subdivisions.adb, Revision 1.1

1.1     ! maekawa     1: with Standard_Integer_VecVecs;           use Standard_Integer_VecVecs;
        !             2: with Lists_of_Integer_Vectors;           use Lists_of_Integer_Vectors;
        !             3: with Transforming_Integer_Vector_Lists;  use Transforming_Integer_Vector_Lists;
        !             4: with Arrays_of_Integer_Vector_Lists;     use Arrays_of_Integer_Vector_Lists;
        !             5: with Dynamic_Triangulations;             use Dynamic_Triangulations;
        !             6: with Unfolding_Subdivisions;             use Unfolding_Subdivisions;
        !             7:
        !             8: package body Triangulations_and_Subdivisions is
        !             9:
        !            10: -- REFINEMENT ROUTINES :
        !            11:
        !            12:   procedure Refine ( n : in natural; mic : in out Mixed_Cell ) is
        !            13:
        !            14:   -- NOTE :
        !            15:   --   Dynamic lifting will be applied with standard settings,
        !            16:   --   under the assumption that there are only few points in the cell.
        !            17:
        !            18:     support : List := Reduce(mic.pts(1),n+1);
        !            19:     t : Triangulation;
        !            20:     lifted,lifted_last : List;
        !            21:
        !            22:   begin
        !            23:     Dynamic_Lifting(support,false,true,0,lifted,lifted_last,t);
        !            24:     mic.sub := new Mixed_Subdivision'(Deep_Create(n,t));
        !            25:     Deep_Clear(lifted); Clear(t);
        !            26:       -- pity that Shallow_Clear(t) is not yet possible ...
        !            27:   end Refine;
        !            28:
        !            29:   procedure Refine ( n : in natural; mixsub : in out Mixed_Subdivision ) is
        !            30:
        !            31:   -- NOTE :
        !            32:   --   Refines the mixed subdivision, under the safe assumption that
        !            33:   --   there is only one support set to deal with.
        !            34:
        !            35:     res,res_last : Mixed_Subdivision;
        !            36:     tmp : Mixed_Subdivision := mixsub;
        !            37:     mic : Mixed_Cell;
        !            38:
        !            39:   begin
        !            40:     while not Is_Null(tmp) loop
        !            41:       mic := Head_Of(tmp);
        !            42:       if Length_Of(mic.pts(1)) > n+1
        !            43:        then Refine(n,mic);
        !            44:       end if;
        !            45:       Append(res,res_last,mic);
        !            46:       tmp := Tail_Of(tmp);
        !            47:     end loop;
        !            48:     mixsub := res;
        !            49:   end Refine;
        !            50:
        !            51: -- TARGET PROCEDURES :
        !            52:
        !            53:   function Deep_Create ( n : natural; s : Simplex ) return Mixed_Cell is
        !            54:
        !            55:     res : Mixed_Cell;
        !            56:     ver : constant VecVec := Vertices(s);
        !            57:
        !            58:   begin
        !            59:     res.nor := new Standard_Integer_Vectors.Vector'(Normal(s));
        !            60:     res.pts := new Array_of_Lists(1..1);
        !            61:     res.pts(1) := Deep_Create(ver);
        !            62:     return res;
        !            63:   end Deep_Create;
        !            64:
        !            65:   function Shallow_Create ( n : natural; s : Simplex ) return Mixed_Cell is
        !            66:
        !            67:     res : Mixed_Cell;
        !            68:     ver : constant VecVec := Vertices(s);
        !            69:
        !            70:   begin
        !            71:     res.nor := new Standard_Integer_Vectors.Vector'(Normal(s));
        !            72:     res.pts := new Array_of_Lists(1..1);
        !            73:     res.pts(1) := Shallow_Create(ver);
        !            74:     return res;
        !            75:   end Shallow_Create;
        !            76:
        !            77:   function Deep_Create ( n : natural; t : Triangulation )
        !            78:                        return Mixed_Subdivision is
        !            79:
        !            80:     res,res_last : Mixed_Subdivision;
        !            81:     tmp : Triangulation := t;
        !            82:
        !            83:   begin
        !            84:     while not Is_Null(tmp) loop
        !            85:       Append(res,res_last,Deep_Create(n,Head_Of(tmp)));
        !            86:       tmp := Tail_Of(tmp);
        !            87:     end loop;
        !            88:     return res;
        !            89:   end Deep_Create;
        !            90:
        !            91:   function Shallow_Create ( n : natural; t : Triangulation )
        !            92:                           return Mixed_Subdivision is
        !            93:
        !            94:     res,res_last : Mixed_Subdivision;
        !            95:     tmp : Triangulation := t;
        !            96:
        !            97:   begin
        !            98:     while not Is_Null(tmp) loop
        !            99:       Append(res,res_last,Shallow_Create(n,Head_Of(tmp)));
        !           100:       tmp := Tail_Of(tmp);
        !           101:     end loop;
        !           102:     return res;
        !           103:   end Shallow_Create;
        !           104:
        !           105:   function Deep_Create ( n : natural; flatnor : Vector; t : Triangulation )
        !           106:                        return Mixed_Subdivision is
        !           107:
        !           108:     res,res_last : Mixed_Subdivision;
        !           109:     tmp : Triangulation := t;
        !           110:     s : Simplex;
        !           111:
        !           112:   begin
        !           113:     while not Is_Null(tmp) loop
        !           114:       s := Head_Of(tmp);
        !           115:       exit when (flatnor = Normal(s));
        !           116:       Append(res,res_last,Deep_Create(n,s));
        !           117:       tmp := Tail_Of(tmp);
        !           118:     end loop;
        !           119:     res := Merge(res);             -- merge cells with same inner normal
        !           120:     Refine(n,res);                 -- refine the non-fine cells
        !           121:     return res;
        !           122:   end Deep_Create;
        !           123:
        !           124:   function Shallow_Create ( n : natural; flatnor : Vector; t : Triangulation )
        !           125:                           return Mixed_Subdivision is
        !           126:
        !           127:     res,res_last : Mixed_Subdivision;
        !           128:     tmp : Triangulation := t;
        !           129:     s : Simplex;
        !           130:
        !           131:   begin
        !           132:     while not Is_Null(tmp) loop
        !           133:       s := Head_Of(tmp);
        !           134:       exit when (flatnor = Normal(s));
        !           135:       Append(res,res_last,Shallow_Create(n,s));
        !           136:       tmp := Tail_Of(tmp);
        !           137:     end loop;
        !           138:     res := Merge(res);             -- merge cells with same inner normal
        !           139:     Refine(n,res);                 -- refine the non-fine cells
        !           140:     return res;
        !           141:   end Shallow_Create;
        !           142:
        !           143:   function Non_Flat_Deep_Create ( n : natural; t : Triangulation )
        !           144:                                 return Mixed_Subdivision is
        !           145:
        !           146:     flatnor : Vector(1..n+1) := (1..n+1 => 0);
        !           147:
        !           148:   begin
        !           149:     flatnor(n+1) := 1;
        !           150:     return Deep_Create(n,flatnor,t);
        !           151:   end Non_Flat_Deep_Create;
        !           152:
        !           153:   function Non_Flat_Shallow_Create ( n : natural; t : Triangulation )
        !           154:                                    return Mixed_Subdivision is
        !           155:
        !           156:     flatnor : Vector(1..n+1) := (1..n+1 => 0);
        !           157:
        !           158:   begin
        !           159:     flatnor(n+1) := 1;
        !           160:     return Shallow_Create(n,flatnor,t);
        !           161:   end Non_Flat_Shallow_Create;
        !           162:
        !           163:   function Deep_Create ( n : natural; mixsub : Mixed_Subdivision )
        !           164:                        return Triangulation is
        !           165:
        !           166:     res : Triangulation;
        !           167:     tmp : Mixed_Subdivision := mixsub;
        !           168:     mic : Mixed_Cell;
        !           169:
        !           170:   begin
        !           171:     while not Is_Null(tmp) loop
        !           172:       mic := Head_Of(tmp);
        !           173:       declare
        !           174:         v : VecVec(0..n);
        !           175:         tmppts : List := mic.pts(mic.pts'first);
        !           176:         s : Simplex;
        !           177:       begin
        !           178:         for i in v'range loop
        !           179:           v(i) := new Standard_Integer_Vectors.Vector'(Head_Of(tmppts).all);
        !           180:           tmppts := Tail_Of(tmppts);
        !           181:           exit when Is_Null(tmppts);
        !           182:         end loop;
        !           183:         s := Create(v);
        !           184:         Construct(s,res);
        !           185:       end;
        !           186:       tmp := Tail_Of(tmp);
        !           187:     end loop;
        !           188:     Connect(res);
        !           189:     return res;
        !           190:   end Deep_Create;
        !           191:
        !           192:   function Shallow_Create ( n : natural; mixsub : Mixed_Subdivision )
        !           193:                           return Triangulation is
        !           194:
        !           195:     res : Triangulation;
        !           196:     tmp : Mixed_Subdivision := mixsub;
        !           197:     mic : Mixed_Cell;
        !           198:
        !           199:   begin
        !           200:     while not Is_Null(tmp) loop
        !           201:       mic := Head_Of(tmp);
        !           202:       declare
        !           203:         v : VecVec(0..n);
        !           204:         tmppts : List := mic.pts(mic.pts'first);
        !           205:         s : Simplex;
        !           206:       begin
        !           207:         for i in v'range loop
        !           208:           v(i) := Head_Of(tmppts);
        !           209:           tmppts := Tail_Of(tmppts);
        !           210:           exit when Is_Null(tmppts);
        !           211:         end loop;
        !           212:         s := Create(v);
        !           213:         Construct(s,res);
        !           214:       end;
        !           215:       tmp := Tail_Of(tmp);
        !           216:     end loop;
        !           217:     Connect(res);
        !           218:     return res;
        !           219:   end Shallow_Create;
        !           220:
        !           221: end Triangulations_and_Subdivisions;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>