#Test Name: FlowbandFSshelf
import numpy as np
from model import *
from solve import *
from setflowequation import *
from bamgflowband import *
from paterson import *

x = np.arange(1, 3001, 100).T
h = np.linspace(1000, 300, np.size(x)).T
b = -917. / 1023. * h

md = bamgflowband(model(), x, b + h, b, 'hmax', 80.)

#Geometry  #interp1d returns a function to be called on md.mesh.x
md.geometry.surface = np.interp(md.mesh.x, x, b + h)
md.geometry.base = np.interp(md.mesh.x, x, b)
md.geometry.thickness = md.geometry.surface - md.geometry.base

#mask
md.mask.ice_levelset = -np.ones((md.mesh.numberofvertices))
md.mask.ice_levelset[np.where(md.mesh.vertexflags(2))] = 0.
md.mask.ocean_levelset = np.zeros((md.mesh.numberofvertices)) - 0.5

#materials
md.initialization.temperature = (273. - 20.) * np.ones((md.mesh.numberofvertices))
md.materials.rheology_B = paterson(md.initialization.temperature)
md.materials.rheology_n = 3. * np.ones((md.mesh.numberofelements))

#friction
md.friction.coefficient = np.zeros((md.mesh.numberofvertices))
md.friction.coefficient[np.where(md.mesh.vertexflags(1))] = 20.
md.friction.p = np.ones((md.mesh.numberofelements))
md.friction.q = np.ones((md.mesh.numberofelements))

#Boundary conditions
md.stressbalance.referential = np.nan * np.ones((md.mesh.numberofvertices, 6))
md.stressbalance.loadingforce = 0. * np.ones((md.mesh.numberofvertices, 3))
md.stressbalance.spcvx = np.nan * np.ones((md.mesh.numberofvertices, ))
md.stressbalance.spcvy = np.nan * np.ones((md.mesh.numberofvertices, ))
md.stressbalance.spcvz = np.nan * np.ones((md.mesh.numberofvertices, ))
md.stressbalance.spcvx[np.where(md.mesh.vertexflags(4))] = 0.
md.stressbalance.spcvy[np.where(md.mesh.vertexflags(4))] = 0.
md.basalforcings.floatingice_melting_rate = np.zeros((md.mesh.numberofvertices, ))

#Misc
md = setflowequation(md, 'FS', 'all')
md.stressbalance.abstol = np.nan
#md.stressbalance.reltol = 10**-16
md.stressbalance.FSreconditioning = 1.
md.stressbalance.maxiter = 20
md.flowequation.augmented_lagrangian_r = 10000.
md.miscellaneous.name = 'test701'
md.verbose = verbose('convergence', True)
md.cluster = generic('np', 2)
md.groundingline.migration = 'None'

#Go solve
field_names = []
field_tolerances = []
field_values = []
#md.initialization.pressure = md.constants.g * md.materials.rho_ice * (md.geometry.surface - md.mesh.y)
for i in ['MINI', 'MINIcondensed', 'TaylorHood', 'LATaylorHood', 'CrouzeixRaviart', 'LACrouzeixRaviart']:
    print(' ')
    print('=====Testing ' + i + ' Full-Stokes Finite element=====')
    md.flowequation.fe_FS = i
    md = solve(md, 'Stressbalance')
    field_names = field_names + [['Vx' + i], ['Vy' + i], ['Vel' + i], ['Pressure' + i]]
    field_tolerances = field_tolerances + [9e-5, 9e-5, 9e-5, 1e-10]
    field_values = field_values + [md.results.StressbalanceSolution.Vx,
                                   md.results.StressbalanceSolution.Vy,
                                   md.results.StressbalanceSolution.Vel,
                                   md.results.StressbalanceSolution.Pressure]
