"""
    Author: Erin Kuci
    
    Topology optimization using SIMP method and MMA algorithm (matlab)
    
"""
import sys
sys.path.insert(0,'/Users/erinkuci/Desktop/src/getdp/benchmarks_kst/tool')
from tool4 import *

# ************************************************************************
# ***** Create the parameters                                        *****
# ************************************************************************
parameters = Dictionnaire()

parameters['plot'] = 1

# Model
parameters['modelName'] = 'v'
parameters['AnalysisModelType']='FEM'
parameters['flagParallel'] = 0
parameters['flagOptType'] = 'Topology' #'Shape', 'Topology'
parameters['simpPenal'] = 1.0
parameters['modelType'] = 'machine'
parameters['analysisType'] = 0.0
parameters['NLferro'] = 1.0
parameters['NLferroLaw'] = 1.0
parameters['TorqueNominal'] = -130.0

# Design variables
parameters['paramNameDisp'] = 'nu'
parameters['VolFrac'] = 0.6
parameters['elementOfDomainTopOptTAG'] = 1001

# Performance function
#parameters['performance'] = ['Compliance', 'Volume', 'MeanTorqueConstr']
#parameters['performance'] = ['TorqueVariance', 'Volume']
parameters['performance'] = ['TorqueVariance']
parameters['rotorAngles'] = np.zeros(1) #np.linspace(7.5,15.0,5)
parameters['m'] = len(parameters['performance']) - 1 # number of constraint
#parameters['sign'] = [-1.0,1.0,-1.0]
parameters['sign'] = [1.0,1.0]
parameters['fiMax'] = np.zeros(parameters['m']+1)

# Sensitivity analysis
parameters['flag_computeGrad'] = 1
parameters['SensitivityMethod'] = ['AnalyticAvmFixedDom']
#parameters['SensitivityMethod'] = ['AnalyticAvmFixedDom','Analytic']
parameters['FilterSensitivity'] = [1]#[1, 0]
parameters['rmin'] = 0.0001*7.0

# Optimizer set-up
parameters['optimizer'] = 'openopt'
parameters['solverName'] = 'mma'
parameters['xtol'] = 1.0e-08

# ************************************************************************
# ***** Instantiate the Model and the Optimizer                      *****
# ************************************************************************
op = OPTIMIZATION(parameters)

# ************************************************************************
# ***** Optimization routine                                         *****
# ************************************************************************
# Preprocess
op.preprocessing(op.parameters)

# Create optimizer
op.create(op.parameters)

# Call Optimizer
f0Call = op.ObjFunc
df0Call = op.ObjFuncDeriv
fjCall = []#op.ineqConstr
dfjCall = []#op.ineqConstrDeriv

op.openOptCall(op.x0,op.xmax,op.xmin,op.parameters,
               f0Call,df0Call,fjCall,dfjCall)

# Close optimizer
op.close()

# ************************************************************************
# ***** Optimization Post-Process                                    *****
# ************************************************************************
# Optimization history
x,f = op.postprocessing(op.parameters)

## Threeshold design variables
#pathIn = 'res/designVar69.pos'
#pathOut = 'res/designVarFilt.pos'
#xf = op.threesoldDesignVar(0.6,op.n,op.parameters['indexStart'],pathIn,pathOut)
#
## Compute torque
#pathSave = ['resOpt/torqueBasic.npy','resOpt/torqueBasic.eps',
#            'resOpt/torqueOpt.npy','resOpt/torqueOpt.eps',
#            'resOpt/torqueCompare.eps']
##pathLoad = ['resOpt/torqueBasic.npy','resOpt/torqueOpt.npy']
#angles=np.linspace(7.5,15.0+7.5,15*3)
#op.compareTorque(x0,xf,angles,op.parameters,pathSave)



