# -*- coding: utf-8 -*-
"""
Created on Wed Apr 03 11:15:38 2013

@author: Jan
"""

import numpy as np
import pyramid.magcreator as mc
import pyramid.projector as pj
import pyramid.phasemapper as pm
from pyramid.magdata import MagData
import time
import pdb, traceback, sys
from numpy import pi


def phase_from_mag():
    '''Calculate and display the phase map from a given magnetization.
    Arguments:
        None
    Returns:
        None
    
    '''
    # TODO: Input via GUI
    b_0 = 1.0  # in T    
    dim = (1, 3, 3)  # in px (y,x)
    res = 10.0  # in nm
    beta = 0*pi/4    
    
    center = (0, 1, 1)  # in px (y,x) index starts with 0!
    width  = (0, 1, 1)  # in px (y,x)
    mag_shape = mc.Shapes.slab(dim, center, width)

    mag_data = MagData(res, mc.create_mag_dist(mag_shape, beta))
    
    projection = pj.simple_axis_projection(mag_data)
    
    '''NUMERICAL SOLUTION'''
    # numerical solution Real Space (Slab):
    jacobi = np.zeros((dim[2]*dim[1], 2*dim[2]*dim[1]))
    tic = time.clock()
    pm.phase_mag_real(res, projection, 'slab', b_0, jacobi=jacobi)
    toc = time.clock()
    np.savetxt('../output/jacobi.npy', jacobi)
    print 'Time for Real Space Approach with Jacobi-Matrix (Slab): ' + str(toc - tic)
    
    return jacobi
    
    
if __name__ == "__main__":
    try:
        jacobi = phase_from_mag()
    except:
        type, value, tb = sys.exc_info()
        traceback.print_exc()
        pdb.post_mortem(tb)