diff options
| -rw-r--r-- | credit.txt | 5 | ||||
| -rw-r--r-- | fluid.gpr | 81 | ||||
| -rw-r--r-- | readme.md | 33 | ||||
| -rw-r--r-- | readme.txt | 24 | ||||
| -rw-r--r-- | src/ansi_terminal.adb | 15 | ||||
| -rw-r--r-- | src/ansi_terminal.ads | 9 | ||||
| -rw-r--r-- | src/datatypes.adb | 8 | ||||
| -rw-r--r-- | src/datatypes.ads | 9 | ||||
| -rw-r--r-- | src/fluid_simulator.adb | 37 | 
9 files changed, 173 insertions, 48 deletions
diff --git a/credit.txt b/credit.txt deleted file mode 100644 index b5a6194..0000000 --- a/credit.txt +++ /dev/null @@ -1,5 +0,0 @@ - -This project was written and programmed by Jedidiah Barber. - -See http://jedbarber.id.au/ for other details. - @@ -1,20 +1,93 @@ +  project Fluid is +      for Languages use ("Ada"); -    for Source_Dirs use ("src/**"); -    for Object_Dir use "obj"; -    for Exec_Dir use "bin"; +    for Source_Dirs use ("src"); +    for Object_Dir  use "obj"; +    for Exec_Dir    use "bin"; +      for Main use ("fluid_simulator.adb"); + +    type Build_Kind is ("release", "debug"); + +    Ver : Build_Kind := external ("build", "release"); + +      package Builder is          for Executable ("fluid_simulator.adb") use "fluid"; + +        for Default_Switches ("Ada") use ("-j4", "-m"); +        for Global_Compilation_Switches ("Ada") use ("-shared"); + +        case Ver is +        when "release" => +            null; +        when "debug" => +            for Default_Switches ("Ada") use Builder'Default_Switches ("Ada") & "-g"; +        end case;      end Builder; + +    Ada_Common := +       ("-gnaty" +        & "4"     --  indentation +        & "a"     --  attribute casing +        & "A"     --  array attribute indices +        & "b"     --  blanks at end of lines +        & "c"     --  two space comments +        & "e"     --  end/exit labels +        & "f"     --  no form feeds or vertical tabs +        & "h"     --  no horizontal tabs +        & "i"     --  if/then layout +        & "k"     --  keyword casing +        & "l"     --  reference manual layout +        & "M100"  --  max line length +        & "n"     --  package Standard casing +        & "p"     --  pragma casing +        & "r"     --  identifier casing +        & "t",    --  token separation +        "-gnatw" +        & "a"     --  various warning modes +        & "F"     --  don't check for unreferenced formal parameters +        & "J"     --  don't check for obsolescent feature use +        & "U");   --  don't check for unused entities +      package Compiler is -        for Default_Switches("Ada") use ("-gnaty4aAbcefhiklM100nprt"); +        case Ver is +        when "release" => +            for Default_Switches ("Ada") use Ada_Common & "-O3" & "-gnatn"; +        when "debug" => +            for Default_Switches ("Ada") use Ada_Common & "-O0" & "-gnata" & "-gnato" & "-g"; +        end case;      end Compiler; + +    package Binder is +        for Default_Switches ("Ada") use ("-shared"); + +        case Ver is +        when "release" => +            null; +        when "debug" => +            for Default_Switches ("Ada") use Binder'Default_Switches ("Ada") & "-Es"; +        end case; +    end Binder; + + +    package Linker is +        case Ver is +        when "release" => +            null; +        when "debug" => +            for Default_Switches ("Ada") use ("-g"); +        end case; +    end Linker; + +  end Fluid; + diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..5e20917 --- /dev/null +++ b/readme.md @@ -0,0 +1,33 @@ + +## ASCII Fluid Simulator + +This project duplicates the functionality of an ASCII fluid simulator written +by Yusuke Endoh for an +[IOCCC entry in 2012](https://web.archive.org/web/20190311013952/http://www.ioccc.org/2012/endoh1/). + +While the functionality was duplicated, the original code was too obfuscated to +use as a guide and so this project was essentially written from scratch. + + + +#### Build Instructions + +To compile, use + +`gprbuild fluid.gpr` + +and to run, redirect an input file into the program's standard input + +`bin/fluid < data/column.txt` + +Several such input files can be found in the `data` subdirectory. + + + +#### Credits and Licensing + +Written by Jedidiah Barber. + +Licensed under the Sunset License v1.0. For details see `license.txt`. + + diff --git a/readme.txt b/readme.txt deleted file mode 100644 index 4d09bae..0000000 --- a/readme.txt +++ /dev/null @@ -1,24 +0,0 @@ - -ASCII Fluid Simulator -===================== - - -This project duplicates the functionality of an ASCII fluid simulator written by Yusuke Endoh for -an IOCCC entry in 2012. The original entry can be viewed at - -    https://web.archive.org/web/20190311013952/http://www.ioccc.org/2012/endoh1/ - -While the functionality was duplicated, the original code was too obfuscated to use as a guide and -so this project was essentially written from scratch. - - - -To compile, use - -    gprbuild fluid.gpr - -and to run, redirect an input file into the program's standard input - -    bin/fluid < data/column.txt - - diff --git a/src/ansi_terminal.adb b/src/ansi_terminal.adb index c356c21..8e47d06 100644 --- a/src/ansi_terminal.adb +++ b/src/ansi_terminal.adb @@ -1,10 +1,18 @@ + +--  Programmed by Jedidiah Barber +--  Licensed under the Sunset License v1.0 + +--  See license.txt for further details + +  with      Ada.Characters.Latin_1,      Ada.Strings.Fixed,      Ada.Text_IO; +  package body ANSI_Terminal is      package Latin renames Ada.Characters.Latin_1; @@ -60,8 +68,10 @@ package body ANSI_Terminal is              X, Y  : in Integer)          return String      is -        Average_Density : Natural := Integer (Quantity'Ceiling (Input (X, Y).Density / 4.0)); -        Bit_Index : Positive := Integer (Input (X, Y).Index) + 1; +        Average_Density : constant Natural := +            Integer (Quantity'Ceiling (Input (X, Y).Density / 4.0)); +        Bit_Index : constant Positive := +            Integer (Input (X, Y).Index) + 1;          Choice : Natural;      begin          case Average_Density is @@ -121,3 +131,4 @@ package body ANSI_Terminal is  end ANSI_Terminal; + diff --git a/src/ansi_terminal.ads b/src/ansi_terminal.ads index 027f771..9167f1f 100644 --- a/src/ansi_terminal.ads +++ b/src/ansi_terminal.ads @@ -1,8 +1,16 @@ + +--  Programmed by Jedidiah Barber +--  Licensed under the Sunset License v1.0 + +--  See license.txt for further details + +  with      Datatypes; +  package ANSI_Terminal is      function Clear_Screen @@ -39,3 +47,4 @@ private  end ANSI_Terminal; + diff --git a/src/datatypes.adb b/src/datatypes.adb index 64ff017..30f2d86 100644 --- a/src/datatypes.adb +++ b/src/datatypes.adb @@ -1,4 +1,11 @@ + +--  Programmed by Jedidiah Barber +--  Licensed under the Sunset License v1.0 + +--  See license.txt for further details + +  package body Datatypes is @@ -13,3 +20,4 @@ package body Datatypes is  end Datatypes; + diff --git a/src/datatypes.ads b/src/datatypes.ads index 50d21f9..403bf0e 100644 --- a/src/datatypes.ads +++ b/src/datatypes.ads @@ -1,9 +1,17 @@ + +--  Programmed by Jedidiah Barber +--  Licensed under the Sunset License v1.0 + +--  See license.txt for further details + +  with      Ada.Numerics.Generic_Complex_Types,      Ada.Containers.Vectors; +  package Datatypes is      type Quantity is digits 18; @@ -31,3 +39,4 @@ package Datatypes is  end Datatypes; + diff --git a/src/fluid_simulator.adb b/src/fluid_simulator.adb index 4f33a2f..b13f107 100644 --- a/src/fluid_simulator.adb +++ b/src/fluid_simulator.adb @@ -1,4 +1,11 @@ + +--  Programmed by Jedidiah Barber +--  Licensed under the Sunset License v1.0 + +--  See license.txt for further details + +  with      Datatypes, @@ -14,6 +21,7 @@ use type      Datatypes.Plane.Complex; +  procedure Fluid_Simulator is      package ANSI renames ANSI_Terminal; @@ -87,19 +95,21 @@ procedure Fluid_Simulator is          Rij : Quantity;      begin          for P of Store loop -            P.Acceleration := Gravity_Factor; -            for Q of Store loop -                Displacement := P.Place - Q.Place; -                Rij := Plane.Modulus (Displacement); -                if Rij < Particle_Radius then -                    Pressure := (P.Density + Q.Density - 2.0 * P0) * -                        Pressure_Factor * Displacement; -                    Viscosity := (P.Velocity - Q.Velocity) * Viscosity_Factor; -                    P.Acceleration := P.Acceleration + -                        Plane.Compose_From_Cartesian (1.0 - Rij / Particle_Radius) / -                        P.Density * (Pressure - Viscosity); -                end if; -            end loop; +            if not P.Solid then +                P.Acceleration := Gravity_Factor; +                for Q of Store loop +                    Displacement := P.Place - Q.Place; +                    Rij := Plane.Modulus (Displacement); +                    if Rij < Particle_Radius then +                        Pressure := (P.Density + Q.Density - 2.0 * P0) * +                            Pressure_Factor * Displacement; +                        Viscosity := (P.Velocity - Q.Velocity) * Viscosity_Factor; +                        P.Acceleration := P.Acceleration + +                            Plane.Compose_From_Cartesian (1.0 - Rij / Particle_Radius) / +                            P.Density * (Pressure - Viscosity); +                    end if; +                end loop; +            end if;          end loop;      end Calculate_Interaction; @@ -150,3 +160,4 @@ begin  end Fluid_Simulator; +  | 
