Пример #1
0
class ErtServer(object):
    DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
    site_config = None

    def __init__(self , config_file , logger):
        installAbortSignals()

        self.queue_lock = threading.Lock()
        self.ert_handle = None
        self.logger = logger
        if os.path.exists(config_file):
            self.open( config_file )
        else:
            raise IOError("The config file:%s does not exist" % config_file)

        self.initCmdTable()
        self.run_context = None
        self.init_fs = None
        self.run_fs = None
        self.run_count = 0


    def SUCCESS(self , res):
        self.logger.debug("Success: returning: %s" , res)
        return SUCCESS(res)


    def ERROR(self , res):
        self.logger.debug("ERROR: returning: %s" , res)
        return ERROR(res)


    def initCmdTable(self):
        self.cmd_table = {"STATUS" : self.handleSTATUS ,
                          "INIT_SIMULATIONS" : self.handleINIT_SIMULATIONS ,
                          "ADD_SIMULATION" : self.handleADD_SIMULATION ,
                          "GET_RESULT" : self.handleGET_RESULT ,
                          "TIME_STEP": self.handleTIMESTEP }


    def open(self , config_file):
        self.config_file = config_file
        self.ert_handle = EnKFMain( config_file )
        self.logger.info("Have connect ert handle to:%s" , config_file)


    def close(self):
        # More cleanup first ...
        self.logger.info("Shutting down ert handle")
        self.ert_handle = None


    def isConnected(self):
        if self.ert_handle:
            return True
        else:
            return False


    def __del__(self):
        if self.isConnected():
            self.close()



    def evalCmd(self , cmd_expr):
        cmd = cmd_expr[0]
        func = self.cmd_table.get(cmd)
        self.logger.info("Received command: %s" % cmd)
        
        if func:
            return func(cmd_expr[1:])
        else:
            raise KeyError("The command:%s was not recognized" % cmd)



    # The STATUS action can either report results for the complete
    # simulation set, or it can report the status of one particular
    # realisation. If the function is called with zero arguments it
    # will return the global status, if called with one argument it
    # will return the status for that realisation.
        
    def handleSTATUS(self , args):
        if self.isConnected():
            if self.run_context is None:
                return self.SUCCESS(["READY"])
            else:
                if len(args) == 0:
                    if self.run_context.isRunning():
                        return self.SUCCESS(["RUNNING" , self.run_context.getNumRunning() , self.run_context.getNumSuccess() , self.run_context.getNumFailed()])
                    else:
                        return self.SUCCESS(["COMPLETE" , self.run_context.getNumRunning() , self.run_context.getNumSuccess() , self.run_context.getNumFailed()])
                else:
                    iens = args[0]

                    if self.run_context.realisationRunning(iens):
                        return self.SUCCESS(["RUNNING"])
                    elif self.run_context.realisationFailed(iens):
                        return self.SUCCESS(["FAILED"])
                    elif self.run_context.realisationSuccess(iens):
                        return self.SUCCESS(["SUCCESS"])

        else:
            return self.SUCCESS(["CLOSED"])

    
    def initSimulations(self , args):
        run_size = args[0]
        init_case = str(args[1])
        run_case = str(args[2])
        
        fs_manager = self.ert_handle.getEnkfFsManager()
        self.run_fs = fs_manager.getFileSystem( run_case )
        self.init_fs = fs_manager.getFileSystem( init_case )
        fs_manager.switchFileSystem( self.run_fs )

        self.run_context = RunContext(self.ert_handle , run_size , self.run_fs  , self.run_count)
        self.run_count += 1
        return self.handleSTATUS([])


    def restartSimulations(self , args):
        return self.initSimulations(args)


    def handleINIT_SIMULATIONS(self , args):
        if len(args) == 3:
            result = []
            with self.queue_lock:
                if self.run_context is None:
                    self.initSimulations( args )
                else:
                    if not self.run_context.isRunning():
                        self.restartSimulations( args )
                
                result = ["OK"]
                
            return self.SUCCESS(result)
        else:
            raise IndexError("The INIT_SIMULATIONS command expects three arguments: [ensemble_size , init_case, run_case]")


    
    def handleGET_RESULT(self , args):
        iens = args[0]
        kw = str(args[2])

        try:
            year,month,day = args[1]
            time_map = self.run_fs.getTimeMap( )
            report_step = time_map.lookupTime( datetime.date( year , month , day) , tolerance_seconds_before = 24*3600 , tolerance_seconds_after = 24*3600)
        except TypeError:
            report_step = args[1]

        ensembleConfig = self.ert_handle.ensembleConfig()
        if kw in ensembleConfig:
            state = self.ert_handle.getRealisation( iens )
            node = state[kw]
            gen_data = node.asGenData()
            
            fs = self.ert_handle.getEnkfFsManager().getCurrentFileSystem()
            node_id = NodeId(report_step , iens , EnkfStateType.FORECAST )
            if node.tryLoad( fs , node_id ):
                data = gen_data.getData()
                return self.SUCCESS( ["OK"] + data.asList() )
            else:
                raise Exception("Loading iens:%d  report:%d   kw:%s   failed" % (iens , report_step , kw))
        else:
            raise KeyError("The keyword:%s is not recognized" % kw)





    # ["ADD_SIMULATION" , 0 , 1 , 1 [ ["KW1" , ...] , ["KW2" , ....]]]
    def handleADD_SIMULATION(self , args):
        geo_id = args[0]
        pert_id = args[1]
        iens = args[2]
        self.logger.debug("ADD_SIMULATION  geo_id:%d  pert_id:%d  iens:%d" % (geo_id , pert_id , iens))
        kw_list = args[3]
        state = self.ert_handle.getRealisation( iens )
        state.addSubstKeyword( "GEO_ID" , "%d" % geo_id )
        
        elco_kw = [ l[0] for l in kw_list ]
        ens_config = self.ert_handle.ensembleConfig()

        for kw in ens_config.getKeylistFromVarType( EnkfVarType.PARAMETER ):
            if not kw in elco_kw:
                node = state[kw]
                init_id = NodeId(0 , geo_id , EnkfStateType.ANALYZED )
                run_id = NodeId(0 , iens , EnkfStateType.ANALYZED )
                node.load( self.init_fs , init_id )
                node.save( self.run_fs , run_id )
            
        for kw_arg in kw_list:
            kw = str(kw_arg[0])
            data = kw_arg[1:]
            self.logger.debug("ADD_SIMULATION %s : %s" % (kw , data))
        
            node = state[kw]
            gen_kw = node.asGenKw()
            gen_kw.setValues(data)
        
            run_id = NodeId(0 , iens , EnkfStateType.ANALYZED )
            node.save( self.run_fs , run_id )
            
        self.run_fs.fsync()
        state_map = self.run_fs.getStateMap()
        state_map[iens] = RealizationStateEnum.STATE_INITIALIZED
        
        self.run_context.startSimulation( iens )
        return self.handleSTATUS([])

    def handleTIMESTEP(self, args):
        enkf_fs_manager = self.ert_handle.getEnkfFsManager()
        enkf_fs = enkf_fs_manager.getCurrentFileSystem()
        time_map = enkf_fs.getTimeMap()
        time_steps = [ ts.datetime().strftime(ErtServer.DATE_FORMAT) for ts in time_map ]

        return self.SUCCESS(time_steps)
Пример #2
0
class ErtServer(object):
    DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
    site_config = None

    def __init__(self, config_file, logger):
        installAbortSignals()

        self.queue_lock = threading.Lock()
        self.ert_handle = None
        self.logger = logger
        if os.path.exists(config_file):
            self.open(config_file)
        else:
            raise IOError("The config file:%s does not exist" % config_file)

        self.initCmdTable()
        self.run_context = None
        self.init_fs = None
        self.run_fs = None
        self.run_count = 0

    def SUCCESS(self, res):
        self.logger.debug("Success: returning: %s", res)
        return SUCCESS(res)

    def ERROR(self, res):
        self.logger.debug("ERROR: returning: %s", res)
        return ERROR(res)

    def initCmdTable(self):
        self.cmd_table = {
            "STATUS": self.handleSTATUS,
            "INIT_SIMULATIONS": self.handleINIT_SIMULATIONS,
            "ADD_SIMULATION": self.handleADD_SIMULATION,
            "GET_RESULT": self.handleGET_RESULT,
            "TIME_STEP": self.handleTIMESTEP
        }

    def open(self, config_file):
        self.config_file = config_file
        self.ert_handle = EnKFMain(config_file)
        self.logger.info("Have connect ert handle to:%s", config_file)

    def close(self):
        # More cleanup first ...
        self.logger.info("Shutting down ert handle")
        self.ert_handle = None

    def isConnected(self):
        if self.ert_handle:
            return True
        else:
            return False

    def __del__(self):
        if self.isConnected():
            self.close()

    def evalCmd(self, cmd_expr):
        cmd = cmd_expr[0]
        func = self.cmd_table.get(cmd)
        self.logger.info("Received command: %s" % cmd)

        if func:
            return func(cmd_expr[1:])
        else:
            raise KeyError("The command:%s was not recognized" % cmd)

    def handleSTATUS(self, args):
        if self.isConnected():
            if self.run_context is None:
                return self.SUCCESS(["READY"])
            else:
                if self.run_context.isRunning():
                    if len(args) == 0:
                        return self.SUCCESS([
                            "RUNNING",
                            self.run_context.getNumRunning(),
                            self.run_context.getNumComplete()
                        ])
                    else:
                        iens = args[0]
                        if self.run_context.realisationComplete(iens):
                            return self.SUCCESS(["COMPLETE"])
                        else:
                            return self.SUCCESS(["RUNNING"])
                else:
                    return self.SUCCESS(["COMPLETE"])
        else:
            return self.SUCCESS(["CLOSED"])

    def initSimulations(self, args):
        run_size = args[0]
        init_case = str(args[1])
        run_case = str(args[2])

        fs_manager = self.ert_handle.getEnkfFsManager()
        self.run_fs = fs_manager.getFileSystem(run_case)
        self.init_fs = fs_manager.getFileSystem(init_case)
        fs_manager.switchFileSystem(self.run_fs)

        self.run_context = RunContext(self.ert_handle, run_size, self.run_fs,
                                      self.run_count)
        self.run_count += 1
        return self.handleSTATUS([])

    def restartSimulations(self, args):
        return self.initSimulations(args)

    def handleINIT_SIMULATIONS(self, args):
        if len(args) == 3:
            result = []
            with self.queue_lock:
                if self.run_context is None:
                    self.initSimulations(args)
                else:
                    if not self.run_context.isRunning():
                        self.restartSimulations(args)

                result = ["OK"]

            return self.SUCCESS(result)
        else:
            raise IndexError(
                "The INIT_SIMULATIONS command expects three arguments: [ensemble_size , init_case, run_case]"
            )

    def handleGET_RESULT(self, args):
        iens = args[0]
        kw = str(args[2])

        try:
            year, month, day = args[1]
            time_map = self.run_fs.getTimeMap()
            report_step = time_map.lookupTime(
                datetime.date(year, month, day),
                tolerance_seconds_before=24 * 3600,
                tolerance_seconds_after=24 * 3600)
        except TypeError:
            report_step = args[1]

        ensembleConfig = self.ert_handle.ensembleConfig()
        if kw in ensembleConfig:
            state = self.ert_handle.getRealisation(iens)
            node = state[kw]
            gen_data = node.asGenData()

            fs = self.ert_handle.getEnkfFsManager().getCurrentFileSystem()
            node_id = NodeId(report_step, iens, EnkfStateType.FORECAST)
            if node.tryLoad(fs, node_id):
                data = gen_data.getData()
                return self.SUCCESS(["OK"] + data.asList())
            else:
                raise Exception("Loading iens:%d  report:%d   kw:%s   failed" %
                                (iens, report_step, kw))
        else:
            raise KeyError("The keyword:%s is not recognized" % kw)

    # ["ADD_SIMULATION" , 0 , 1 , 1 [ ["KW1" , ...] , ["KW2" , ....]]]
    def handleADD_SIMULATION(self, args):
        geo_id = args[0]
        pert_id = args[1]
        iens = args[2]
        self.logger.debug("ADD_SIMULATION  geo_id:%d  pert_id:%d  iens:%d" %
                          (geo_id, pert_id, iens))
        kw_list = args[3]
        state = self.ert_handle.getRealisation(iens)
        state.addSubstKeyword("GEO_ID", "%d" % geo_id)

        elco_kw = [l[0] for l in kw_list]
        ens_config = self.ert_handle.ensembleConfig()

        for kw in ens_config.getKeylistFromVarType(EnkfVarType.PARAMETER):
            if not kw in elco_kw:
                node = state[kw]
                init_id = NodeId(0, geo_id, EnkfStateType.ANALYZED)
                run_id = NodeId(0, iens, EnkfStateType.ANALYZED)
                node.load(self.init_fs, init_id)
                node.save(self.run_fs, run_id)

        for kw_arg in kw_list:
            kw = str(kw_arg[0])
            data = kw_arg[1:]
            self.logger.debug("ADD_SIMULATION %s : %s" % (kw, data))

            node = state[kw]
            gen_kw = node.asGenKw()
            gen_kw.setValues(data)

            run_id = NodeId(0, iens, EnkfStateType.ANALYZED)
            node.save(self.run_fs, run_id)

        self.run_fs.fsync()
        state_map = self.run_fs.getStateMap()
        state_map[iens] = RealizationStateEnum.STATE_INITIALIZED

        self.run_context.startSimulation(iens)
        return self.handleSTATUS([])

    def handleTIMESTEP(self, args):
        enkf_fs_manager = self.ert_handle.getEnkfFsManager()
        enkf_fs = enkf_fs_manager.getCurrentFileSystem()
        time_map = enkf_fs.getTimeMap()
        time_steps = [
            ts.datetime().strftime(ErtServer.DATE_FORMAT) for ts in time_map
        ]

        return self.SUCCESS(time_steps)
Пример #3
0
#!/usr/bin/env python
import sys
import time 
from ert.enkf import EnKFMain, RunArg, NodeId
from ert.enkf.data import EnkfNode
from ert.job_queue import JobQueueManager

ert = EnKFMain( sys.argv[1] )
fs_manager = ert.getEnkfFsManager( )
fs = fs_manager.getCurrentFileSystem( )


# Initialize the realisations. 
for iens in range( ert.getEnsembleSize()):
    realisation = ert.getRealisation( iens )
    realisation.initialize( fs )


# Fetch out the job_queue from the SiteConfig object. In addition we
# create a JobQueueManager objects which wraps the queue. The purpose
# of this manager object is to let the queue run nonblocking in the
# background.
site_config = ert.siteConfig( )
queue_manager = JobQueueManager( site_config.getJobQueue( ) )
queue_manager.startQueue( ert.getEnsembleSize( ) , verbose = False )


# Create list of RunArg instances which hold metadata for one running
# realisation, create the directory where the simulation should run
# and submit the simulation.
path_fmt = "/tmp/run%d"
Пример #4
0
class ErtServer(object):
    site_config = None

    def __init__(self, config_file, logger):
        installAbortSignals()

        self.queue_lock = threading.Lock()
        self.ert_handle = None
        self.logger = logger
        if os.path.exists(config_file):
            self.open(config_file)
        else:
            raise IOError("The config file:%s does not exist" % config_file)

        self.initCmdTable()
        self.run_context = None
        self.init_fs = None
        self.run_fs = None
        self.run_count = 0

    def SUCCESS(self, res):
        self.logger.debug("Success: returning: %s", res)
        return SUCCESS(res)

    def ERROR(self, res):
        self.logger.debug("ERROR: returning: %s", res)
        return ERROR(res)

    def initCmdTable(self):
        self.cmd_table = {
            "STATUS": self.handleSTATUS,
            "INIT_SIMULATIONS": self.handleINIT_SIMULATIONS,
            "ADD_SIMULATION": self.handleADD_SIMULATION,
            "GET_RESULT": self.handleGET_RESULT,
        }

    def open(self, config_file):
        self.config_file = config_file
        self.ert_handle = EnKFMain(config_file, ErtServer.site_config)
        self.logger.info("Have connect ert handle to:%s", config_file)

    def close(self):
        # More cleanup first ...
        self.logger.info("Shutting down ert handle")
        self.ert_handle = None

    def isConnected(self):
        if self.ert_handle:
            return True
        else:
            return False

    def __del__(self):
        if self.isConnected():
            self.close()

    def evalCmd(self, cmd_expr):
        cmd = cmd_expr[0]
        func = self.cmd_table.get(cmd)
        self.logger.info("Received command: %s" % cmd)

        if func:
            return func(cmd_expr[1:])
        else:
            raise KeyError("The command:%s was not recognized" % cmd)

    def handleSTATUS(self, args):
        if self.isConnected():
            if self.run_context is None:
                return self.SUCCESS(["READY"])
            else:
                if self.run_context.isRunning():
                    if len(args) == 0:
                        return self.SUCCESS(
                            ["RUNNING", self.run_context.getNumRunning(), self.run_context.getNumComplete()]
                        )
                    else:
                        iens = args[0]
                        if self.run_context.realisationComplete(iens):
                            return self.SUCCESS(["COMPLETE"])
                        else:
                            return self.SUCCESS(["RUNNING"])
                else:
                    return self.SUCCESS(["COMPLETE"])
        else:
            return self.SUCCESS(["CLOSED"])

    def initSimulations(self, args):
        run_size = args[0]
        init_case = str(args[1])
        run_case = str(args[2])

        fs_manager = self.ert_handle.getEnkfFsManager()
        self.run_fs = fs_manager.getFileSystem(run_case)
        self.init_fs = fs_manager.getFileSystem(init_case)
        fs_manager.switchFileSystem(self.run_fs)

        self.run_context = RunContext(self.ert_handle, run_size, self.run_fs, self.run_count)
        self.run_count += 1
        return self.handleSTATUS([])

    def restartSimulations(self, args):
        return self.initSimulations(args)

    def handleINIT_SIMULATIONS(self, args):
        if len(args) == 3:
            result = []
            with self.queue_lock:
                if self.run_context is None:
                    self.initSimulations(args)
                else:
                    if not self.run_context.isRunning():
                        self.restartSimulations(args)

                result = ["OK"]

            return self.SUCCESS(result)
        else:
            raise IndexError(
                "The INIT_SIMULATIONS command expects three arguments: [ensemble_size , init_case, run_case]"
            )

    def handleGET_RESULT(self, args):
        iens = args[0]
        report_step = args[1]
        kw = str(args[2])

        ensembleConfig = self.ert_handle.ensembleConfig()
        if ensembleConfig.hasKey(kw):
            state = self.ert_handle.getRealisation(iens)
            node = state[kw]
            gen_data = node.asGenData()

            fs = self.ert_handle.getEnkfFsManager().getCurrentFileSystem()
            node_id = NodeId(report_step, iens, EnkfStateType.FORECAST)
            if node.tryLoad(fs, node_id):
                data = gen_data.getData()
                return self.SUCCESS(["OK"] + data.asList())
            else:
                raise Exception("Loading iens:%d  report:%d   kw:%s   failed" % (iens, report_step, kw))
        else:
            raise KeyError("The keyword:%s is not recognized" % kw)

    # ["ADD_SIMULATION" , 0 , 1 , 1 [ ["KW1" , ...] , ["KW2" , ....]]]
    def handleADD_SIMULATION(self, args):
        geo_id = args[0]
        pert_id = args[1]
        iens = args[2]
        kw_list = args[3]
        state = self.ert_handle.getRealisation(iens)
        state.addSubstKeyword("GEO_ID", "%s" % geo_id)

        elco_kw = [l[0] for l in kw_list]
        ens_config = self.ert_handle.ensembleConfig()

        for kw in ens_config.getKeylistFromVarType(EnkfVarType.PARAMETER):
            if not kw in elco_kw:
                node = state[kw]
                init_id = NodeId(0, geo_id, EnkfStateType.ANALYZED)
                run_id = NodeId(0, iens, EnkfStateType.ANALYZED)
                node.load(self.init_fs, init_id)
                node.save(self.run_fs, run_id)

        for kw_arg in kw_list:
            kw = str(kw_arg[0])
            data = kw_arg[1:]

            node = state[kw]
            gen_kw = node.asGenKw()
            gen_kw.setValues(data)

            run_id = NodeId(0, iens, EnkfStateType.ANALYZED)
            node.save(self.run_fs, run_id)

        state_map = self.run_fs.getStateMap()
        state_map[iens] = RealizationStateEnum.STATE_INITIALIZED

        self.run_context.startSimulation(iens)
        return self.handleSTATUS([])
Пример #5
0
#!/usr/bin/env python
import sys
import time
from ert.enkf import EnKFMain, RunArg, NodeId
from ert.enkf.data import EnkfNode
from ert.job_queue import JobQueueManager

ert = EnKFMain(sys.argv[1])
fs_manager = ert.getEnkfFsManager()
fs = fs_manager.getCurrentFileSystem()

# Initialize the realisations.
for iens in range(ert.getEnsembleSize()):
    realisation = ert.getRealisation(iens)
    realisation.initialize(fs)

# Fetch out the job_queue from the SiteConfig object. In addition we
# create a JobQueueManager objects which wraps the queue. The purpose
# of this manager object is to let the queue run nonblocking in the
# background.
site_config = ert.siteConfig()
queue_manager = JobQueueManager(site_config.getJobQueue())
queue_manager.startQueue(ert.getEnsembleSize(), verbose=False)

# Create list of RunArg instances which hold metadata for one running
# realisation, create the directory where the simulation should run
# and submit the simulation.
path_fmt = "/tmp/run%d"
arg_list = [
    RunArg.createEnsembleExperimentRunArg(fs, iens, path_fmt % iens)
    for iens in range(ert.getEnsembleSize())
Пример #6
0
class ErtServer(object):
    site_config = None

    def __init__(self , config_file = None):
        self.ert_handle = None
        if config_file:
            if os.path.exists(config_file):
                self.open( config_file )
            else:
                raise IOError("The config file:%s does not exist" % config_file)
        self.initCmdTable()
        self.run_context = None



    def initCmdTable(self):
        self.cmd_table = {"STATUS" : self.handleSTATUS ,
                          "INIT_SIMULATIONS" : self.handleINIT_SIMULATIONS ,
                          "ADD_SIMULATION" : self.handleADD_SIMULATION ,
                          "SET_VARIABLE" : self.handleSET_VARIABLE ,
                          "GET_RESULT" : self.handleGET_RESULT }


    def open(self , config_file):
        self.config_file = config_file
        self.ert_handle = EnKFMain( config_file , ErtServer.site_config )
        


    def close(self):
        # More cleanup first ...
        self.ert_handle = None


    def isConnected(self):
        if self.ert_handle:
            return True
        else:
            return False


    def __del__(self):
        if self.isConnected():
            self.close()



    def evalCmd(self , cmd_expr):
        cmd = cmd_expr[0]
        func = self.cmd_table.get(cmd)

        if func:
            return func(cmd_expr[1:])
        else:
            raise ErtCmdError("The command:%s was not recognized" % cmd)


    def handleSTATUS(self , args):
        if self.isConnected():
            if self.run_context is None:
                return ["READY"]
            else:
                return ["RUNNING" , self.run_context.getNumRunning() , self.run_context.getNumComplete()]
        else:
            return ["CLOSED"]


    def handleINIT_SIMULATIONS(self , args):
        if len(args) == 2:
            if self.run_context is None:
                run_size = args[0]
                init_case = args[1]
                self.run_context = RunContext(self.ert_handle , run_size , init_case)
                return self.handleSTATUS([])
            else:
                raise ErtCmdError("The ert server has already started simulations")
        else:
            raise ErtCmdError("The INIT_SIMULATIONS command expects two arguments: [ensemble_size , init_case]")

    
    def handleGET_RESULT(self , args):
        iens = args[0]
        report_step = args[1]
        kw = str(args[2])
        ensembleConfig = self.ert_handle.ensembleConfig()
        if ensembleConfig.hasKey( kw ):
            state = self.ert_handle[iens]
            node = state[kw]
            gen_data = node.asGenData()
            
            fs = self.ert_handle.getEnkfFsManager().getCurrentFileSystem()
            node_id = NodeId(report_step , iens , EnkfStateType.FORECAST )
            if node.tryLoad( fs , node_id ):
                data = gen_data.getData()
                return json.dumps( ["OK"] + data.asList() )
            else:
                raise ErtCmdError("Loading iens:%d  report:%d   kw:%s   failed" % (iens , report_step , kw))
        else:
            raise ErtCmdError("The keyword:%s is not recognized" % kw)




    def handleSET_VARIABLE(self , args):
        geo_id = args[0]
        pert_id = args[1]
        iens = args[2]
        kw = str(args[3])
        ensembleConfig = self.ert_handle.ensembleConfig()
        if ensembleConfig.hasKey(kw):
            state = self.ert_handle[iens]
            node = state[kw]
            gen_kw = node.asGenKw()
            gen_kw.setValues(args[4:])
            
            fs = self.ert_handle.getEnkfFsManager().getCurrentFileSystem()
            node_id = NodeId(0 , iens , EnkfStateType.ANALYZED )
            node.save( fs , node_id )
        else:
            raise ErtCmdError("The keyword:%s is not recognized" % kw)
            


    def handleADD_SIMULATION(self , args):
        iens = args[0]
        self.run_context.startSimulation( iens )