tests/testthat/test_overlap3D.R

# testing overlap functions for 3D. Sphere, cube, shell.
test_that(
  'Overlap Errors',{
    expect_error(calc_overlap_3D(alpha=-1))
    expect_error(calc_overlap_3D(alpha=1, r=-1))
    expect_error(calc_overlap_3D(alpha=1, r=0.5, rmin=-1))
    expect_error(calc_overlap_3D(alpha=1, r=0.5, rmin=1))
    expect_error(calc_overlap_3D(alpha=1, bound = "triangle"))
    expect_error(sphere_overlap_is(3.4, 2, 1))
  }
)

test_that(
  'Overlap Cube', {
    #given
    rad=0.5
    alpha1=0.2      #0<0.4<0.5
    alpha2= 0.35    #0.5< 0.7 < sqrt(2)/2
    alpha3 = 0.4    #sqrt(2)/2 < 0.8 < sqrt(3)/2
    alpha4 = 1
    vc2 = pi*(2*alpha2-rad)^2*(4*alpha2+rad)/3
    vc3 = pi*(2*alpha3-rad)^2*(4*alpha3+rad)/3
    vo = cap_intersect_vol(2*alpha3, rad)
    #when
    overlap1 = calc_overlap_3D(alpha=alpha1, r=rad)
    overlap2 = calc_overlap_3D(alpha=alpha2, r=rad)
    overlap3 = calc_overlap_3D(alpha=alpha3, r=rad)
    overlap4 = calc_overlap_3D(alpha=alpha4, r=rad)
    #then
    expect_equal(overlap1, (pi*(2*alpha1)^3/6)/0.5^3)
    expect_equal(overlap2, (pi*(2*alpha2)^3/6 - 0.75*vc2)/0.5^3)
    expect_equal(overlap3, (pi*(2*alpha3)^3/6-3*(0.25*vc3-vo))/0.5^3)
    expect_equal(overlap4, 1)
  }
)

test_that(
  'Overlap Sphere', {
    #given
    rad=0.5
    alpha1 = 0.25
    alpha2 = 0.4
    alpha3 = 2
    total = (4/3)*pi*0.5^3
    theta1 = acos(0.5)
    h2 = (2*alpha1)*cos(theta1)
    h1 = 2*alpha1-h2
    v1 = (1/3)*pi*h1^2*(3*2*alpha1 - h1)
    v2 = (1/3)*pi*h2^2*(3*rad-h2)
    o1 = v1+v2
    theta1 = acos(0.8)
    h2 = (2*alpha2)*cos(theta1)
    h1 = 2*alpha2-h2
    v1 = (1/3)*pi*h1^2*(3*2*alpha2 - h1)
    v2 = (1/3)*pi*h2^2*(3*rad-h2)
    if (h2>rad){
      h = 2*rad-h2
      v2 = (4/3)*pi*rad^3 - (1/3)*pi*h^2*(3*rad-h)
    }
    o2 = v1+v2
    #when
    overlap1 = calc_overlap_3D(alpha=alpha1, r=rad, bound="sphere")
    overlap2 = calc_overlap_3D(alpha=alpha2, r=rad, bound="sphere")
    overlap3 = calc_overlap_3D(alpha=alpha3, r=rad, bound="sphere")
    #then
    expect_equal(overlap1, o1/total)
    expect_equal(overlap2, o2/total)
    expect_equal(overlap3, 1)
  }
)

test_that(
  'Overlap Shell', {
    #given
    R_big = 2
    r_lit = 1
    total = (4/3)*pi*(R_big^3-r_lit^3)
    #First overlap
    alpha1 = 0.25 # 0 < 0.5 < 1
    alpha2 = 0.75 # 1 < 1.5 < 3
    alpha5 = 1.2  # 2 < 2.4 < 3
    alpha3 = 1.7  # 3 < 3.4 < 4
    alpha4 = 3    # 4 < 6
    theta1 = acos(0.125)
    h2 = (2*alpha1)*cos(theta1)
    h1 = 2*alpha1-h2
    v1 = (1/3)*pi*h1^2*(3*2*alpha1 - h1)
    v2 = (1/3)*pi*h2^2*(3*R_big-h2)
    o1 = v1+v2
    #Second overlap
    theta1 = acos(0.375)
    theta3 = acos(((2*alpha2)^2+R_big^2-r_lit^2)/(2*(2*alpha2)*R_big))
    h2 = (2*alpha2)*cos(theta1)
    h1 = 2*alpha2-h2
    v1 = (1/3)*pi*h1^2*(3*2*alpha2 - h1)
    v2 = (1/3)*pi*h2^2*(3*R_big-h2)
    h4 = (2*alpha2)*cos(theta3)-(R_big-r_lit)
    h3 = 2*alpha2-h4-(R_big-r_lit)
    v3 = (1/3)*pi*h3^2*(3*2*alpha2-h3)
    v4 = (1/3)*pi*h4^2*(3*r_lit-h4)
    o2 = v1+v2-v3-v4
    #Third overlap
    theta1 = acos(0.85)
    theta2 = acos(-0.445)
    h2 = 2*alpha3*cos(theta1)
    h1 = 2*alpha3-h2
    v1 = (1/3)*pi*h1^2*(3*2*alpha3 - h1)
    v2 = 0
    if (h2 <= R_big){
      v2 = (1/3)*pi*h2^2*(3*R_big-h2)
    } else {
      h2 = 2*R_big-h2
      v2 = (4/3)*pi*R_big^3 - (1/3)*pi*h2^2*(3*R_big-h2)
    }
    o3 = v1+v2
    #Fifth overlap
    theta1 = acos(0.6)
    theta3 = acos(((2*alpha5)^2+R_big^2-r_lit^2)/(2*(2*alpha5)*R_big))
    h2 = (2*alpha5)*cos(theta1)
    h1 = 2*alpha5-h2
    v1 = (1/3)*pi*h1^2*(3*2*alpha5 - h1)
    v2 = (1/3)*pi*h2^2*(3*R_big-h2)
    h4 = (2*alpha5)*cos(theta3)-(R_big-r_lit)
    h3 = 2*alpha5-h4-(R_big-r_lit)
    v3 = (1/3)*pi*h3^2*(3*2*alpha5-h3)
    h4 = 2*r_lit-h4
    v4 = (4/3)*pi*r_lit^3 - (1/3)*pi*h4^2*(3*r_lit-h4)
    o5 = v1+v2-v3-v4
    #when
    overlap1 = calc_overlap_3D(alpha=alpha1, r=R_big, rmin=r_lit, bound="shell")
    overlap2 = calc_overlap_3D(alpha=alpha2, r=R_big, rmin=r_lit, bound="shell")
    overlap3 = calc_overlap_3D(alpha=alpha3, r=R_big, rmin=r_lit, bound="shell")
    overlap4 = calc_overlap_3D(alpha=alpha4, r=R_big, rmin=r_lit, bound="shell")
    overlap5 = calc_overlap_3D(alpha=alpha5, r=R_big, rmin=r_lit, bound="shell")
    #then
    expect_equal(overlap1, o1/total)
    expect_equal(overlap2, o2/total)
    expect_equal(overlap3, (o3 - (4/3)*pi*r_lit^3)/total)
    expect_equal(overlap4, 1)
    expect_equal(overlap5, o5/total)
  }
)

Try the ashapesampler package in your browser

Any scripts or data that you put into this service are public.

ashapesampler documentation built on May 29, 2024, 3:22 a.m.