Class Mesh::CubeMesh
In: mesh.rb
Parent: Object

class for cube mesh

Methods

new   x   y   z  

Attributes

xpos  [RW] 
ypos  [RW] 
zpos  [RW] 

Public Class methods

[Source]

# File mesh.rb, line 548
      def initialize(cube)
         @cube = cube
         # create diffs for face 0, 1, 4 and 5
         # scalefactor between face 2 and 3
         @imax = @cube.if[0].imax
         @jmax = @cube.if[0].jmax
         @kmax = @cube.if[1].jmax
         # diffs for face 0
         @diffx0, @diffy0, @diffz0 = Array.new, Array.new, Array.new
         # diffs for face 5
         @diffx5, @diffy5, @diffz5 = Array.new, Array.new, Array.new
         (0..@imax).each do |idir|
            @diffx0[idir], @diffy0[idir], @diffz0[idir] = Array.new, Array.new, Array.new
            @diffx5[idir], @diffy5[idir], @diffz5[idir] = Array.new, Array.new, Array.new
            (0..@jmax - 1).each do |jdir|
               face0point0 = @cube.if[0].getpointno(idir, jdir)
               face0point1 = @cube.if[0].getpointno(idir, jdir + 1)
               face5point0 = @cube.if[5].getpointno(idir, jdir)
               face5point1 = @cube.if[5].getpointno(idir, jdir + 1)
               @diffx0[idir][jdir] = @cube.if[0].parent.x[0][face0point1] - @cube.if[0].parent.x[0][face0point0]
               @diffy0[idir][jdir] = @cube.if[0].parent.y[0][face0point1] - @cube.if[0].parent.y[0][face0point0]
               @diffz0[idir][jdir] = @cube.if[0].parent.z[0][face0point1] - @cube.if[0].parent.z[0][face0point0]
               @diffx5[idir][jdir] = @cube.if[5].parent.x[0][face5point1] - @cube.if[5].parent.x[0][face5point0]
               @diffy5[idir][jdir] = @cube.if[5].parent.y[0][face5point1] - @cube.if[5].parent.y[0][face5point0]
               @diffz5[idir][jdir] = @cube.if[5].parent.z[0][face5point1] - @cube.if[5].parent.z[0][face5point0]
            end
         end
         (0..@imax).each do |idir|
            @diffx0[idir] = [0.0] + @diffx0[idir]
            @diffy0[idir] = [0.0] + @diffy0[idir]
            @diffz0[idir] = [0.0] + @diffz0[idir]
            @diffx5[idir] = [0.0] + @diffx5[idir]
            @diffy5[idir] = [0.0] + @diffy5[idir]
            @diffz5[idir] = [0.0] + @diffz5[idir]
         end
         # diffs for face 4
         @diffx4, @diffy4, @diffz4 = Array.new, Array.new, Array.new
         # diffs for face 1
         @diffx2, @diffy2, @diffz2 = Array.new, Array.new, Array.new
         (0..@kmax).each do |kdir|
            @diffx4[kdir], @diffy4[kdir], @diffz4[kdir] = Array.new, Array.new, Array.new
            @diffx2[kdir], @diffy2[kdir], @diffz2[kdir] = Array.new, Array.new, Array.new
            (0..@jmax - 1).each do |jdir|
               face4point0 = @cube.if[4].getpointno(jdir, kdir)
               face4point1 = @cube.if[4].getpointno(jdir + 1, kdir)
               face2point0 = @cube.if[2].getpointno(jdir, kdir)
               face2point1 = @cube.if[2].getpointno(jdir + 1, kdir)
               @diffx4[kdir][jdir] = @cube.if[4].parent.x[0][face4point1] - @cube.if[4].parent.x[0][face4point0]
               @diffy4[kdir][jdir] = @cube.if[4].parent.y[0][face4point1] - @cube.if[4].parent.y[0][face4point0]
               @diffz4[kdir][jdir] = @cube.if[4].parent.z[0][face4point1] - @cube.if[4].parent.z[0][face4point0]
               @diffx2[kdir][jdir] = @cube.if[2].parent.x[0][face2point1] - @cube.if[2].parent.x[0][face2point0]
               @diffy2[kdir][jdir] = @cube.if[2].parent.y[0][face2point1] - @cube.if[2].parent.y[0][face2point0]
               @diffz2[kdir][jdir] = @cube.if[2].parent.z[0][face2point1] - @cube.if[2].parent.z[0][face2point0]
            end
         end
         (0..@kmax).each do |kdir|
            @diffx4[kdir] = [0.0] + @diffx4[kdir]
            @diffy4[kdir] = [0.0] + @diffy4[kdir]
            @diffz4[kdir] = [0.0] + @diffz4[kdir]
            @diffx2[kdir] = [0.0] + @diffx2[kdir]
            @diffy2[kdir] = [0.0] + @diffy2[kdir]
            @diffz2[kdir] = [0.0] + @diffz2[kdir]
         end
         # calculate all vectors going from face 1 to face 3 by interpolating diffs from face 4, 0, 2 and 5 like
         # vector[i][k] = 0.5*(vector_4*(i_max-i)/i_max + vector_0*(k_max-k)/k_max + vector_2*i/i_max + vector_5*j/j_max
         # these vectors then have to be scaled to fit between face 1 and 3
         # combine diffnN where n is x,y and z and  N is 4, 0, 2 and 5 for j 0..j_max
         @diffx, @diffy, @diffz = Array.new, Array.new, Array.new
         (0..@imax).each do |idir|
            @diffx[idir], @diffy[idir], @diffz[idir] = Array.new, Array.new, Array.new
            (0..@kmax).each do |kdir|
               @diffx[idir][kdir], @diffy[idir][kdir], @diffz[idir][kdir] = Array.new, Array.new, Array.new
                # find out if vector from face 4 and 2 has a cross point. Do the same for face 0 and 5
                #[ @diffx4[kdir][jdir], @diffy4[kdir][jdir], @diffz4[kdir][jdir] ]
                #[ @diffx2[kdir][jdir], @diffy2[kdir][jdir], @diffz2[kdir][jdir] ]
                #[ @diffx0[kdir][jdir], @diffy0[kdir][jdir], @diffz0[kdir][jdir] ]
                #[ @diffx5[kdir][jdir], @diffy5[kdir][jdir], @diffz5[kdir][jdir] ]
               (0..@jmax).each do |jdir|
                  #length4 = vectLength( [@diffx4[kdir][jdir], @diffy4[kdir][jdir], @diffz4[kdir][jdir] ] )
                  length0 = vectLength( [@diffx0[idir][jdir], @diffy0[idir][jdir], @diffz0[idir][jdir] ] )
                  #length2 = vectLength( [@diffx2[kdir][jdir], @diffy2[kdir][jdir], @diffz2[kdir][jdir] ] )
                  length5 = vectLength( [@diffx5[idir][jdir], @diffy5[idir][jdir], @diffz5[idir][jdir] ] )
                  #@weightedlength = 0.5*(length4*(@imax - idir)/@imax + length0*(@kmax - kdir)/@kmax + length2*idir/@imax + length5*kdir/@kmax )
                  @weightedlength = length0*(@kmax - kdir)/@kmax + length5*kdir/@kmax
                  # find out if vector from face 4 and 2 has a cross point. Do the same for face 0 and 5
                  #@x4and2 = @diffx4[kdir][jdir]*(@imax - idir)/@imax + @diffx2[kdir][jdir]*idir/@imax
                  #@y4and2 = @diffy4[kdir][jdir]*(@imax - idir)/@imax + @diffy2[kdir][jdir]*idir/@imax
                  #@z4and2 = @diffz4[kdir][jdir]*(@imax - idir)/@imax + @diffz2[kdir][jdir]*idir/@imax
                  @x0and5 = @diffx0[idir][jdir]*(@kmax - kdir)/@kmax + @diffx5[idir][jdir]*kdir/@kmax
                  @y0and5 = @diffy0[idir][jdir]*(@kmax - kdir)/@kmax + @diffy5[idir][jdir]*kdir/@kmax
                  @z0and5 = @diffz0[idir][jdir]*(@kmax - kdir)/@kmax + @diffz5[idir][jdir]*kdir/@kmax
                  #puts "coord1: #{@x4and2}, \t#{@y4and2}, \t#{@z4and2},coord2: \t#{@x0and5}, \t#{@y0and5}, \t#{@z0and5}"
                  # puts "len1: #{vectLength( [@x4and2, @y4and2, @z4and2 ])} len2: #{vectLength( [@x0and5, @y0and5, @z0and5 ])}"

                  #@xcomb = 0.5*(@diffx4[kdir][jdir]*(@imax - idir)/@imax + @diffx0[idir][jdir]*(@kmax - kdir)/@kmax + @diffx2[kdir][jdir]*idir/@imax + @diffx5[idir][jdir]*kdir/@kmax)
                  #@ycomb = 0.5*(@diffy4[kdir][jdir]*(@imax - idir)/@imax + @diffy0[idir][jdir]*(@kmax - kdir)/@kmax + @diffy2[kdir][jdir]*idir/@imax + @diffy5[idir][jdir]*kdir/@kmax)
                  #@zcomb = 0.5*(@diffz4[kdir][jdir]*(@imax - idir)/@imax + @diffz0[idir][jdir]*(@kmax - kdir)/@kmax + @diffz2[kdir][jdir]*idir/@imax + @diffz5[idir][jdir]*kdir/@kmax)
                  @xcomb = @x0and5
                  @ycomb = @y0and5
                  @zcomb = @z0and5
                  #@comblen = vectLength( [@xcomb, @ycomb, @zcomb ])

                  #@diffx[idir][kdir][jdir] = 0.5*(@diffx4[kdir][jdir]*(@imax - idir)/@imax + @diffx0[idir][jdir]*(@kmax - kdir)/@kmax + @diffx2[kdir][jdir]*idir/@imax + @diffx5[idir][jdir]*kdir/@kmax)
                  #@diffy[idir][kdir][jdir] = 0.5*(@diffy4[kdir][jdir]*(@imax - idir)/@imax + @diffy0[idir][jdir]*(@kmax - kdir)/@kmax + @diffy2[kdir][jdir]*idir/@imax + @diffy5[idir][jdir]*kdir/@kmax)
                  #@diffz[idir][kdir][jdir] = 0.5*(@diffz4[kdir][jdir]*(@imax - idir)/@imax + @diffz0[idir][jdir]*(@kmax - kdir)/@kmax + @diffz2[kdir][jdir]*idir/@imax + @diffz5[idir][jdir]*kdir/@kmax)
                  @diffx[idir][kdir][jdir] = @xcomb
                  @diffy[idir][kdir][jdir] = @ycomb
                  @diffz[idir][kdir][jdir] = @zcomb

               end
            end
         end
         #puts @diffx[0][0].inject(0){|sum, item| sum + item }
         #puts @diffy[0][0].inject(0){|sum, item| sum + item }
         #puts @diffz[0][0].inject(0){|sum, item| sum + item }
         # calculate the diffN (where N is x,y and z) sum for each i,k
         @sumx, @sumy, @sumz = Array.new, Array.new, Array.new
         (0..@imax).each do |idir|
            @sumx[idir], @sumy[idir], @sumz[idir] = Array.new, Array.new, Array.new
            (0..@kmax).each do |kdir|
               @sumx[idir][kdir] = @diffx[idir][kdir].inject(0){|sum, item| sum + item }
               @sumy[idir][kdir] = @diffy[idir][kdir].inject(0){|sum, item| sum + item }
               @sumz[idir][kdir] = @diffz[idir][kdir].inject(0){|sum, item| sum + item }
               #puts "sumx[idir][kdir] #{@sumx[idir][kdir]}, sumy[idir][kdir] #{@sumy[idir][kdir]}, sumz[idir][kdir] #{@sumz[idir][kdir]}" 
            end
         end
         # fill arrays with start and endpoint from face 1 and 3
         @startpointx, @startpointy, @startpointz, @endpointx, @endpointy, @endpointz = Array.new, Array.new, Array.new, Array.new, Array.new, Array.new
         (0..@imax).each do |idir|
            @startpointx[idir], @startpointy[idir], @startpointz[idir] = Array.new, Array.new, Array.new
            @endpointx[idir], @endpointy[idir], @endpointz[idir] = Array.new, Array.new, Array.new
            (0..@kmax).each do |kdir|
               face1point = @cube.if[1].getpointno(idir, kdir)
               @startpointx[idir][kdir] = @cube.if[1].parent.x[0][face1point]
               @startpointy[idir][kdir] = @cube.if[1].parent.y[0][face1point]
               @startpointz[idir][kdir] = @cube.if[1].parent.z[0][face1point]
               face3point = @cube.if[3].getpointno(idir, kdir)
               @endpointx[idir][kdir] = @cube.if[3].parent.x[0][face3point]
               @endpointy[idir][kdir] = @cube.if[3].parent.y[0][face3point]
               @endpointz[idir][kdir] = @cube.if[3].parent.z[0][face3point]
            end
         end
         # calculate scale factors
         @sx, @sy, @sz = Array.new, Array.new, Array.new
         previousx, previousy, previousz = 1.0, 1.0, 1.0
         (0..@imax).each do |idir|
            @sx[idir], @sy[idir], @sz[idir] = Array.new, Array.new, Array.new
            (0..@kmax).each do |kdir|
               dist = @endpointx[idir][kdir] - @startpointx[idir][kdir] 
               if dist.abs < 1e-10 || dist == 0.0 || dist == -0.0 #&& false
                  @sx[idir][kdir] = previousx
               else
                  @sx[idir][kdir] = dist/@sumx[idir][kdir]
               end
               if @sx[idir][kdir].nan? || @sx[idir][kdir].abs > 100.0
                  @sx[idir][kdir] = previousx
               end
               previousx = @sx[idir][kdir]
               dist = @endpointy[idir][kdir] - @startpointy[idir][kdir] 
               if dist.abs < 1e-10 || dist == 0.0 || dist == -0.0 #&& false
                  @sy[idir][kdir] = previousy
               else
                  @sy[idir][kdir] = dist/@sumy[idir][kdir]
               end
               if @sy[idir][kdir].nan? || @sy[idir][kdir].abs > 100.0
                  @sy[idir][kdir] = previousy
               end
               previousy = @sy[idir][kdir]
               dist = @endpointz[idir][kdir] - @startpointz[idir][kdir] 
               if dist.abs < 1e-10 || dist == 0.0 || dist == -0.0 #&& false
                  @sz[idir][kdir] = previousz
               else
                  @sz[idir][kdir] = dist/@sumz[idir][kdir]
               end
               if @sz[idir][kdir].nan? || @sz[idir][kdir].abs > 100.0
                  @sz[idir][kdir] = previousz
               end
               previousz = @sz[idir][kdir]
               #puts "sx #{@sx[idir][kdir]}, sy #{@sy[idir][kdir]}, sz #{@sz[idir][kdir]}"
            end
         end
         # assemble the mesh points
         @xpos, @ypos, @zpos = Array.new, Array.new, Array.new
         (0..@imax).each do |idir|
            @xpos[idir], @ypos[idir], @zpos[idir] = Array.new, Array.new, Array.new
            (0..@jmax).each do |jdir|
               @xpos[idir][jdir], @ypos[idir][jdir], @zpos[idir][jdir] = Array.new, Array.new, Array.new
            end
         end
         (0..@imax).each do |idir|
            (0..@kmax).each do |kdir|
               sumx =  @startpointx[idir][kdir]
               sumy =  @startpointy[idir][kdir]
               sumz =  @startpointz[idir][kdir]
               (0..@jmax).each do |jdir|
                  sumx += @sx[idir][kdir] * @diffx[idir][kdir][jdir]
                  sumy += @sy[idir][kdir] * @diffy[idir][kdir][jdir]
                  sumz += @sz[idir][kdir] * @diffz[idir][kdir][jdir]
                  @xpos[idir][jdir][kdir] = sumx
                  @ypos[idir][jdir][kdir] = sumy
                  @zpos[idir][jdir][kdir] = sumz
                  #puts "x: #{sumx}, y: #{sumy}, z: #{sumz}"
               end
            end
         end
      end

Public Instance methods

[Source]

# File mesh.rb, line 755
      def x(i,j,k)
      end

[Source]

# File mesh.rb, line 757
      def y(i,j,k)
      end

[Source]

# File mesh.rb, line 759
      def z(i,j,k)
      end

[Validate]