Exemplo n.º 1
0
def test(**kwargs):

    # parameters
    prm = {
        # 'nproc3': [2, 1, 1],
        'nproc3': [1, 1, 1],
        'shape': [5, 4, 2, 2],
        'delta': [100.0, 100.0, 100.0, 0.0075],
        'rho': [2670.0],
        'vp': [6000.0],
        'vs': [3464.0],
        'gam': [0.3],
        'hourglass': [1.0, 1.0],
        'bc1': ['free', 'free', 'free'],
        'bc2': ['free', 'free', 'free'],
        'itstats': 1,
    }

    # output
    fns = sord.fieldnames()
    fns = sorted(fns['node']) + sorted(fns['cell'])
    for k in fns:
        prm[k] += [([], '=>', k + '.bin')]

    # source
    prm['pxx'] += [([0, 0, 0, 0], '=', 1e10)]
    prm['pyy'] += [([0, 0, 0, 0], '=', 1e10)]
    prm['pzz'] += [([0, 0, 0, 0], '=', 1e10)]

    # master
    prm['diffop'] = i = 'exac'
    d0 = os.path.join('run', 'sord_%s' % i) + os.sep
    cwd = os.getcwd()
    os.makedirs(d0)
    os.chdir(d0)
    sord.run(prm, **kwargs)
    meta = open('meta.json')
    dtype = json.load(meta)['dtype']
    os.chdir(cwd)

    # variations
    max_err_all_ = 0.0
    for i in ['save']:
        prm['diffop'] = i
        prm['path'] = d = os.path.join('run', 'sord_%s' % i) + os.sep
        os.makedirs(d)
        os.chdir(d)
        sord.run(prm, **kwargs)
        os.chdir(cwd)
        max_err_ = 0.0
        for k in fns:
            f1 = d0 + k + '.bin'
            f2 = d + k + '.bin'
            v1 = np.fromfile(f1, dtype)
            v2 = np.fromfile(f2, dtype)
            dv = v1 - v2
            e = np.abs(dv).max()
            if e:
                e = 0.5 * e / (np.abs(v1).max() + np.abs(v2).max())
                print('%s error: %s' % (k, e))
                max_err_ = max(max_err_, e)
        print('max error: ', max_err_)
        max_err_all_ = max(max_err_all_, max_err_)
    assert max_err_all_ == 0.0
Exemplo n.º 2
0
def test(**kwargs):
    prm = {}

    # dimensions
    dx, dt = 100.0, 0.0075
    nx, ny, nz, nt = 51, 51, 24, 200
    prm['delta'] = [dx, dx, dx, dt]
    prm['shape'] = [nx, ny, nz, nt]
    prm['nproc3'] = [1, 1, 2]
    prm['nproc3'] = [1, 1, 1]

    # material properties
    prm['rho'] = rho = [2670.0]
    prm['vp'] = vp = [6000.0]
    prm['vs'] = vs = [3464.0]
    prm['gam'] = 1.0
    prm['hourglass'] = [1.0, 1.0]

    # boundary conditions
    prm['bc1'] = ['pml', 'pml', 'pml']
    prm['bc2'] = ['-node', '+node', '-cell']

    # rupture
    dtau = 10e6
    prm['faultnormal'] = '+z'
    prm['hypocenter'] = [-1.0, -1.0, -1.5]
    prm['vrup'] = vr = 0.9 * vs
    prm['rcrit'] = 1e9
    prm['trelax'] = 0.0
    prm['mud'] = 1.0
    prm['mus'] = 1e9
    prm['dc'] = 1e9
    prm['tn'] = -90e6
    prm['ts'] = -90e6 - dtau

    # receivers
    prm['svm'] = [
        ([-1,  -21, -1], '=>', 'p20a.bin'),
        ([-13, -17, -1], '=>', 'p20b.bin'),
        ([-17, -13, -1], '=>', 'p20c.bin'),
        ([-21,  -1, -1], '=>', 'p20d.bin'),
    ]

    # analytical solution
    r = 2000.0
    t = (nt - 1.5) * dt - r / prm['vrup']
    # v = kostrov.slip_rate(rho, vp, vs, vr, dtau, r, t, 0.82)
    v = kostrov.slip_rate(rho, vp, vs, vr, dtau, r, t)

    # run SORD
    cwd = os.getcwd()
    d = os.path.join('run', 'sord_kostrov') + os.sep
    os.makedirs(d)
    os.chdir(d)
    sord.run(prm, **kwargs)
    meta = open('meta.json')
    dtype = json.load(meta)['dtype']
    os.chdir(cwd)

    # compare with analytical solution
    for p in 'abcd':
        f = d + 'p20%s.bin' % p
        dv = v - np.fromfile(f, dtype)[-1]
        err = dv / v
        print(v, err)
        assert abs(err) < 0.015