예제 #1
0
def create_problem(arg, name="rough_example", outname="ufault", refine=1):
    """
    Create demo problem

    Inputs:
    Required:
    arg = 1d array of length 3 holding simulation inputs
          (shear/normal stress, normal stress, ratio of out of plane to in plane normal component)
    Optional:
    name = problem name (string)
    outname = name of output file (string)
    refine = simulation refinement (default is 1, which should be fine for this)

    Outputs:
    None

    Note: function will fail if the stress on any point of the fault exceeds the strength. Should
    (probably) not occur for the parameter range specified in the demo, but in here for safety purposes.
    """

    assert len(arg) == 3

    syy, ston, sxtosy = arg

    p = fdfault.problem(name)

    # set rk and fd order

    p.set_rkorder(4)
    p.set_sbporder(4)

    # set problem info

    nt = 800*refine + 1
    nx = 400*refine + 1
    ny = 150*refine + 1
    lx = 32.
    ly = 12.

    p.set_nt(nt)
    p.set_cfl(0.3)
    p.set_ninfo((nt-1)//4)

    # set number of blocks and coordinate information

    p.set_nblocks((1,2,1))
    p.set_nx_block(([nx], [ny, ny], [1]))

    # set block dimensions

    p.set_block_lx((0,0,0),(lx, ly))
    p.set_block_lx((0,1,0),(lx, ly))

    # set block boundary conditions

    p.set_bounds((0,0,0),['absorbing', 'absorbing', 'absorbing', 'none'])
    p.set_bounds((0,1,0),['absorbing', 'absorbing', 'none', 'absorbing'])

    # set block surface

    sxx = sxtosy*syy
    sxy = -syy*ston

    x = np.linspace(0., lx, nx)
    y = ly*np.ones(nx)+generate_profile(nx, lx, 1.e-2, 20, 1., 18749)

    surf = fdfault.curve(nx, 'y', x, y)

    # set initial fields

    norm_x, norm_y = generate_normals_2d(x, y, 'y')
    sn = np.zeros(nx)
    st = np.zeros(nx)

    for i in range(nx):
        sn[i], st[i] = rotate_xy2nt_2d(sxx, sxy, syy, (norm_x[i], norm_y[i]), 'y')

    assert np.all(st+0.7*sn < 0.), "shear stress is too high"

    p.set_block_surf((0,0,0), 3, surf)
    p.set_block_surf((0,1,0), 2, surf)

    p.set_stress((sxx, sxy, 0., syy, 0., 0.))

    # set interface type

    p.set_iftype(0,'slipweak')

    # set slip weakening parameters

    p.add_pert(fdfault.swparam('constant', dc = 0.8, mus = 0.7, mud = 0.2),0)
    p.add_pert(fdfault.swparam('boxcar', x0 = 2., dx = 2., mus = 10000.),0)
    p.add_pert(fdfault.swparam('boxcar', x0 = 30., dx = 2., mus = 10000.),0)

    # add load perturbation

    nuc_pert = np.zeros((nx, 1))
    idx = (np.abs(x - lx/2.) < 2.)
    nuc_pert[idx, 0] = (-0.7*sn[idx]-st[idx])+0.1

    p.set_loadfile(0, fdfault.loadfile(nx, 1, np.zeros((nx, 1)), nuc_pert, np.zeros((nx, 1))))

    # add output unit

    outname = "ufault"

    p.add_output(fdfault.output(outname,'U', nt, nt, 1, 0, nx - 1, 1, ny, ny, 1, 0, 0, 1))

    p.write_input(directory=join(fdfault_path,"problems"))
nby1 = mesh.nby1 * refine + 1  # for 000 and 100 blocks
ny = nby0 + nby1

[x1, y1, x2, y2, block010_length,
 block110_length] = read_surface_data(nx1, nx2)

import pickle
mydict = {'x1': x1, 'x2': x2, 'y1': y1 - 70, 'y2': y2 - 70}
output = open('surface.pkl', 'wb')

surf_height = max([max(y1), max(y2)])

arg = str(50)
problem_name = 'longterm_' + arg

p = fdfault.problem(problem_name)
# set rk and fd order
p.set_rkorder(4)
p.set_sbporder(4)

# set time step info
p.set_nt(nt)
p.set_cfl(0.3)
p.set_ninfo(100 * refine)

# set number of blocks and coordinate information
p.set_nblocks((2, 2, 1))
p.set_nx_block(([nx1, nx2], [nby0, nby1], [1]))

# set block dimensions
added_layer_thickness = 60.
예제 #3
0
import fdfault
import numpy as np

# create problem

p = fdfault.problem('tpv5')

# set rk and fd order

p.set_rkorder(4)
p.set_sbporder(4)

# set time step info

refine = 1
nt = 700 * refine

p.set_nt(nt)
p.set_cfl(0.3)
p.set_ninfo(50 * refine)

p.set_ndim(3)

# set number of blocks and coordinate information

nx = 200 * refine + 1
ny = 100 * refine + 1
nz = 100 * refine + 1

p.set_nblocks((1, 2, 1))
p.set_nx_block(([nx], [ny, ny], [nz]))
예제 #4
0
seed = 38

seed_iterations = 20
number_of_iterations = 80
for i in range(number_of_iterations):

    np.random.seed(seed)

    rms_ratio = np.array([np.random.uniform(0.03, 0.001)])
    #var = 0.002

    #p = fdfault.problem('seed' + str(seed_iterations) )
    name = 'patch_length'
    number = str(seed_iterations).zfill(4)
    problem_id = str(name + number)
    p = fdfault.problem(problem_id)

    # set rk and fd order

    p.set_rkorder(4)
    p.set_sbporder(4)

    # set time step info

    end_time = 8000
    nt = end_time
    interval_time = 200
    p.set_nt(end_time)
    p.set_cfl(0.3)
    p.set_ninfo(interval_time)
refine = 1

nt = 7000*refine # Number of timesteps
nx1 = 600*refine+1 # number of grid point in left block
nx2 = 600*refine+1 # number of grid point in right block
nx = nx1+nx2 # total for x coordinates
nby0 = 200*refine+1 # for 000 and 100 blocks

fault_surface = 51.
fault_bottom = 42.
surf_height = 10.

[x1, y1, x2, y2, block000_length, block100_length] = read_surface_data(nx1, nx2, fault_bottom,
                                                                       fault_surface, surf_height)
p = fdfault.problem('normalfault')

# set rk and fd order
p.set_rkorder(4)
p.set_sbporder(4)

# set time step info
p.set_nt(nt)
p.set_cfl(0.3)
p.set_ninfo(100*refine)

# set number of blocks and coordinate information
p.set_nblocks((2,1,1))
p.set_nx_block(([nx1, nx2], [nby0], [1]))

# set block dimensions
예제 #6
0
import fdfault
import numpy as np

# create problem

p = fdfault.problem('testprob')

# set rk and fd order

p.set_rkorder(4)
p.set_sbporder(4)

# set time step info

p.set_nt(1601)
p.set_cfl(0.3)
p.set_ninfo(50)

# set number of blocks and coordinate information

p.set_nblocks((2, 1, 1))
p.set_nx_block(([601, 601], [1601], [1]))

# set block dimensions

p.set_block_lx((0, 0, 0), (12., 32.))
p.set_block_lx((1, 0, 0), (12., 32.))

# set block boundary conditions

p.set_bounds((0, 0, 0), ['absorbing', 'none', 'absorbing', 'absorbing'])
예제 #7
0
import fdfault
import numpy as np

# create problem

p = fdfault.problem('input_example')

# set rk and fd order

p.set_rkorder(4)
p.set_sbporder(4)

# set time step info

p.set_nt(1601)
p.set_cfl(0.3)
p.set_ninfo(50)

# set number of blocks and coordinate information

p.set_nblocks((1, 2, 1))
p.set_nx_block(([1601], [801, 801], [1]))

# set block dimensions

p.set_block_lx((0, 0, 0), (40., 20.))
p.set_block_lx((0, 1, 0), (40., 20.))

# set block boundary conditions

p.set_bounds((0, 0, 0), ['absorbing', 'absorbing', 'absorbing', 'none'])