# -*- coding: iso-8859-1 -*-
#
#-------------------------------------------------------------------------------
#                    Code_Saturne version 1.3
#                    ------------------------
#
#
#     This file is part of the Code_Saturne User Interface, element of the
#     Code_Saturne CFD tool.
#
#     Copyright (C) 1998-2007 EDF S.A., France
#
#     contact: saturne-support@edf.fr
#
#     The Code_Saturne User Interface is free software; you can redistribute it
#     and/or modify it under the terms of the GNU General Public License
#     as published by the Free Software Foundation; either version 2 of
#     the License, or (at your option) any later version.
#
#     The Code_Saturne User Interface is distributed in the hope that it will be
#     useful, but WITHOUT ANY WARRANTY; without even the implied warranty
#     of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with the Code_Saturne Kernel; if not, write to the
#     Free Software Foundation, Inc.,
#     51 Franklin St, Fifth Floor,
#     Boston, MA  02110-1301  USA
#
#-------------------------------------------------------------------------------


import os, re, sys
import string

#-------------------------------------------------------------------------------
# Application modules import
#-------------------------------------------------------------------------------

import Pages.CommonCombustion as CommonCombustion

#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------

class Coal:
    def __init__(self):
        self.classesNumber = 1
        self.initDiameterClasses = [0.]
        self.CDryComposition = 0
        self.HDryComposition = 0
        self.ODryComposition = 0
        self.Dry = 0
        self.PCIValue = 0
        self.thermalCapacity = 0
        self.density = 0
        self.CDryCompositionCoke = 0
        self.HDryCompositionCoke = 0
        self.ODryCompositionCoke = 0
        self.PCICokeValue = 0
        self.ashesRatio = 0
        self.ashesFormingEnthalpy = 0
        self.ashesThermalCapacity = 0
        self.IY1CH = 0
        self.Y1CH = 0
        self.IY2CH = 0
        self.Y2CH = 0
        self.A1CH = 0
        self.A2CH = 0
        self.E1CH = 0
        self.E2CH = 0
        self.AHETCH = 0
        self.EHETCH = 0
        self.IOCHET = 0


    def setClassesNumber(self, value):
        self.classesNumber = value


    def setInitDiameterClasses(self, value):
        self.initDiameterClasses = value


    def addInitDiameterClasses(self, value):
        self.initDiameterClasses.append(value)
        self.classesNumber += 1


    def updateInitDiameterClasses(self, number, value):
        self.initDiameterClasses[number-1] = value


    def cancelInitDiameterClasses(self, number):
        self.classesNumber -= 1
        self.initDiameterClasses.pop(number-1)


    def setCDryComposition(self, value):
        self.CDryComposition = value


    def setODryComposition(self, value):
        self.ODryComposition = value


    def setHDryComposition(self, value):
        self.HDryComposition = value


    def setDry(self, value):
        self.Dry = value


    def setPCIValue(self, value):
        self.PCIValue = value


    def setThermalCapacity(self, value):
        self.thermalCapacity = value


    def setDensity(self, value):
        self.density = value


    def setCDryCompositionCoke(self, value):
        self.CDryCompositionCoke = value


    def setHDryCompositionCoke(self, value):
        self.HDryCompositionCoke = value


    def setODryCompositionCoke(self, value):
        self.ODryCompositionCoke = value


    def setPCICokeValue(self, value):
        self.PCICokeValue = value


    def setAshesRatio(self, value):
        self.ashesRatio = value


    def setAshesFormingEnthalpy(self, value):
        self.ashesFormingEnthalpy = value


    def setAshesThermalCapacity(self, value):
        self.ashesThermalCapacity = value


    def setIY1CH(self, value):
        self.IY1CH = value


    def setY1CH(self, value):
        self.Y1CH = value


    def setIY2CH(self, value):
        self.IY2CH = value


    def setY2CH(self, value):
        self.Y2CH = value


    def setA1CH(self, value):
        self.A1CH = value


    def setA2CH(self, value):
        self.A2CH = value


    def setE1CH(self, value):
        self.E1CH = value


    def setE2CH(self, value):
        self.E2CH = value


    def setAHETCH(self, value):
        self.AHETCH = value


    def setEHETCH(self, value):
        self.EHETCH = value


    def setIOCHET(self, value):
        self.IOCHET = value


    def getClassesNumber(self):
        return self.classesNumber


    def getInitDiameterClasses(self):
        return self.initDiameterClasses


    def getCDryComposition(self):
        return self.CDryComposition


    def getODryComposition(self):
        return self.ODryComposition


    def getHDryComposition(self):
        return self.HDryComposition


    def getDry(self):
        return self.Dry


    def getPCIValue(self):
        return self.PCIValue


    def getThermalCapacity(self):
        return self.thermalCapacity


    def getDensity(self):
        return self.density


    def getCDryCompositionCoke(self):
        return self.CDryCompositionCoke


    def getHDryCompositionCoke(self):
        return self.HDryCompositionCoke


    def getODryCompositionCoke(self):
        return self.ODryCompositionCoke


    def getPCICokeValue(self):
        return self.PCICokeValue


    def getAshesRatio(self):
        return self.ashesRatio


    def getAshesFormingEnthalpy(self):
        return self.ashesFormingEnthalpy


    def getAshesThermalCapacity(self):
        return self.ashesThermalCapacity


    def getIY1CH(self):
        return self.IY1CH


    def getY1CH(self):
        return self.Y1CH


    def getIY2CH(self):
        return self.IY2CH


    def getY2CH(self):
        return self.Y2CH


    def getA1CH(self):
        return self.A1CH


    def getA2CH(self):
        return self.A2CH


    def getE1CH(self):
        return self.E1CH


    def getE2CH(self):
        return self.E2CH


    def getAHETCH(self):
        return self.AHETCH


    def getEHETCH(self):
        return self.EHETCH


    def getIOCHET(self):
        return self.IOCHET


class Coals:

    def __init__(self):
        """ constructor """
        #
        # "CARACTERISTIQUES CHARBON" part
        self.Comment = {}
        self.coalNumber                            = 0
        self.Comment["coalNumber"]              = "Nb de charbons"
        self.classesNumberList                     = []
        self.Comment["classesNumberList"]       = "Nb de classes"
        self.initDiameterClassesList               = []
        self.Comment["initDiameterClassesList"] = "Diametre initial de la classe (m)"
        self.CDryCompositionList                   = []
        self.Comment["CDryCompositionList"]     = "Composition C (%) sur sec"
        self.HDryCompositionList                   = []
        self.Comment["HDryCompositionList"]     = "Composition H (%) sur sec"
        self.ODryCompositionList                   = []
        self.Comment["ODryCompositionList"]     = "Composition O (%) sur sec"
        self.DryList                               = []
        self.Comment["DryList"]                 = "PCI (J/kg) sur pur (0) sur sec 1"
        self.PCIValueList                          = []
        self.thermalCapacityList                   = []
        self.Comment["thermalCapacityList"]     = "CP moyen du charbon (J/kg/K)"
        self.densityList                           = []
        self.Comment["densityList"]             = "Masse volumique (kg/m3)"
        self.CDryCompositionCokeList               = []
        self.Comment["CDryCompositionCokeList"] = "Composition C (%) sur sec"
        self.HDryCompositionCokeList               = []
        self.Comment["HDryCompositionCokeList"] = "Composition H (%) sur sec"
        self.ODryCompositionCokeList               = []
        self.Comment["ODryCompositionCokeList"] = "Composition O (%) sur sec"
        self.PCICokeValueList                      = []
        self.Comment["PCICokeValueList"]        = "PCI sur sec (J/kg)"
        self.ashesRatioList                        = []
        self.Comment["ashesRatioList"]          = "Taux de cendres en masse (%)"
        self.ashesFormingEnthalpyList              = []
        self.Comment["ashesFormingEnthalpyList"]= "Enthalpie de formation des cendres (J/kg)"
        self.ashesThermalCapacityList              = []
        self.Comment["ashesThermalCapacityList"]= "CP des cendres (J/kg/K)"
        #
        # "DEVOLATILISATION" part
        self.IY1CHList                             = []
        self.Comment["Y1CHList"]                = "Coef. stoe. (adim) Y1 si = 0 calcul automatique"
        self.Y1CHList                              = []
        self.Comment["Y2CHList"]                = "Coef. stoe. (adim) Y2 si = 0 calcul automatique"
        self.IY2CHList                             = []
        self.Y2CHList                              = []
        self.A1CHList                              = []
        self.Comment["A1CHList"]                = "Facteur pre-exponentielle A1 (s-1)"
        self.A2CHList                              = []
        self.Comment["A2CHList"]                = "Facteur pre-exponentielle A2 (s-1)"
        self.E1CHList                              = []
        self.Comment["E1CHList"]                = "Energie d'activation E1 (J/mol)"
        self.E2CHList                              = []
        self.Comment["E2CHList"]                = "Energie d'activation E2 (J/mol)"
        #
        # "COMBUSTION HETEROGENE" part
        self.AHETCHList                            = []
        self.Comment["AHETCHList"]              = "Constante pre-exponentielle (kg/m2/s/atm)"
        self.EHETCHList                            = []
        self.Comment["EHETCHList"]              = "Energie d'activation (kcal/mol)"
        self.IOCHETList                            = []
        self.Comment["IOCHETList"]              = "Ordre de la reaction 0.5 si = 0 1 si = 1"


    def getNumber(self):
        return self.coalNumber


    #
    # "CARACTERISTIQUES CHARBON" part

    def deleteCoal(self, number):
        #
        # utiliser self.AHETCHList.remove(number)
        self.coalNumber -= 1
        nb = number - 1
        self.classesNumberList.pop(nb)
        self.initDiameterClassesList.pop(nb)
        self.CDryCompositionList.pop(nb)
        self.HDryCompositionList.pop(nb)
        self.ODryCompositionList.pop(nb)
        self.DryList.pop(nb)                
        self.PCIValueList.pop(nb)           
        self.thermalCapacityList.pop(nb)    
        self.densityList.pop(nb)            
        self.CDryCompositionCokeList.pop(nb)
        self.HDryCompositionCokeList.pop(nb)
        self.ODryCompositionCokeList.pop(nb)
        self.PCICokeValueList.pop(nb)
        self.ashesRatioList.pop(nb)
        self.ashesFormingEnthalpyList.pop(nb)
        self.ashesThermalCapacityList.pop(nb)
        self.IY1CHList.pop(nb)
        self.Y1CHList.pop(nb)
        self.IY2CHList.pop(nb)
        self.Y2CHList.pop(nb)
        self.A1CHList.pop(nb)
        self.A2CHList.pop(nb)
        self.E1CHList.pop(nb)
        self.E2CHList.pop(nb)
        self.AHETCHList.pop(nb)
        self.EHETCHList.pop(nb)
        self.IOCHETList.pop(nb)

    
    def addCoal(self, coal):

        self.coalNumber += 1
        self.classesNumberList.append(coal.getClassesNumber())
        self.initDiameterClassesList.append(coal.getInitDiameterClasses())
        self.CDryCompositionList.append(coal.getCDryComposition())
        self.HDryCompositionList.append(coal.getHDryComposition())
        self.ODryCompositionList.append(coal.getODryComposition())
        self.DryList.append(coal.getDry()) 
        self.PCIValueList.append(coal.getPCIValue())           
        self.thermalCapacityList.append(coal.getThermalCapacity())    
        self.densityList.append(coal.getDensity())            
        self.CDryCompositionCokeList.append(coal.getCDryCompositionCoke())
        self.HDryCompositionCokeList.append(coal.getHDryCompositionCoke())
        self.ODryCompositionCokeList.append(coal.getODryCompositionCoke())
        self.PCICokeValueList.append(coal.getPCICokeValue())
        self.ashesRatioList.append(coal.getAshesRatio())
        self.ashesFormingEnthalpyList.append(coal.getAshesFormingEnthalpy())
        self.ashesThermalCapacityList.append(coal.getAshesThermalCapacity())
        self.IY1CHList.append(coal.getIY1CH())
        self.Y1CHList.append(coal.getY1CH())
        self.IY2CHList.append(coal.getIY2CH())
        self.Y2CHList.append(coal.getY2CH())
        self.A1CHList.append(coal.getA1CH())
        self.A2CHList.append(coal.getA2CH())
        self.E1CHList.append(coal.getE1CH())
        self.E2CHList.append(coal.getE2CH())
        self.AHETCHList.append(coal.getAHETCH())
        self.EHETCHList.append(coal.getEHETCH())
        self.IOCHETList.append(coal.getIOCHET())


    def updateCoal(self,number, coal) : 

        nb = number - 1
        self.classesNumberList[nb]        = coal.getClassesNumber()
        self.initDiameterClassesList[nb]  = coal.getInitDiameterClasses()
        self.CDryCompositionList[nb]      = coal.getCDryComposition()
        self.HDryCompositionList[nb]      = coal.getHDryComposition()
        self.ODryCompositionList[nb]      = coal.getODryComposition()
        self.DryList[nb]                  = coal.getDry() 
        self.PCIValueList[nb]             = coal.getPCIValue()           
        self.thermalCapacityList[nb]      = coal.getThermalCapacity()    
        self.densityList[nb]              = coal.getDensity()            
        self.CDryCompositionCokeList[nb]  = coal.getCDryCompositionCoke()
        self.HDryCompositionCokeList[nb]  = coal.getHDryCompositionCoke()
        self.ODryCompositionCokeList[nb]  = coal.getODryCompositionCoke()
        self.PCICokeValueList[nb]         = coal.getPCICokeValue()
        self.ashesRatioList[nb]           = coal.getAshesRatio()
        self.ashesFormingEnthalpyList[nb] = coal.getAshesFormingEnthalpy()
        self.ashesThermalCapacityList[nb] = coal.getAshesThermalCapacity()
        self.IY1CHList[nb]                = coal.getIY1CH()
        self.Y1CHList[nb]                 = coal.getY1CH()
        self.IY2CHList[nb]                = coal.getIY2CH()
        self.Y2CHList[nb]                 = coal.getY2CH()
        self.A1CHList[nb]                 = coal.getA1CH()
        self.A2CHList[nb]                 = coal.getA2CH()
        self.E1CHList[nb]                 = coal.getE1CH()
        self.E2CHList[nb]                 = coal.getE2CH()
        self.AHETCHList[nb]               = coal.getAHETCH()
        self.EHETCHList[nb]               = coal.getEHETCH()
        self.IOCHETList[nb]               = coal.getIOCHET()


    def getCoal(self, number):
        coal = Coal()
        nb = number - 1
        coal.setClassesNumber(self.classesNumberList[nb])
        coal.setInitDiameterClasses(self.initDiameterClassesList[nb])
        coal.setCDryComposition(self.CDryCompositionList[nb])    
        coal.setHDryComposition(self.HDryCompositionList[nb])   
        coal.setODryComposition(self.ODryCompositionList[nb])  
        coal.setDry(self.DryList[nb])                
        coal.setPCIValue(self.PCIValueList[nb])           
        coal.setThermalCapacity(self.thermalCapacityList[nb])    
        coal.setDensity(self.densityList[nb])            
        coal.setCDryCompositionCoke(self.CDryCompositionCokeList[nb])
        coal.setHDryCompositionCoke(self.HDryCompositionCokeList[nb])
        coal.setODryCompositionCoke(self.ODryCompositionCokeList[nb])
        coal.setPCICokeValue(self.PCICokeValueList[nb])
        coal.setAshesRatio(self.ashesRatioList[nb])
        coal.setAshesFormingEnthalpy(self.ashesFormingEnthalpyList[nb])
        coal.setAshesThermalCapacity(self.ashesThermalCapacityList[nb])
        coal.setIY1CH(self.IY1CHList[nb])               
        coal.setY1CH(self.Y1CHList[nb])                
        coal.setIY2CH(self.IY2CHList[nb])               
        coal.setY2CH(self.Y2CHList[nb])                
        coal.setA1CH(self.A1CHList[nb])                
        coal.setA2CH(self.A2CHList[nb])                
        coal.setE1CH(self.E1CHList[nb]) 
        coal.setE2CH(self.E2CHList[nb]) 
        coal.setAHETCH(self.AHETCHList[nb])
        coal.setEHETCH(self.EHETCHList[nb])
        coal.setIOCHET(self.IOCHETList[nb])
        return coal
        
        
    def getCoalNumber(self):
        return self.coalNumber
        

    def getClassesNumberList(self):
        return self.classesNumberList

        
    def getInitDiameterClassesList(self):
        return self.initDiameterClassesList

        
    def getCDryCompositionList(self):
        return self.CDryCompositionList

        
    def getHDryCompositionList(self):
        return self.HDryCompositionList

        
    def getODryCompositionList(self):
        return self.ODryCompositionList


    def getDryList(self):
        return self.DryList

        
    def getPCIValueList(self):
        return self.PCIValueList

        
    def getThermalCapacityList(self):
        return self.thermalCapacityList

        
    def getDensityList(self):
        return self.densityList

        
    def getCDryCompositionCokeList(self):
        return self.CDryCompositionCokeList

        
    def getHDryCompositionCokeList(self):
        return self.HDryCompositionCokeList

        
    def getODryCompositionCokeList(self):
        return self.ODryCompositionCokeList

        
    def getPCICokeValueList(self):
        return self.PCICokeValueList

        
    def getAshesRatioList(self):
        return self.ashesRatioList

        
    def getAshesFormingEnthalpyList(self):
        return self.ashesFormingEnthalpyList
        
        
    def getAshesThermalCapacityList(self):
        return self.ashesThermalCapacityList


    def setCoalNumber(self, value):
        self.coalNumber = value 

        
    def setClassesNumberList(self, value):
        self.classesNumberList = value

        
    def setInitDiameterClassesList(self, value):
        self.initDiameterClassesList = value

        
    def setCDryCompositionList(self, value):
        self.CDryCompositionList = value

        
    def setHDryCompositionList(self, value):
        self.HDryCompositionList = value

        
    def setODryCompositionList(self, value):
        self.ODryCompositionList = value


    def setDryList(self, value):
        self.DryList = value

        
    def setPCIValueList(self, value):
        self.PCIValueList = value

        
    def setThermalCapacityList(self, value):
        self.thermalCapacityList = value

        
    def setDensityList(self, value):
        self.densityList = value

        
    def setCDryCompositionCokeList(self, value):
        self.CDryCompositionCokeList = value

        
    def setHDryCompositionCokeList(self, value):
        self.HDryCompositionCokeList = value

        
    def setODryCompositionCokeList(self, value):
        self.ODryCompositionCokeList = value

        
    def setPCICokeValueList(self, value):
        self.PCICokeValueList = value

        
    def setAshesRatioList(self, value):
        self.ashesRatioList = value

        
    def setAshesFormingEnthalpyList(self, value):
        self.ashesFormingEnthalpyList = value
        
        
    def setAshesThermalCapacityList(self, value):
        self.ashesThermalCapacityList = value

    #
    # "DEVOLATISATION" part
    def getIY1CHList(self):
        return self.IY1CHList

    
    def getY1CHList(self):
        return self.Y1CHList


    def getIY2CHList(self):
        return self.IY2CHList 


    def getY2CHList(self):
        return self.Y2CHList      


    def getA1CHList(self):
        return self.A1CHList


    def getA2CHList(self):
        return self.A2CHList


    def getE1CHList(self):
        return self.E1CHList


    def getE2CHList(self):
        return self.E2CHList
    

    def setIY1CHList(self, value):
        self.IY1CHList = value

    
    def setY1CHList(self, value):
        self.Y1CHList = value


    def setIY2CHList(self, value):
        self.IY2CHList  = value


    def setY2CHList(self, value):
        self.Y2CHList = value      


    def setA1CHList(self, value):
        self.A1CHList = value


    def setA2CHList(self, value):
        self.A2CHList = value


    def setE1CHList(self, value):
        self.E1CHList = value


    def setE2CHList(self, value):
        self.E2CHList = value
    #
    # "COMBUSTION HETEROGENE" part
    def getAHETCHList(self):
        return self.AHETCHList  


    def getEHETCHList(self):
        return self.EHETCHList


    def getIOCHETList(self):
        return self.IOCHETList


    def setAHETCHList(self, value):
        self.AHETCHList = value  


    def setEHETCHList(self, value):
        self.EHETCHList = value


    def setIOCHETList(self, value):
        self.IOCHETList = value


class RadiativTransfer:

    def __init__(self):
        """ constructor """
        #
        # "RAYONNEMENT" part
        self.Comment = {}
        self.radiativTransfer                 = 0
        self.Comment["radiativTransfer"]   = "Rayonnement : (0 : pas de rayonnement ; 1 : constant donne ci-dessous ; 2 : par Modak)"
        self.absorptionCoeff                  = 0
        self.Comment["absorptionCoeff"]    = "Coeff absorption pour le melange gazeux constant"

    #
    # "RAYONNEMENT" part
    def getRadiativTransfer(self) :
        return self.radiativTransfer


    def getAbsorptionCoeff(self):
        return self.absorptionCoeff
    

    def setRadiativTransfer(self, value) :
        self.radiativTransfer = value


    def setAbsorptionCoeff(self, value):
        self.absorptionCoeff = value


class CoalThermoChemistryModel:

    def __init__(self, fileName, case):
        """ constructor """
        self.case = case
        #
        # A remplacer par le bon repertoire
        self.fileName = fileName
        self.varComment = {}
        
        self.species = CommonCombustion.Species()
        self.radiativTransfer = RadiativTransfer()
        self.coals = Coals()
        #
        # Load file
        if not self.load():
            coal = Coal()
            #
            # create default coal
            self.coals.addCoal(coal)
            #
            # create default species
            self.species.getDefault()

    def load(self):
        """ read thermochimestry file"""
        #FIXME bug to obtain case_path
        filePath = self.case['data_path']+"/"+self.fileName
        try :
            ThermoChFile = open(filePath, "r")
        except :
            return 0

        # "THERMOCHIMIE" part
        line = ThermoChFile.readline()
        RegExpr = re.compile("^THERMOCHIMIE")
        if not RegExpr.match(line):
            msg = "Reading file error: " + filePath
            msg = msg + "\nNo string 'THERMOCHIMIE' in the first line\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        value = self._readIntValue(line, "currentSpeciesNb", filePath)
        self.species.setCurrentSpeciesNb(value)
        #
        #
        line = ThermoChFile.readline()
        value = self._readIntValue(line, "enthalpyTempTabNb", filePath)
        self.species.setEnthalpyTempTabNb(value)
        #
        # "ESPECE COURANTE" part
        line = ThermoChFile.readline()
        RegExpr = re.compile("^ESPECES COURANTES")
        if not RegExpr.match(line):
            msg =  "Reading file error: " + filePath
            msg = msg + "\nNo string 'ESPECES COURANTES' in the first line\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        try:
            self.species.setCurrentSpeciesList(line.split())
        except:
            msg = "Reading file error: " + filePath + " bad list of current species"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        value = self._readFloatValue(line, "MinTempTab", filePath)
        self.species.setMinTempTab(value)
        #
        #
        line = ThermoChFile.readline()
        value = self._readFloatValue(line, "MaxTempTab", filePath)
        self.species.setMaxTempTab(value)
        #
        #
        line = ThermoChFile.readline()
        value = self._readIntValue(line, "ElementarySpeciesNb", filePath)
        self.species.setElementarySpeciesNb(value)
        #
        #
        ElementarySpeciesMolarMassesList = []
        CurrentSpeciesCompositionList    = []
        for elemSpec in range(self.species.getElementarySpeciesNb()):
            try:
                line = ThermoChFile.readline()
                valuesList = line.split()
                ElementarySpeciesMolarMassesList.append(float(valuesList[0]))
                composition = []
                for currentSpec in range(self.species.getCurrentSpeciesNb()):
                    composition.append(int(valuesList[1 + currentSpec]))    
                CurrentSpeciesCompositionList.append(composition)
                
            except:
                msg = "Reading file error: " + filePath
                msg = msg + "\nElementarySpeciesMolarMassesList or CurrentSpeciesCompositionList reading\n"
                raise ValueError, msg
        self.species.setElementarySpeciesList(["C","H","O","N"])
        self.species.setElementarySpeciesMolarMassesList(ElementarySpeciesMolarMassesList)
        self.species.setCurrentSpeciesCompositionList(CurrentSpeciesCompositionList)
        #
        # "RAYONNEMENT" part
        line = ThermoChFile.readline()
        RegExpr = re.compile("^RAYONNEMENT")
        if not RegExpr.match(line):
            msg = "Reading file error: " + filePath + "\nNo string 'RAYONNEMENT'\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        value = self._readIntValue(line, "RadiativTransfer", filePath)
        self.radiativTransfer.setRadiativTransfer(value)
        #
        #
        line = ThermoChFile.readline()
        value = self._readFloatValue(line, "AbsorptionCoeff", filePath)
        self.radiativTransfer.setAbsorptionCoeff(value)
        #
        # "CARACTERISTIQUES CHARBONS" part
        line = ThermoChFile.readline()
        RegExpr = re.compile("^CARACTERISTIQUES CHARBONS")
        if not RegExpr.match(line):
            msg = "Reading file error: " + filePath + "\nNo string 'CARACTERISTIQUES CHARBONS'\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        value = self._readIntValue(line, "CoalNumber", filePath)
        self.coals.setCoalNumber(value)
        #
        #
        line = ThermoChFile.readline()
        values = self._readIntCoalValues(line, "ClassesNumberList", filePath)
        self.coals.setClassesNumberList(values)
        #
        #
        line = ThermoChFile.readline()
        try:
            strList = line.split()
            InitDiameterClassesList = []
            pt = 0
            for coal in range(self.coals.coalNumber):
                InitDiameter = []
                for Class in range(self.coals.classesNumberList[coal]):
                    InitDiameter.append(float(strList[pt+Class]))
                pt += self.coals.classesNumberList[coal]
                InitDiameterClassesList.append(InitDiameter)
                
            self.coals.setInitDiameterClassesList(InitDiameterClassesList)

        except:
            msg = "Reading file error: " + filePath + "\nbad value for InitDiameterClassesList\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "CDryCompositionList", filePath)    
        self.coals.setCDryCompositionList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "HDryCompositionList", filePath)    
        self.coals.setHDryCompositionList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "ODryCompositionList", filePath)    
        self.coals.setODryCompositionList(values)
        #
        #
        line = ThermoChFile.readline()
        intValues, floatValues = self._readIntFloatCoalValues(line, "PCIValue", filePath) 
        self.coals.setDryList(intValues)
        self.coals.setPCIValueList(floatValues)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "thermalCapacity", filePath)    
        self.coals.setThermalCapacityList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "density", filePath)    
        self.coals.setDensityList(values)
        #
        # "Coke" part
        line = ThermoChFile.readline()
        RegExpr = re.compile("^Coke")
        if not RegExpr.match(line):
            msg = "_reading file error: " + filePath + "\nNo string 'Coke'\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "CDryCompositionCokeList", filePath)    
        self.coals.setCDryCompositionCokeList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "HDryCompositionCokeList", filePath)    
        self.coals.setHDryCompositionCokeList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "ODryCompositionCokeList", filePath)    
        self.coals.setODryCompositionCokeList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "PCICokeValue", filePath)    
        self.coals.setPCICokeValueList(values)
        #
        # "Cendres" part
        line = ThermoChFile.readline()
        RegExpr = re.compile("^Cendres")
        if not RegExpr.match(line):
            msg = "Reading file error: " + filePath + "\nNo string 'Cendres'\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "ashesRatioList", filePath)    
        self.coals.setAshesRatioList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "AshesFormingEnthalpy", filePath)    
        self.coals.setAshesFormingEnthalpyList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "AshesThermalCapacity", filePath)    
        self.coals.setAshesThermalCapacityList(values)
        #
        # "Devolatilisation (Kobayashi)" part
        line = ThermoChFile.readline()
        RegExpr = re.compile("Parametres de devolatilisation")
        if not RegExpr.match(line):
            msg =  "Reading file error: " + filePath + \
                   "\nNo string 'Parametres de devolatilisation (modele de Kobayashi)'\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        intValues, floatValues = self._readIntFloatCoalValues(line, "IY1CH", filePath)    
        self.coals.setIY1CHList(intValues)
        self.coals.setY1CHList(floatValues)
        #
        #
        line = ThermoChFile.readline()
        intValues, floatValues = self._readIntFloatCoalValues(line, "IY2CH", filePath)    
        self.coals.setIY2CHList(intValues)
        self.coals.setY2CHList(floatValues)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "A1CH", filePath)    
        self.coals.setA1CHList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "A2CH", filePath)    
        self.coals.setA2CHList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "E1CH", filePath)    
        self.coals.setE1CHList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "E2CH", filePath)    
        self.coals.setE2CHList(values)
        #
        # "Devolatisation (Kobayashi)" part
        line = ThermoChFile.readline()
        RegExpr = re.compile("Parametres de combustion heterogene")
        if not RegExpr.match(line):
            msg = "Reading file error: " + filePath + \
                   "\nNo string 'Parametres de combustion heterogene'\n"
            raise ValueError, msg
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "AHETCH", filePath)    
        self.coals.setAHETCHList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readFloatCoalValues(line, "EHETCH", filePath)    
        self.coals.setEHETCHList(values)
        #
        #
        line = ThermoChFile.readline()
        values = self._readIntCoalValues(line, "IOCHET", filePath)    
        self.coals.setIOCHETList(values)
        
        ThermoChFile.close()
        
        return 1


    def save(self):
        """ write and save thermochimestry file"""
        #
        # Openning
        filePath = self.case['data_path']+"/"+self.fileName
        try :
            ThermoChFile = open(filePath, "w")
        except :
            msg = "Openning file error: " + filePath
            raise ValueError, msg
        #
        # writing
        ThermoChFile.write("THERMOCHIMIE\n")
        chain = str(self.species.getCurrentSpeciesNb())
        comment = self.createComment(len(chain),self.species.Comment["currentSpeciesNb"])
        ThermoChFile.write(chain + comment + "\n")
        
        chain = str(self.species.getEnthalpyTempTabNb())
        comment = self.createComment(len(chain),self.species.Comment["enthalpyTempTabNb"])
        ThermoChFile.write(chain + comment + "\n")
        #
        ThermoChFile.write("ESPECES COURANTES\n")
        ThermoChFile.write(self._preWriteList(self.species.getCurrentSpeciesList())+"\n")

        chain = str(self.species.getMinTempTab())
        comment = self.createComment(len(chain),self.species.Comment["minTempTab"])
        ThermoChFile.write(chain + comment + "\n")

        chain = str(self.species.getMaxTempTab())
        comment = self.createComment(len(chain),self.species.Comment["maxTempTab"])
        ThermoChFile.write(chain + comment +"\n")

        chain = str(self.species.getElementarySpeciesNb())
        comment = self.createComment(len(chain),self.species.Comment["elementarySpeciesNb"])
        ThermoChFile.write(chain + comment +"\n")

        list2write=[]
        ind = 0
        for i in self.species.getElementarySpeciesMolarMassesList():
            listTMP = []
            listTMP.append(i)
            for j in self.species.getCurrentSpeciesCompositionList()[ind]:
                listTMP.append(j)
            ind += 1
            list2write.append(listTMP)
        ThermoChFile.write(self._preWriteList(list2write))
        #
        ThermoChFile.write("RAYONNEMENT\n")

        chain = str(self.radiativTransfer.getRadiativTransfer())
        comment = self.createComment(len(chain),self.radiativTransfer.Comment["radiativTransfer"])
        ThermoChFile.write(chain + comment +"\n")

        chain = str(self.radiativTransfer.getAbsorptionCoeff())
        comment = self.createComment(len(chain),self.radiativTransfer.Comment["absorptionCoeff"])
        ThermoChFile.write(chain + comment +"\n")
        #
        ThermoChFile.write("CARACTERISTIQUES CHARBONS\n")

        chain = str(self.coals.getCoalNumber())
        comment = self.createComment(len(chain),self.coals.Comment["coalNumber"])
        ThermoChFile.write(chain + comment +"\n")

        chain = str(self._preWriteList(self.coals.getClassesNumberList()))
        comment = self.createComment(len(chain),self.coals.Comment["classesNumberList"])
        ThermoChFile.write(chain + comment +"\n")
         
        listTMP = []
        for i in self.coals.getInitDiameterClassesList():
            for j in i:
                listTMP.append(j)
        chain = str(self._preWriteList(listTMP))
        comment = self.createComment(len(chain),self.coals.Comment["initDiameterClassesList"])
        ThermoChFile.write(chain + comment + "\n")

        chain = str(self._preWriteList(self.coals.getCDryCompositionList()))
        comment = self.createComment(len(chain),self.coals.Comment["CDryCompositionList"])
        ThermoChFile.write(chain + comment +"\n")
        
        chain = str(self._preWriteList(self.coals.getHDryCompositionList()))
        comment = self.createComment(len(chain),self.coals.Comment["HDryCompositionList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = str(self._preWriteList(self.coals.getODryCompositionList()))
        comment = self.createComment(len(chain),self.coals.Comment["ODryCompositionList"])
        ThermoChFile.write(chain + comment +"\n")

        list2write=[]

        for coal in range(self.coals.coalNumber):
            list2write.append(self.coals.getDryList()[coal])
            list2write.append(self.coals.getPCIValueList()[coal])

        chain = str(self._preWriteList(list2write))
        comment = self.createComment(len(chain),self.coals.Comment["DryList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = str(self._preWriteList(self.coals.getThermalCapacityList()))
        comment = self.createComment(len(chain),self.coals.Comment["thermalCapacityList"])
        ThermoChFile.write(chain + comment +"\n")
                           
        chain = str(self._preWriteList(self.coals.getDensityList()))
        comment = self.createComment(len(chain),self.coals.Comment["densityList"])
        ThermoChFile.write(chain + comment +"\n")
        #                   
        ThermoChFile.write("Coke\n")

        chain = str(self._preWriteList(self.coals.getCDryCompositionCokeList()))
        comment = self.createComment(len(chain),self.coals.Comment["CDryCompositionCokeList"])
        ThermoChFile.write(chain + comment +"\n")
        
        chain = str(self._preWriteList(self.coals.getHDryCompositionCokeList()))
        comment = self.createComment(len(chain),self.coals.Comment["HDryCompositionCokeList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = str(self._preWriteList(self.coals.getODryCompositionCokeList()))
        comment = self.createComment(len(chain),self.coals.Comment["ODryCompositionCokeList"])
        ThermoChFile.write(chain + comment +"\n")
        
        chain = str(self._preWriteList(self.coals.getPCICokeValueList()))
        comment = self.createComment(len(chain),self.coals.Comment["PCICokeValueList"])
        ThermoChFile.write(chain + comment +"\n")
        #
        ThermoChFile.write("Cendres\n")

        chain = str(self._preWriteList(self.coals.getAshesRatioList()))
        comment = self.createComment(len(chain),self.coals.Comment["ashesRatioList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = str(self._preWriteList(self.coals.getAshesFormingEnthalpyList()))
        comment = self.createComment(len(chain),self.coals.Comment["ashesFormingEnthalpyList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = str(self._preWriteList(self.coals.getAshesThermalCapacityList()))
        comment = self.createComment(len(chain),self.coals.Comment["ashesThermalCapacityList"])
        ThermoChFile.write(chain + comment +"\n")
        
        #
        ThermoChFile.write("Parametres de devolatilisation (modele de Kobayashi)\n")

        list2write=[]
        ind = 0
        for i in self.coals.getIY1CHList():
            j = self.coals.getY1CHList()[ind]
            list2write.append(i)
            list2write.append(j)
            ind += 1
        chain = self._preWriteList(list2write)
        comment = self.createComment(len(chain),self.coals.Comment["Y1CHList"])
        ThermoChFile.write(chain + comment +"\n")
        
        list2write=[]

        ind = 0
        for i in self.coals.getIY2CHList():
            j = self.coals.getY2CHList()[ind]
            list2write.append(i)
            list2write.append(j)
            ind += 1

        chain = self._preWriteList(list2write)
        comment = self.createComment(len(chain),self.coals.Comment["Y2CHList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = self._preWriteList(self.coals.getA1CHList())
        comment = self.createComment(len(chain),self.coals.Comment["A1CHList"])
        ThermoChFile.write(chain + comment +"\n")
        
        chain = self._preWriteList(self.coals.getA2CHList())
        comment = self.createComment(len(chain),self.coals.Comment["A2CHList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = self._preWriteList(self.coals.getE1CHList())
        comment = self.createComment(len(chain),self.coals.Comment["E1CHList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = self._preWriteList(self.coals.getE2CHList())
        comment = self.createComment(len(chain),self.coals.Comment["E2CHList"])
        ThermoChFile.write(chain + comment +"\n")

        ThermoChFile.write("Parametres de combustion heterogene\n")

        chain = self._preWriteList(self.coals.getAHETCHList())
        comment = self.createComment(len(chain),self.coals.Comment["AHETCHList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = self._preWriteList(self.coals.getEHETCHList())
        comment = self.createComment(len(chain),self.coals.Comment["EHETCHList"])
        ThermoChFile.write(chain + comment +"\n")

        chain = self._preWriteList(self.coals.getIOCHETList())
        comment = self.createComment(len(chain),self.coals.Comment["IOCHETList"])
        ThermoChFile.write(chain + comment +"\n")

        ThermoChFile.close()


    def createComment(self, length, comment):

        nb = length
        blancString = ""
        while nb < 60 :
            blancString += " "
            nb += 1
        return blancString+comment


    def _readIntValue(self, line, valueName, filePath):

        try:
            value = int(line.split()[0])
        except:
            msg = "Reading file error: " + filePath + "\n"\
                  "bad value for " + valueName
            raise ValueError, msg
        return value


    def _readFloatValue(self, line, valueName, filePath):

        try:
            value = float(line.split()[0])
        except:
            msg = "Reading file error: " + filePath + "\n" \
                  "bad value for " + valueName
            raise ValueError, msg
        return value


    def _readFloatCoalValues(self, line, valueName, filePath):
        """ read coal values"""
        try:
            strList = line.split()
            value = []
            for coal in range(self.coals.coalNumber):
                value.append(float(strList[coal]))
        except:
            msg = "Reading file error: " + filePath + "\n"\
                  "bad value for "+ valueName
            raise ValueError, msg
        return value


    def _readIntCoalValues(self, line, valueName, filePath):
        """ read coal values"""
        try:
            strList = line.split()
            value = []
            for coal in range(self.coals.coalNumber):
                value.append(int(strList[coal]))
        except:
            msg =  "Reading file error: " + filePath + " bad value for "+ valueName
            raise ValueError, msg
        return value


    def _readIntFloatCoalValues(self, line, valueName, filePath):
        """ read coal values"""
        try:
            strList = line.split()
            intValue = []
            floatValue = []
            for coal in range(0,2*self.coals.coalNumber,2):
                intValue.append(int(strList[coal]))
                floatValue.append(float(strList[coal+1]))
        except:
            msg = "Reading file error: " + filePath + " bad value for "+ valueName
            raise ValueError, msg
        return intValue, floatValue


    def _preWriteList(self, List):
        """build a line with elements list"""
        string = ""
        for i in List:
            if type(i) == type([]) :
                stringTMP = self._preWriteList(i)
                string += stringTMP + "\n"
            else:
                if string != "":
                    string += " " + str(i) + " "  
                else:
                    string += str(i)
        return string


    def getCoals(self):
        return self.coals
    

    def getSpecies(self):
        return self.species
            


syntax highlighted by Code2HTML, v. 0.9.1