eulim 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a4ff2d9a51f17fe9a667eb929f4b4d40b17089a
4
- data.tar.gz: b99d998f6b941096cc7f5dbd0fe5cc66ac3e6140
3
+ metadata.gz: f2c5e5faafacb78e59d9e9572cef6714bb5c9c83
4
+ data.tar.gz: 5739125159e28e055d75f082ec478db3d60a7626
5
5
  SHA512:
6
- metadata.gz: 3e6d1107d1d3f100b2a5202e36b8121417d01294e6c58e64cfa7473acbb04218e880bb4728dede64569a25ff6dd4fa252f40fef46cfbb5b92f6d265c40207780
7
- data.tar.gz: a89714402c6448c539fd954a9b34f1931beb92aa9060cef227b4c4203ea5a1a9a69924ec8ef7b7898ea316adb3a95b16469660434ae161171455dbec6b8ab6da
6
+ metadata.gz: 204895443dd48eb6d9ae00133c75fdf87a636af36419fba41bc67ca01fd5460483208e586536ab47b5de11381fca8de68ccf348a9b1efcc788d099e21a666038
7
+ data.tar.gz: 579e0330b4f4caf82f28abde993aca8fd311fd70627c6062bbd3d1fa9bbe64a333ade55d5125482d513374965e2e6c876c4068ac2a295baa89032b8380f1a074
data/README.md CHANGED
@@ -43,8 +43,9 @@ Or install it yourself as:
43
43
 
44
44
  ### Reaction
45
45
 
46
- * attributes: equation, is_valid, is_balanced, species
47
- * methods: new("Put your reaction string here") #For eg: ('2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)')
46
+ * attributes: equation, is_valid, is_balanced, species, balanced_eqn
47
+ * methods: new(equation: "Put your reaction string here", rate_equation: "r_{CaCo3} = k[CaO]")
48
+ * For eg: (equation: '2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)', rate_equation: "rNa = k[HCl]")
48
49
 
49
50
  ## Usage
50
51
  ```bash
@@ -60,19 +61,22 @@ $ Eulim::Chemistry::Element.get_by_name "helium" # or "Helium"
60
61
  $ Eulim::Chemistry::Compound.new("CaCO3")
61
62
  => #<Eulim::Chemistry::Compound:0x00000002a65340 @formula="CaCO3", @constituents={"Ca"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c805a8 @name="Calcium", @symbol="Ca", @atomic_number=20, @atomic_mass=#<Unitwise::Measurement value=40.078 unit=u>>, :atom_count=>1}, "C"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c8f6e8 @name="Carbon", @symbol="C", @atomic_number=6, @atomic_mass=#<Unitwise::Measurement value=12.0107 unit=u>>, :atom_count=>1}, "O"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c8dc30 @name="Oxygen", @symbol="O", @atomic_number=8, @atomic_mass=#<Unitwise::Measurement value=15.9996 unit=u>>, :atom_count=>3}}, @molecular_mass=#<Unitwise::Measurement value=100.0875 unit=u>>
62
63
 
63
- $ Eulim::Chemistry::Reaction.new('2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)').equation
64
+ $Eulim::Chemistry::Reaction.new(equation: 'KMnO4 + HCl >> KCl + MnCl2 + H2O + Cl2').balanced_eqn
65
+ => "2KMnO4 + 16HCl >> 2KCl + 2MnCl2 + 8H2O + 5Cl2"
66
+
67
+ $ Eulim::Chemistry::Reaction.new(equation: '2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)').equation
64
68
  => "2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)"
65
69
 
66
- $ Eulim::Chemistry::Reaction.new('2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)').is_valid
70
+ $ Eulim::Chemistry::Reaction.new(equation: '2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)').is_valid
67
71
  => true
68
72
 
69
- $ Eulim::Chemistry::Reaction.new('2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)').is_balanced
73
+ $ Eulim::Chemistry::Reaction.new(equation: '2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)').is_balanced
70
74
  => true
71
75
 
72
- $ Eulim::Chemistry::Reaction.new('2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)').species
76
+ $ Eulim::Chemistry::Reaction.new(equation: '2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)').species
73
77
  => {:reactants=>{"Na"=>{:compound=>#<Eulim::Chemistry::Compound:0x00000002ca6910 @formula="Na", @constituents={"Na"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c88e10 @name="Sodium", @symbol="Na", @atomic_number=11, @atomic_mass=#<Unitwise::Measurement value=22.9897 unit=u>>, :atom_count=>1}}, @molecular_mass=#<Unitwise::Measurement value=22.9897 unit=u>>, :stoichiometry=>2, :state=>"solid"}, "HCl"=>{:compound=>#<Eulim::Chemistry::Compound:0x00000002c90ed0 @formula="HCl", @constituents={"H"=>{:element=>#<Eulim::Chemistry::Element:0x000000025e5ab8 @name="Hydrogen", @symbol="H", @atomic_number=1, @atomic_mass=#<Unitwise::Measurement value=1.0079 unit=u>>, :atom_count=>1}, "Cl"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c82c90 @name="Chlorine", @symbol="Cl", @atomic_number=17, @atomic_mass=#<Unitwise::Measurement value=35.453 unit=u>>, :atom_count=>1}}, @molecular_mass=#<Unitwise::Measurement value=36.4609 unit=u>>, :stoichiometry=>2, :state=>"aqueous"}}, :products=>{"NaCl"=>{:compound=>#<Eulim::Chemistry::Compound:0x00000002c73bf0 @formula="NaCl", @constituents={"Na"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c88e10 @name="Sodium", @symbol="Na", @atomic_number=11, @atomic_mass=#<Unitwise::Measurement value=22.9897 unit=u>>, :atom_count=>1}, "Cl"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c82c90 @name="Chlorine", @symbol="Cl", @atomic_number=17, @atomic_mass=#<Unitwise::Measurement value=35.453 unit=u>>, :atom_count=>1}}, @molecular_mass=#<Unitwise::Measurement value=58.4427 unit=u>>, :stoichiometry=>2, :state=>"aqueous"}, "H2"=>{:compound=>#<Eulim::Chemistry::Compound:0x00000002c34180 @formula="H2", @constituents={"H"=>{:element=>#<Eulim::Chemistry::Element:0x000000025e5ab8 @name="Hydrogen", @symbol="H", @atomic_number=1, @atomic_mass=#<Unitwise::Measurement value=1.0079 unit=u>>, :atom_count=>2}}, @molecular_mass=#<Unitwise::Measurement value=2.0158 unit=u>>, :stoichiometry=>1, :state=>"gaseous"}}}
74
78
 
75
- $ Eulim::Chemistry::Reaction.new('2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)')
79
+ $ Eulim::Chemistry::Reaction.new(equation: '2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)')
76
80
  => #<Eulim::Chemistry::Reaction:0x00000002ce22f8 @equation="2Na(s) + 2HCl(aq) >> 2NaCl(aq) + H2(g)", @species={:reactants=>{"Na"=>{:compound=>#<Eulim::Chemistry::Compound:0x00000002ce1d80 @formula="Na", @constituents={"Na"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c88e10 @name="Sodium", @symbol="Na", @atomic_number=11, @atomic_mass=#<Unitwise::Measurement value=22.9897 unit=u>>, :atom_count=>1}}, @molecular_mass=#<Unitwise::Measurement value=22.9897 unit=u>>, :stoichiometry=>2, :state=>"solid"}, "HCl"=>{:compound=>#<Eulim::Chemistry::Compound:0x00000002cabdc0 @formula="HCl", @constituents={"H"=>{:element=>#<Eulim::Chemistry::Element:0x000000025e5ab8 @name="Hydrogen", @symbol="H", @atomic_number=1, @atomic_mass=#<Unitwise::Measurement value=1.0079 unit=u>>, :atom_count=>1}, "Cl"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c82c90 @name="Chlorine", @symbol="Cl", @atomic_number=17, @atomic_mass=#<Unitwise::Measurement value=35.453 unit=u>>, :atom_count=>1}}, @molecular_mass=#<Unitwise::Measurement value=36.4609 unit=u>>, :stoichiometry=>2, :state=>"aqueous"}}, :products=>{"NaCl"=>{:compound=>#<Eulim::Chemistry::Compound:0x00000002c8cda8 @formula="NaCl", @constituents={"Na"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c88e10 @name="Sodium", @symbol="Na", @atomic_number=11, @atomic_mass=#<Unitwise::Measurement value=22.9897 unit=u>>, :atom_count=>1}, "Cl"=>{:element=>#<Eulim::Chemistry::Element:0x00000002c82c90 @name="Chlorine", @symbol="Cl", @atomic_number=17, @atomic_mass=#<Unitwise::Measurement value=35.453 unit=u>>, :atom_count=>1}}, @molecular_mass=#<Unitwise::Measurement value=58.4427 unit=u>>, :stoichiometry=>2, :state=>"aqueous"},"H2"=>{:compound=>#<Eulim::Chemistry::Compound:0x00000002c6f938 @formula="H2", @constituents={"H"=>{:element=>#<Eulim::Chemistry::Element:0x000000025e5ab8 @name="Hydrogen", @symbol="H", @atomic_number=1, @atomic_mass=#<Unitwise::Measurement value=1.0079 unit=u>>, :atom_count=>2}}, @molecular_mass=#<Unitwise::Measurement value=2.0158 unit=u>>, :stoichiometry=>1, :state=>"gaseous"}}}, @is_valid=true, @is_balanced=true>
77
81
  ```
78
82
  ## Development
data/eulim.gemspec CHANGED
@@ -38,7 +38,7 @@ Gem::Specification.new do |spec|
38
38
  spec.add_development_dependency 'rake', '~> 10.0'
39
39
  spec.add_development_dependency 'rspec', '~> 3.0'
40
40
  spec.add_development_dependency 'rubocop', '~>0.49.1'
41
-
42
- spec.add_dependency 'require_all', '~> 1.4.0'
43
- spec.add_dependency 'unitwise', '~> 2.1.0'
41
+ spec.add_dependency 'unitwise', '~>2.1.0'
42
+ spec.add_dependency 'rubypython', '~> 0.6.4'
43
+ spec.add_dependency 'require_all', '~> 1.4.0'
44
44
  end
data/lib/eulim.rb CHANGED
@@ -11,10 +11,11 @@ Ch = Eulim::Chemistry
11
11
  Elem = Ch::Element
12
12
  Comp = Ch::Compound
13
13
  Rxn = Ch::Reaction
14
- Subs = Ch::Substance
14
+ Sub = Ch::Substance
15
15
 
16
16
  Cl = Eulim::Chemical
17
17
  Rcts = Cl::Reactors
18
+ Rct = Rcts::Reactor
18
19
  Br = Rcts::Batch
19
20
  Cstr = Rcts::CSTR
20
21
  Pfr = Rcts::PFR
@@ -7,6 +7,18 @@ module Eulim
7
7
  super args
8
8
  end
9
9
 
10
+ def find_volume
11
+ # accumulation is zero
12
+ compound_formula = @reaction.rate_equation.split(' ').first.split('r').last
13
+ ci = @input[:substance].species[compound_formula]
14
+ co = @output[:substance].species[compound_formula]
15
+ input = @input[:quantity] * ci[:weight_percent] /
16
+ (100 * ci[:compound].molar_mass)
17
+ output = @output[:quantity] * co[:weight_percent] /
18
+ (100 * co[:compound].molar_mass)
19
+ x = (input - output) / input
20
+ end
21
+
10
22
  def self.humanized_name
11
23
  'Continuous stirred-tank reactor'
12
24
  end
@@ -3,12 +3,36 @@ module Eulim
3
3
  module Reactors
4
4
  # This is the base class for the diff kinds of reactors
5
5
  class Reactor
6
- attr_accessor :system, :volume, :input, :output, :conversion
6
+ attr_reader :system, :volume, :input, :output, :reaction
7
+
8
+ # ATTRS = [:system, :volume, :input, :output, :rate_equation]
7
9
 
8
10
  def initialize(args = {})
9
- @volume = volume_if_valid(args[:volume]) if args[:volume]
10
- @system = args[:system] || :open
11
- @input = input_if_valid(args[:input]) if args[:input]
11
+ self.system = args[:system]
12
+ self.volume = args[:volume] if args[:volume]
13
+ self.input = args[:input] if args[:input]
14
+ self.output = args[:output] if args[:output]
15
+ self.reaction = args[:reaction] if args[:reaction]
16
+ end
17
+
18
+ def system=(sys)
19
+ @system = sys || :open
20
+ end
21
+
22
+ def volume=(vol)
23
+ @volume = volume_if_valid vol
24
+ end
25
+
26
+ def input=(inp)
27
+ @input = feed_if_valid inp
28
+ end
29
+
30
+ def output=(out)
31
+ @output = feed_if_valid out
32
+ end
33
+
34
+ def reaction=(rxn)
35
+ @reaction = reaction_if_valid rxn
12
36
  end
13
37
 
14
38
  private
@@ -23,20 +47,30 @@ module Eulim
23
47
  raise ArgumentError, 'Invalid volume unit'
24
48
  end
25
49
 
26
- def input_if_valid(inp)
27
- raise ArgumentError, 'Invalid input substance' if inp[:substance].class != Subs
50
+ def feed_if_valid(f)
51
+ raise ArgumentError, 'Invalid substance' if f[:substance].class != Sub
28
52
  begin
29
- inp[:quantity] = Unitwise inp[:quantity]
53
+ f[:quantity] = Unitwise f[:quantity]
30
54
  rescue
31
- raise ArgumentError, 'Invalid input quantity'
55
+ raise ArgumentError, 'Invalid quantity'
32
56
  end
33
- dim = inp[:quantity].composition.to_h
34
- return inp if valid_input_quantity_compositions.include? dim
35
- raise ArgumentError, 'Invalid input quantity unit'
57
+ dim = f[:quantity].composition.to_h
58
+ return f if valid_feed_quantity_dimensions.include? dim
59
+ raise ArgumentError, 'Invalid quantity unit'
60
+ end
61
+
62
+ def valid_feed_quantity_dimensions
63
+ [{ 'M' => 1 }, { 'M' => 1, 'T' => -1 }]
36
64
  end
37
65
 
38
- def valid_input_quantity_compositions
39
- [{ 'M' => 1 }, { 'M' => 1, 'T' => -1 }, {}, { 'T' => -1 }]
66
+ def reaction_if_valid(r)
67
+ # raise ArgumentError, 'Substance not in reaction' if
68
+ # @input && (
69
+ # r.species[:reactants].keys &
70
+ # @input[:substance].species.keys
71
+ # ).empty?
72
+ return r if r.class == Rxn && r.is_valid
73
+ raise ArgumentError, 'Invalid reaction argument'
40
74
  end
41
75
  end
42
76
  end
@@ -8,22 +8,22 @@ module Eulim
8
8
  COMPOUND_REGEXP =
9
9
  /[A-Z][a-z]{0,2}\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d*/
10
10
 
11
- attr_accessor :molecular_mass, :constituents, :formula
11
+ attr_accessor :molecular_mass, :constituents, :formula, :molar_mass
12
12
 
13
13
  def initialize(arg)
14
14
  @formula = arg
15
15
  build_constituents
16
- calculate_molecular_mass
16
+ calculate_mass
17
17
  end
18
18
 
19
19
  private
20
20
 
21
- def calculate_molecular_mass
22
- @molecular_mass = Unitwise(0, 'u')
21
+ def calculate_mass
22
+ @molecular_mass = Unitwise(0.0, 'u')
23
23
  @constituents.each do |_symbol, info|
24
24
  @molecular_mass += info[:element].atomic_mass * info[:atom_count]
25
25
  end
26
- @molecular_mass
26
+ @molar_mass = Unitwise(@molecular_mass.value / 1000.0, 'kg/mol')
27
27
  end
28
28
 
29
29
  def build_constituents
@@ -1,25 +1,42 @@
1
+ require 'matrix'
2
+
1
3
  module Eulim
2
4
  module Chemistry
3
5
  # This class has functionality for reaction
4
6
  # Ex: check for balanced rxn, validity of a rxn
5
7
  class Reaction
6
- attr_accessor :equation, :is_valid, :is_balanced, :species
8
+ attr_accessor :equation, :is_valid, :species, :participants, :balanced_eqn, :rate_equation
7
9
 
8
10
  STATES = {
9
11
  '(s)' => 'solid', '(l)' => 'liquid',
10
12
  '(g)' => 'gaseous', '(aq)' => 'aqueous',
11
- '' => 'liquid'
13
+ '' => ''
12
14
  }.freeze
13
15
 
14
- def initialize(arg)
15
- @equation = arg
16
+ def initialize(args)
17
+ # rate_eqn should be of the form: 'r_{CaO} = k[CaO][CO2]'
18
+ @equation = args[:equation]
16
19
  @species = build_species
17
20
  @is_valid = valid_rxn?
18
- @is_balanced = balanced_rxn?
21
+ p participant_elements
22
+ # @balanced_eqn = balance_rxn
23
+ @rate_equation = validify_rate_eqn args[:rate_equation]
19
24
  end
20
25
 
21
26
  private
22
27
 
28
+ def validify_rate_eqn(rate_eqn)
29
+ if rate_eqn
30
+ rate_eqn.gsub('_{', '')
31
+ .gsub('}', '')
32
+ .gsub('[', ' * c')
33
+ .gsub(']', '')
34
+ else
35
+ specie = @species[:reactants].keys.first
36
+ 'r' + specie + ' = k * c' + specie
37
+ end
38
+ end
39
+
23
40
  def build_species
24
41
  r = {}
25
42
  result = {}
@@ -81,6 +98,61 @@ module Eulim
81
98
  def get_state(specie)
82
99
  specie.match(/\((s|l|g|aq)\)$/).to_s
83
100
  end
101
+
102
+ def participant_elements
103
+ participants = []
104
+ @species[:reactants].keys.each do |r|
105
+ participants << @species[:reactants][r][:compound].constituents.keys
106
+ end
107
+ @participants = participants.flatten.uniq
108
+ end
109
+
110
+ def get_participant_row(parti)
111
+ row = []
112
+ @species.keys.each do |key|
113
+ i = key == :reactants ? 1 : -1
114
+ @species[key].keys.each do |specie|
115
+ if specie.include? parti
116
+ row << @species[key][specie][:compound]
117
+ .constituents[parti][:atom_count] * i
118
+ else
119
+ row << 0
120
+ end
121
+ end
122
+ end
123
+ row
124
+ end
125
+
126
+ def write_matrix
127
+ @matrix = Matrix[]
128
+ @participants.each do |parti|
129
+ @matrix = Matrix.rows(@matrix.to_a << get_participant_row(parti))
130
+ end
131
+ @matrix
132
+ end
133
+
134
+ def balanced_coeff_array
135
+ write_matrix
136
+ null_space_array = @matrix.nullspace_array
137
+ lcm = null_space_array.collect(&:denominator).reduce(1, :lcm)
138
+ null_space_array.collect { |x| (x * lcm).to_i }
139
+ end
140
+
141
+ def balance_rxn
142
+ exp = ''
143
+ i = 0
144
+ bal_coeff = balanced_coeff_array
145
+ @species.keys.each do |key|
146
+ @species[key].keys.each do |comp|
147
+ coeff = bal_coeff[i] == 1 ? ' ' : ' ' + bal_coeff[i].abs.to_s
148
+ state = STATES.key(@species[key][comp][:state])
149
+ exp = exp + coeff + comp + state + ' +'
150
+ i += 1
151
+ end
152
+ exp = key == :reactants ? exp.chomp('+') + '>>' : exp.chomp('+')
153
+ end
154
+ exp.strip
155
+ end
84
156
  end
85
157
  end
86
158
  end
data/lib/eulim/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eulim
2
- VERSION = '0.0.13'.freeze
2
+ VERSION = '0.0.14'.freeze
3
3
  end
data/lib/matrix.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'rubypython'
2
+ # this class is extension of Matrix class offered by ruby
3
+ class Matrix
4
+ def nullspace_as_string
5
+ a = to_a
6
+ RubyPython.start
7
+ main = RubyPython.import('__main__')
8
+ RubyPython::Python.PyRun_SimpleString <<-PYTHON
9
+ from sympy import Matrix
10
+ import numpy as np
11
+ def null_space(a):
12
+ return np.array_str(np.array(Matrix(a).nullspace()))
13
+ PYTHON
14
+ main.null_space(a).rubify
15
+ end
16
+
17
+ def nullspace_array
18
+ nullspace_as_string[2..-3].split(' ').map(&:to_r)
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eulim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Syed Fazil Basheer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-06-30 00:00:00.000000000 Z
12
+ date: 2017-07-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -68,33 +68,47 @@ dependencies:
68
68
  - !ruby/object:Gem::Version
69
69
  version: 0.49.1
70
70
  - !ruby/object:Gem::Dependency
71
- name: require_all
71
+ name: unitwise
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: 1.4.0
76
+ version: 2.1.0
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: 1.4.0
83
+ version: 2.1.0
84
84
  - !ruby/object:Gem::Dependency
85
- name: unitwise
85
+ name: rubypython
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: 2.1.0
90
+ version: 0.6.4
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: 2.1.0
97
+ version: 0.6.4
98
+ - !ruby/object:Gem::Dependency
99
+ name: require_all
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 1.4.0
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 1.4.0
98
112
  description: A gem for scientific data.
99
113
  email:
100
114
  - fazil.basheer@quester.xyz
@@ -133,6 +147,7 @@ files:
133
147
  - lib/eulim/structures/pipe.rb
134
148
  - lib/eulim/structures/structure.rb
135
149
  - lib/eulim/version.rb
150
+ - lib/matrix.rb
136
151
  - lib/string.rb
137
152
  homepage: https://github.com/syedfazilbasheer-quester/eulim-gem
138
153
  licenses: