def test_hex_contact_3D_order2_onFace(self):
    file="hex_contact_3D_order2_onFace.msh"
    ms1=Brick(1,1,1,2,l2=0.5,useElementsOnFace=True)
    ms2=Brick(1,1,1,2,l2=0.5,useElementsOnFace=True)
    ms2.setX(ms2.getX()+[0,0,0.5])
    my_dom=JoinFaces([ms1,ms2],optimize=False)
    self.checker(my_dom,file)
 def test_mesh_dump_to_NetCDF_brick(self):
     mydomain1 = Brick(n0=NE0,
                       n1=NE1,
                       n2=NE2,
                       order=1,
                       l0=1.,
                       l1=1.,
                       l2=1.,
                       optimize=False)
     dumpfile = os.path.join(DUDLEY_WORKDIR, "tempfile.mesh.nc")
     mydomain1.dump(dumpfile)
     mydomain2 = LoadMesh(dumpfile)
     self.domainsEqual(mydomain1, mydomain2)
 def test_data_dump_to_NetCDF_brick(self):
     mydomain1 = Brick(n0=NE0,
                       n1=NE1,
                       n2=NE2,
                       order=1,
                       l0=1.,
                       l1=1.,
                       l2=1.,
                       optimize=False)
     d1 = Data(mydomain1.getMPIRank(), Function(mydomain1))
     d1.expand()
     dumpfile = os.path.join(DUDLEY_WORKDIR, "tempfile.dump.nc")
     d1.dump(dumpfile)
     d2 = load(dumpfile, mydomain1)
     self.assertTrue(Lsup(abs(d1 - d2)) <= REL_TOL, "data objects differ")
 def test_Brick_optimize_order1(self):
     mydomain1 = Brick(n0=NE0,
                       n1=NE1,
                       n2=NE2,
                       order=1,
                       l0=1.,
                       l1=1.,
                       l2=1.,
                       optimize=False)
     mydomain2 = Brick(n0=NE0,
                       n1=NE1,
                       n2=NE2,
                       order=1,
                       l0=1.,
                       l1=1.,
                       l2=1.,
                       optimize=True)
     self.domainsEqual(mydomain1, mydomain2)
Exemple #5
0
 def setUp(self):
     self.domain = Brick(4, 4, 4)
     self.functionspaces = [
         ContinuousFunction(self.domain),
         Function(self.domain),
         ReducedFunction(self.domain),
         FunctionOnBoundary(self.domain),
         ReducedFunctionOnBoundary(self.domain)
     ]
 def fixme_test_mesh_read_brick_from_dudley_file(self):
     mydomain1 = Brick(n0=8,
                       n1=10,
                       n2=12,
                       order=1,
                       l0=1.,
                       l1=1.,
                       l2=1.,
                       optimize=False)
     mydomain2 = ReadMesh(
         os.path.join(DUDLEY_TEST_MESH_PATH, "brick_8x10x12.fly"))
     self.domainsEqual(mydomain1, mydomain2)
Exemple #7
0
 def setUp(self):
     self.domain = Brick(4, 4, 4)
     self.functionspaces = [
         ContinuousFunction(self.domain),
         Function(self.domain),
         ReducedFunction(self.domain),
         FunctionOnBoundary(self.domain),
         ReducedFunctionOnBoundary(self.domain)
     ]
     #We aren't testing DiracDeltaFunctions
     self.xn = 5  # number of grids on x axis
     self.yn = 5  # number of grids on y axis
     self.zn = 5
    n=dataMgr.getValue('n')
    dt=dataMgr.getValue('dt')
    stress=dataMgr.getValue('stress')
    v=dataMgr.getValue('v')
    p=dataMgr.getValue('p')
    T=dataMgr.getValue('T')
    if CREATE_TOPO:
        topography=dataMgr.getValue('topography')
   
    #diagnostics_file=FileWriter(DIAGNOSTICS_FN,append=True)
    print(("<%s> Restart at time step %d (t=%e) completed."%(time.asctime(),n,t)))
else:
    if DIM==2:
        dom=Rectangle(int(ceil(L*NE/H)),NE,l0=L/H,l1=1,order=-1,optimize=True)
    else:
        dom=Brick(int(ceil(L*NE/H)),int(ceil(L*NE/H)),NE,l0=L/H,l1=L/H,l2=1,order=-1,optimize=True)
    x=dom.getX()
    T=Scalar(1,Solution(dom))
    for d in range(DIM):
        if d == DIM-1: 
            T*=sin(x[d]/H*pi)
        else:
            T*=cos(x[d]/L*pi)

    T=(1.-x[DIM-1])+PERT*T
    v=Vector(0,Solution(dom))
    stress=Tensor(0,Function(dom))
    x2=ReducedSolution(dom).getX()
    p=Ra*(x2[DIM-1]-0.5*x2[DIM-1]**2-0.5)

    if CREATE_TOPO:
 def setUp(self):
     self.order = 1
     self.domain = Brick(n0=NE, n1=NE, n2=NE)
def getMesh(NE_X, NE_Y, t, d, o, fullOrder, r, l_X):
    if t == "Hex":
        if d == 2:
            dom = Rectangle(n0=NE_X,
                            n1=NE_Y,
                            l0=l_X,
                            order=o,
                            useFullElementOrder=fullOrder,
                            useElementsOnFace=r,
                            optimize=True)
        else:
            Brick()
            dom = Brick(n0=NE_X,
                        n1=NE_Y,
                        n2=NE_Y,
                        l0=l_X,
                        order=o,
                        useFullElementOrder=fullOrder,
                        useElementsOnFace=r,
                        optimize=True)
    else:
        des = Design(dim=d,
                     order=o,
                     element_size=min(l_X / max(3, NE_X), 1. / max(3, NE_Y)),
                     keep_files=True)
        des.setScriptFileName("tester.geo")
        if d == 2:
            p0 = Point(0., 0.)
            p1 = Point(l_X, 0.)
            p2 = Point(l_X, 1.)
            p3 = Point(0., 1.)
            l01 = Line(p0, p1)
            l12 = Line(p1, p2)
            l23 = Line(p2, p3)
            l30 = Line(p3, p0)
            s = PlaneSurface(CurveLoop(l01, l12, l23, l30))
            des.addItems(s, l01, l12, l23, l30)
        else:
            p000 = Point(0., 0., 0.)
            p100 = Point(l_X, 0., 0.)
            p010 = Point(0., 1., 0.)
            p110 = Point(l_X, 1., 0.)
            p001 = Point(0., 0., 1.)
            p101 = Point(l_X, 0., 1.)
            p011 = Point(0., 1., 1.)
            p111 = Point(l_X, 1., 1.)

            l10 = Line(p000, p100)
            l20 = Line(p100, p110)
            l30 = Line(p110, p010)
            l40 = Line(p010, p000)

            l11 = Line(p000, p001)
            l21 = Line(p100, p101)
            l31 = Line(p110, p111)
            l41 = Line(p010, p011)

            l12 = Line(p001, p101)
            l22 = Line(p101, p111)
            l32 = Line(p111, p011)
            l42 = Line(p011, p001)

            bottom = PlaneSurface(-CurveLoop(l10, l20, l30, l40))
            top = PlaneSurface(CurveLoop(l12, l22, l32, l42))

            front = PlaneSurface(CurveLoop(l10, l21, -l12, -l11))
            back = PlaneSurface(CurveLoop(l30, l41, -l32, -l31))

            left = PlaneSurface(CurveLoop(l11, -l42, -l41, l40))
            right = PlaneSurface(CurveLoop(-l21, l20, l31, -l22))

            vol = Volume(SurfaceLoop(bottom, top, front, back, left, right))
            des.addItems(vol)

        dom = MakeDomain(des)
    return dom
            ts.append(t)
            u_pc0.append(u_pc[0]), u_pc1.append(u_pc[1]), u_pc2.append(u_pc[2])

            # ... save current acceleration in units of gravity and displacements
            if n == 1 or n % 10 == 0:
                saveVTK("./data/usoln.%i.vtu" % (n / 10),
                        acceleration=length(a) / 9.81,
                        displacement=length(u),
                        tensor=stress,
                        Ux=u[0])
        return ts, u_pc0, u_pc1, u_pc2

    #
    # create domain:
    #
    mydomain = Brick(ne, ne, 10, l0=width, l1=width, l2=10. * width / ne)
    #
    #  sety time step size:
    #
    h = inf(1. / 5.) * inf(sqrt(rho / (lam + 2 * mu)) * mydomain.getSize())
    print("time step size = %s" % h)
    #
    #  spherical source at middle of bottom face
    #
    xc = [width / 2., width / 2., 0.]
    # define small radius around point xc
    src_radius = 0.03 * width
    print("src_radius = %s" % src_radius)
    #
    # run it
    #
Exemple #12
0
def XXX(dim, tend, dt, s, h, b, c, d, c_dir="x", d_dir="x", a=1., CN=True):
    """
     dim - sparial dimension 
     s - width of initial profile
     h - mesh size
    """
    v_c = c / a * getDirection(dim, c_dir)
    v_d = d / a * getDirection(dim, d_dir)
    v = (v_c + v_d)
    E = b / a
    if VERBOSITY:
        print("=" * 100)
        print(
            "XX Start test dim  = %d , h=%e, b=%e, c=%e, d=%e, c_dir=%s, d_dir=%s, a=%e, s=%e"
            % (dim, h, b, c, d, c_dir, d_dir, a, s))
        print("=" * 100)
        print("initial width s = ", s)
        print("diffusion = ", E)
        print("total velocity = ", v)
        print("tend = ", tend)
        print("tolerance = ", TOL)
        print("number of elements over s =", s / h)
    b0 = sqrt(-log(TAU) * 4 * (s**2 + E * tend))
    b1 = sqrt(-log(TAU)) * 2 * s
    X0_0 = max(b1, -v[0] * tend + b0)
    X0_1 = max(b1, -v[1] * tend + b0)
    l_0 = X0_0 + max(v[0] * tend + b0, b1)
    l_1 = X0_1 + max(v[1] * tend + b0, b1)
    NE_0 = max(int(l_0 / h + 0.5), 1)
    NE_1 = max(int(l_1 / h + 0.5), 1)
    if dim == 2:
        if VERBOSITY:
            print("%d x %d grid over %e  x %e with element size %e." %
                  (NE_0, NE_1, l_0, l_1, h))
        if NE_0 * NE_1 > NE_MAX:
            raise ValueError("too many elements %s." % (NE_0 * NE_1, ))
        dom = Rectangle(n0=NE_0, n1=NE_1, l0=l_0, l1=l_1)
        x0 = [X0_0, X0_1]
    else:
        X0_2 = max(b1, -v[2] * tend + b0)
        l_2 = X0_2 + max(v[2] * tend + b0, b1)
        NE_2 = max(int(l_2 / h + 0.5), 1)
        if VERBOSITY:
            print(
                "%d x %d x %d grid over %e  x %e x %e with element size %e." %
                (NE_0, NE_1, NE_2, l_0, l_1, l_2, h))
        if NE_0 * NE_1 * NE_2 > NE_MAX:
            raise ValueError("too many elements %s." % (NE_0 * NE_1 * NE_2, ))
        dom = Brick(n0=NE_0, n1=NE_1, ne2=NE_2, l0=l_0, l1=l_1, l2=l_2)
        x0 = [X0_0, X0_1, X0_2]
    if VERBOSITY:
        print("initial location = ", x0)
    print("XX", interpolate(uRef(dom, 0., E, s, v, x0),
                            FunctionOnBoundary(dom)))

    fc_BE = TransportPDE(dom, numEquations=1, useBackwardEuler=True)
    fc_BE.setValue(M=a, A=-b * kronecker(dom), B=-v_d * a, C=-v_c * a)
    fc_BE.getSolverOptions().setVerbosity(VERBOSITY)
    fc_BE.getSolverOptions().setTolerance(TOL)
    #
    fc_BE.getSolverOptions().setPreconditioner(
        fc_BE.getSolverOptions().GAUSS_SEIDEL)
    fc_BE.getSolverOptions().setNumSweeps(5)
    if VERBOSITY: print("Backward Euler Transport created")

    fc_CN = TransportPDE(dom, numEquations=1, useBackwardEuler=False)
    fc_CN.setValue(M=a, A=-b * kronecker(dom), B=-v_d * a, C=-v_c * a)
    fc_CN.getSolverOptions().setVerbosity(VERBOSITY)
    fc_CN.getSolverOptions().setTolerance(TOL)

    #fc_CN.getSolverOptions().setPreconditioner(fc_CN.getSolverOptions().GAUSS_SEIDEL)
    fc_CN.getSolverOptions().setNumSweeps(2)
    if VERBOSITY: print("Crank Nicolson Transport created")
    dt_CN = fc_CN.getSafeTimeStepSize()
    if VERBOSITY: print("time step size by Crank Nicolson=", dt_CN)

    U0 = uRef(dom, 0, E, s, v, x0)
    U0_e = uRef(dom, 0, E, s, v, x0, True)
    fc_CN.setInitialSolution(U0)
    fc_BE.setInitialSolution(U0)
    initial_error_L2 = sqrt(integrate((U0 - U0_e)**2))
    if VERBOSITY:
        print("initial Lsup = ", Lsup(U0), Lsup(U0_e))
        print("initial integral = ", integrate(U0_e))
        print("initial error = ", initial_error_L2)
        print("used time step size =", dt)

    if not CN:
        n = int(ceil(tend / dt))
        if VERBOSITY:
            print("Solve Backward Euler:")
            print("substeps : ", n)
        t0 = clock()
        for i in range(n):
            u = fc_BE.getSolution(dt)
        t0 = clock() - t0
    else:
        if VERBOSITY: print("Solve Crank Nicolson:")
        dt = dt_CN
        t0 = clock()
        u = fc_CN.getSolution(tend)
        t0 = clock() - t0
    out = QUALITY(u, uRef(dom, tend, E, s, v, x0, True))
    print("XX",
          interpolate(uRef(dom, tend, E, s, v, x0), FunctionOnBoundary(dom)))
    out['time'] = t0
    out['tend'] = tend
    out['dt'] = dt
    out['dx'] = h
    if abs(b) > 0:
        out["peclet"] = length(v) * s / b
    else:
        out["peclet"] = 9999999.
    # saveVTK("bb.vtu",u0=U0,u_CN=u_CN, uRef=uRef(dom,dt2,E,s,v,X0) )
    return out
NE = 128
NE = 4
DIM = 2
THETA = 0.5
OMEGA0 = 1.
ALPHA = pi / 4
T0 = 0
T_END = 2. * pi
dt = 1e-3 * 10 * 10
E = 1.e-3
TEST_SUPG = False or True

if DIM == 2:
    dom = Rectangle(NE, NE)
else:
    dom = Brick(NE, NE, NE)
u0 = dom.getX()[0]
# saveVTK("u.%s.vtu"%0,u=u0)
# print "XX"*80
dom.setX(2 * dom.getX() - 1)

# set initial value
x = dom.getX()
r = sqrt(x[0]**2 + (x[1] - 1. / 3.)**2)
# u0=whereNegative(r-1./3.)*wherePositive(wherePositive(abs(x[0])-0.05)+wherePositive(x[1]-0.5))

x = Function(dom).getX()
if DIM == 2:
    V = OMEGA0 * (x[0] * [0, -1] + x[1] * [1, 0])
else:
    V = OMEGA0 * (x[0] * [0, cos(ALPHA), 0] + x[1] *
def getDomain():
    """
    this defines a dom as a brick of length and width l and hight h

      
    """
    global netotal

    v_p = {}
    for tag in sorted(rho_tab.keys()):
        v_p[tag] = sqrt((2 * mu_tab[tag] + lmbd_tab[tag]) / rho_tab[tag])
    v_p_ref = min(v_p.values())
    print(
        "velocities: bedrock = %s, sand = %s, water =%s, absorber =%s, reference =%s"
        % (v_p[bedrock], v_p[sand], v_p[water], v_p[absorber], v_p_ref))

    sections = {}
    sections["x"] = [
        d_absorber, x_sand, l_sand, l_x_water, l_sand,
        l - x_sand - 2 * l_sand - l_x_water, d_absorber
    ]
    sections["y"] = [
        d_absorber, y_sand, l_sand, l_y_water, l_sand,
        l - y_sand - 2 * l_sand - l_y_water, d_absorber
    ]
    sections["z"] = [d_absorber, h - h_water - h_sand, h_sand, h_water]
    if output:
        print("sections x = ", sections["x"])
        print("sections y = ", sections["y"])
        print("sections z = ", sections["z"])

    mats = [[
        [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
        [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
        [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
        [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
        [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
        [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
        [absorber, absorber, absorber, absorber, absorber, absorber, absorber]
    ],
            [[
                absorber, absorber, absorber, absorber, absorber, absorber,
                absorber
            ],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [
                 absorber, absorber, absorber, absorber, absorber, absorber,
                 absorber
             ]],
            [[
                absorber, absorber, absorber, absorber, absorber, absorber,
                absorber
            ],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [absorber, bedrock, sand, sand, sand, bedrock, absorber],
             [absorber, bedrock, sand, sand, sand, bedrock, absorber],
             [absorber, bedrock, sand, sand, sand, bedrock, absorber],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [
                 absorber, absorber, absorber, absorber, absorber, absorber,
                 absorber
             ]],
            [[
                absorber, absorber, absorber, absorber, absorber, absorber,
                absorber
            ],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [absorber, bedrock, sand, sand, sand, bedrock, absorber],
             [absorber, bedrock, sand, water, sand, bedrock, absorber],
             [absorber, bedrock, sand, sand, sand, bedrock, absorber],
             [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber],
             [
                 absorber, absorber, absorber, absorber, absorber, absorber,
                 absorber
             ]]]

    num_elem = {}
    for d in sections:
        num_elem[d] = []
        for i in range(len(sections[d])):
            if d == "x":
                v_p_min = v_p[mats[0][0][i]]
                for q in range(len(sections["y"])):
                    for r in range(len(sections["z"])):
                        v_p_min = min(v_p[mats[r][q][i]], v_p_min)
            elif d == "y":
                v_p_min = v_p[mats[0][i][0]]
                for q in range(len(sections["x"])):
                    for r in range(len(sections["z"])):
                        v_p_min = min(v_p[mats[r][i][q]], v_p_min)
            elif d == "z":
                v_p_min = v_p[mats[i][0][0]]
                for q in range(len(sections["x"])):
                    for r in range(len(sections["y"])):
                        v_p_min = min(v_p[mats[i][r][q]], v_p_min)
            num_elem[d].append(
                max(1,
                    int(sections[d][i] * v_p_ref / v_p_min / resolution +
                        0.5)))

    ne_x = sum(num_elem["x"])
    ne_y = sum(num_elem["y"])
    ne_z = sum(num_elem["z"])
    netotal = ne_x * ne_y * ne_z
    if output:
        print("grid : %s x %s x %s (%s elements)" %
              (ne_x, ne_y, ne_z, netotal))
    dom = Brick(ne_x,
                ne_y,
                ne_z,
                l0=o * ne_x,
                l1=o * ne_y,
                l2=o * ne_z,
                order=o)
    x_old = dom.getX()
    x_new = 0

    for d in sections:
        if d == "x":
            i = 0
            f = [1, 0, 0]
        if d == "y":
            i = 1
            f = [0, 1, 0]
        if d == "z":
            i = 2
            f = [0, 0, 1]
        x = x_old[i]

        p = origin[d]
        ne = 0
        s = 0.

        for i in range(len(sections[d]) - 1):
            msk = whereNonPositive(x - o * ne + 0.5)
            s = s * msk + (sections[d][i] / (o * num_elem[d][i]) *
                           (x - o * ne) + p) * (1. - msk)
            ne += num_elem[d][i]
            p += sections[d][i]
        x_new = x_new + s * f
    dom.setX(x_new)

    fs = Function(dom)
    x = Function(dom).getX()
    x0 = x[0]
    x1 = x[1]
    x2 = x[2]
    p_z = origin["z"]
    for i in range(len(mats)):
        f_z = wherePositive(x2 - p_z) * wherePositive(x2 - p_z +
                                                      sections["z"][i])
        p_y = origin["y"]
        for j in range(len(mats[i])):
            f_y = wherePositive(x1 - p_y) * wherePositive(x1 - p_z +
                                                          sections["y"][j])
            p_x = origin["x"]
            for k in range(len(mats[i][j])):
                f_x = wherePositive(x0 - p_x) * wherePositive(x0 - p_x +
                                                              sections["x"][k])
                fs.setTags(mats[i][j][k], f_x * f_y * f_z)
                p_x += sections["x"][k]
            p_y += sections["y"][j]
        p_z += sections["z"][i]
    return dom
Exemple #15
0
 def setUp(self):
     self.domain = Brick(NE0, NE1, NE2, optimize=OPTIMIZE)
     self.package = SolverOptions.PASO
     self.method = SolverOptions.PCG
     self.preconditioner = SolverOptions.JACOBI
Exemple #16
0
 def setUp(self):
     self.domain = Brick(NE0, NE1, NE2, optimize=OPTIMIZE)
     self.package = SolverOptions.MKL
     self.method = SolverOptions.DIRECT
Exemple #17
0
def getDomain():
    """
    this defines a dom as a brick of length and width l and hight h

      
    """
    global netotal
    
    v_p={}
    for tag in sorted(rho_tab.keys()):
       v_p[tag]=sqrt((2*mu_tab[tag]+lmbd_tab[tag])/rho_tab[tag])
    v_p_ref=min(v_p.values())
    print("velocities: bedrock = %s, sand = %s, water =%s, absorber =%s, reference =%s"%(v_p[bedrock],v_p[sand],v_p[water],v_p[absorber],v_p_ref))

    sections={}
    sections["x"]=[d_absorber, x_sand, l_sand, l_x_water, l_sand, l-x_sand-2*l_sand-l_x_water, d_absorber]
    sections["y"]=[d_absorber, y_sand, l_sand, l_y_water, l_sand, l-y_sand-2*l_sand-l_y_water, d_absorber]
    sections["z"]=[d_absorber,h-h_water-h_sand,h_sand,h_water]
    if output:
      print("sections x = ",sections["x"])
      print("sections y = ",sections["y"])
      print("sections z = ",sections["z"])

    mats= [ 
            [ [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ],

            [ [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ],

            [ [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, bedrock , sand    , sand    , sand    , bedrock , absorber],
              [absorber, bedrock , sand    , sand    , sand    , bedrock , absorber],
              [absorber, bedrock , sand    , sand    , sand    , bedrock , absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ],

            [ [absorber, absorber, absorber, absorber, absorber, absorber, absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, bedrock , sand    , sand    , sand    , bedrock , absorber],
              [absorber, bedrock , sand    , water   , sand    , bedrock , absorber],
              [absorber, bedrock , sand    , sand    , sand    , bedrock , absorber],
              [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber],
              [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ] ]
    
    num_elem={}
    for d in sections:
       num_elem[d]=[]
       for i in range(len(sections[d])):
           if d=="x":
              v_p_min=v_p[mats[0][0][i]]
              for q in range(len(sections["y"])):
                 for r in range(len(sections["z"])):
                    v_p_min=min(v_p[mats[r][q][i]],v_p_min)
           elif d=="y":
              v_p_min=v_p[mats[0][i][0]]
              for q in range(len(sections["x"])):
                 for r in range(len(sections["z"])):
                    v_p_min=min(v_p[mats[r][i][q]],v_p_min)
           elif d=="z":
              v_p_min=v_p[mats[i][0][0]]
              for q in range(len(sections["x"])):
                 for r in range(len(sections["y"])):
                    v_p_min=min(v_p[mats[i][r][q]],v_p_min)
           num_elem[d].append(max(1,int(sections[d][i] * v_p_ref/v_p_min /resolution+0.5)))
       
    ne_x=sum(num_elem["x"])
    ne_y=sum(num_elem["y"])
    ne_z=sum(num_elem["z"])
    netotal=ne_x*ne_y*ne_z
    if output: print("grid : %s x %s x %s (%s elements)"%(ne_x,ne_y,ne_z,netotal))
    dom=Brick(ne_x,ne_y,ne_z,l0=o*ne_x,l1=o*ne_y,l2=o*ne_z,order=o)
    x_old=dom.getX()
    x_new=0

    for d in sections:
        if d=="x": 
            i=0
            f=[1,0,0]
        if d=="y": 
            i=1
            f=[0,1,0]
        if d=="z": 
            i=2
            f=[0,0,1]
        x=x_old[i]

        p=origin[d]
        ne=0
        s=0.
 
        for i in range(len(sections[d])-1):
            msk=whereNonPositive(x-o*ne+0.5)
            s=s*msk + (sections[d][i]/(o*num_elem[d][i])*(x-o*ne)+p)*(1.-msk)
            ne+=num_elem[d][i]
            p+=sections[d][i]
        x_new=x_new + s * f
    dom.setX(x_new)

    fs=Function(dom)
    x=Function(dom).getX()
    x0=x[0]
    x1=x[1]
    x2=x[2]
    p_z=origin["z"]
    for i in range(len(mats)):
       f_z=wherePositive(x2-p_z)*wherePositive(x2-p_z+sections["z"][i])
       p_y=origin["y"]
       for j in range(len(mats[i])):
         f_y=wherePositive(x1-p_y)*wherePositive(x1-p_z+sections["y"][j])
         p_x=origin["x"]
         for k in range(len(mats[i][j])):
             f_x=wherePositive(x0-p_x)*wherePositive(x0-p_x+sections["x"][k]) 
             fs.setTags(mats[i][j][k],f_x*f_y*f_z)
             p_x+=sections["x"][k]
         p_y+=sections["y"][j]
       p_z+=sections["z"][i]
    return dom
Exemple #18
0
 def setUp(self):
      self.domain = Brick(l0=1.,l1=1.,l2=1.,n0=10, n1=10, n2=10) 
 def setUp(self):
     self.domain = Brick(NE, NE, NE)
     self.order = 1
 def setUp(self):
     self.domain = Brick(NE0, NE1, NE2, 1, optimize=OPTIMIZE)
     self.package = SolverOptions.TRILINOS
     self.method = SolverOptions.PCG
     self.preconditioner = SolverOptions.ILUT
Exemple #21
0
 def setUp(self):
     self.domain = Brick(NE0, NE1, NE2, optimize=OPTIMIZE)
     self.package = SolverOptions.TRILINOS
     self.method = SolverOptions.TFQMR
     self.preconditioner = SolverOptions.GAUSS_SEIDEL
Exemple #22
0
 def setUp(self):
     self.domain = Brick(NE0, NE1, NE2, optimize=OPTIMIZE)
     self.package = SolverOptions.PASO
     self.method = SolverOptions.BICGSTAB
     self.preconditioner = SolverOptions.GAUSS_SEIDEL
Exemple #23
0
 def setUp(self):
     self.domain = Brick(NE0, NE1, NE2, optimize=OPTIMIZE)
     self.package = SolverOptions.TRILINOS
     self.method = SolverOptions.BICGSTAB
     self.preconditioner = SolverOptions.JACOBI