Source code for com1DFA.checkCfg

"""
    Check if the .ini file is consistent for com1DFA computations
"""

import logging
import numpy as np

# create local logger
log = logging.getLogger(__name__)


[docs]def checkCfgConsistency(cfg): """ Check the provided configuration for necessary consistency/relation between parameters for com1DFA. Parameters ----------- cfg : configuration object com1DFA configuration Returns -------- True if checks are passed, otherwise error is thrown """ # Check if Ata Parameters are consistent sphOption = float(cfg['GENERAL']['sphOption']) viscOption = float(cfg['GENERAL']['viscOption']) if viscOption == 2: if sphOption != 2: # raise an error message = ('If viscOption is set to 2 (Ata viscosity), sphOption = 2 is needed ' '(or implement the Ata viscosity for other sphOption values)') log.error(message) raise AssertionError(message) else: log.debug('Ata parameters are consistent') return True
[docs]def checkCellSizeKernelRadius(cfg): """ Check if sphKernelRadius is set to match the meshCellSize if so adapt sphKernelRadius value Parameters ----------- cfg : dict configuration settings here used: sphKernelRadius, meshCellSize Returns -------- cfg : dict updated configuration settings here used: sphKernelRadius """ # Check if Ata Parameters are consistent sphKernelRadius = cfg['GENERAL']['sphKernelRadius'] meshCellSize = cfg['GENERAL']['meshCellSize'] if sphKernelRadius == 'meshCellSize': cfg['GENERAL']['sphKernelRadius'] = cfg['GENERAL']['meshCellSize'] log.info('sphKernelRadius is set to match meshCellSize of %s meters' % meshCellSize) return cfg
[docs]def checkCfgFrictionModel(cfg, relVolume=''): """ check which friction model is chosen and if friction model parameters are of valid type if samosATAuto - check if relVolume < volClassSmall - set frictModel=samosATSmall volClassSmall <= relVolume < volClassMedium - set frictModel= samosAtMedium relVolume >= volClassMedium - set frictModel=samosAT Parameters ------------- cfg: dict configuration settings relVolume: float The release volume; optional - only needed if samosATAuto is set Returns -------- cfg: dict upated configuration settings """ frictParameters = ['musamosat', 'tau0samosat', 'Rs0samosat', 'kappasamosat', 'Rsamosat', 'Bsamosat', 'muvoellmy', 'xsivoellmy', 'mucoulomb', 'mu0wetsnow', 'xsiwetsnow', 'musamosatsmall', 'tau0samosatsmall', 'Rs0samosatsmall', 'kappasamosatsmall', 'Rsamosatsmall', 'Bsamosatsmall', 'musamosatmedium', 'tau0samosatmedium', 'Rs0samosatmedium', 'kappasamosatmedium', 'Rsamosatmedium', 'Bsamosatmedium', 'mucoulombminshear', 'tau0coulombminshear', 'muvoellmyminshear', 'xsivoellmyminshear'] # if samosATAuto check for release volume and volume class to determine which parameter setup if cfg['GENERAL']['frictModel'].lower() == 'samosatauto': if relVolume < float(cfg['GENERAL']['volClassSmall']): cfg['GENERAL']['frictModel'] = 'samosATSmall' elif float(cfg['GENERAL']['volClassSmall']) <= relVolume < float(cfg['GENERAL']['volClassMedium']): cfg['GENERAL']['frictModel'] = 'samosATMedium' elif relVolume > float(cfg['GENERAL']['volClassMedium']): cfg['GENERAL']['frictModel'] = 'samosAT' log.info('samosATAuto - release volume is %.2f and hence friction model: %s is chosen' % (relVolume, cfg['GENERAL']['frictModel'])) # fetch friction model frictModel = cfg['GENERAL']['frictModel'] # remove friction parameter values that are not used if frictModel.lower() == 'samosat': frictParameterIn = [frictModel.lower() in frictP and 'small' not in frictP and 'medium' not in frictP for frictP in frictParameters] else: if frictModel.lower() == 'coulomb': frictParameterIn = [frictModel.lower() in frictP and 'coulombminshear' not in frictP for frictP in frictParameters] elif frictModel.lower() == 'voellmy': frictParameterIn = [frictModel.lower() in frictP and 'voellmyminshear' not in frictP for frictP in frictParameters] else: frictParameterIn = [frictModel.lower() in frictP for frictP in frictParameters] for indexP, frictP in enumerate(frictParameters): if frictParameterIn[indexP]: noF = False try: float(cfg['GENERAL'][frictP]) except ValueError: noF = True if noF: message = 'Friction model used %s, but %s is not of valid float type' % (frictModel, cfg['GENERAL'][frictP]) log.error(message) raise ValueError(message) elif np.isnan(float(cfg['GENERAL'][frictP])): message = 'Friction model used %s, but %s is nan - not valid' % (frictModel, frictP) log.error(message) raise ValueError(message) else: log.info('Friction model parameter used: %s with value %s' % (frictP, cfg['GENERAL'][frictP])) return cfg