예제 #1
0
    def do_plot(self, line):
        keys = matchItems(line, self.fetchSupportedKeys())

        if len(keys) == 0:
            self.lastCommandFailed("Must have at least one GenData key")
            return False

        case_list = self.shellContext()["plot_settings"].getCurrentPlotCases()

        for key in keys:
            key, report_step = key.split("@", 1)
            report_step = int(report_step)
            plot = ShellPlot("%s at report step: %d" %(key, report_step))
            for case_name in case_list:
                data = GenDataCollector.loadGenData(self.ert(), case_name, key, report_step)

                if not data.empty:
                    plot.plotGenData(data, legend_label=case_name)

                obs_key = GenDataObservationCollector.getObservationKeyForDataKey(self.ert(), key, report_step)

                if obs_key is not None:
                    obs_data = GenDataObservationCollector.loadGenDataObservations(self.ert(), case_name, [obs_key])

                    if not obs_data.empty:
                        plot.plotObservations(obs_data, obs_key)

            plot.showLegend()
예제 #2
0
    def test_gen_data_collector(self):
        config = self.createTestPath("local/snake_oil/snake_oil.ert")
        with ErtTestContext("python/enkf/export/gen_data_collector", config) as context:
            ert = context.getErt()

            with self.assertRaises(KeyError):
                data = GenDataCollector.loadGenData(ert, "default_0", "RFT_XX", 199)

            with self.assertRaises(ValueError):
                data = GenDataCollector.loadGenData(ert, "default_0", "SNAKE_OIL_OPR_DIFF", 198)

            data1 = GenDataCollector.loadGenData(ert, "default_0", "SNAKE_OIL_OPR_DIFF", 199)

            self.assertFloatEqual(data1[0][0], -0.008206)
            self.assertFloatEqual(data1[24][1], -0.119255)
            self.assertFloatEqual(data1[24][1000], -0.258516)
예제 #3
0
    def gatherGenDataData(ert, case, key):
        """ :rtype: pandas.DataFrame """
        key, report_step = key.split("@", 1)
        report_step = int(report_step)
        try:
            data = GenDataCollector.loadGenData(ert, case, key, report_step)
        except ValueError:
            data = DataFrame()

        return data.dropna() # removes all rows that has a NaN
예제 #4
0
    def test_gen_data_collector(self):
        config = self.createTestPath("Statoil/config/with_GEN_DATA_RFT/config")
        with ErtTestContext("python/enkf/export/gen_data_collector", config) as context:
            ert = context.getErt()

            with self.assertRaises(KeyError):
                data = GenDataCollector.loadGenData(ert, "default" , "RFT_XX" , 5)

            with self.assertRaises(ValueError):
                data = GenDataCollector.loadGenData(ert, "default" , "RFT_WI_1" , 90)
            
            data1 = GenDataCollector.loadGenData(ert, "default" , "RFT_WI_1" , 9)
            data2 = GenDataCollector.loadGenData(ert, "default" , "RFT_WI_2" , 5)

            self.assertFloatEqual( data1[0][0] , 346.088074)
            self.assertFloatEqual( data1[24][1] , 364.461090)
            self.assertFloatEqual( data2[0][1] ,  263.419434)

            self.assertTrue( math.isnan( data2[0][0] ) )
예제 #5
0
    def test_gen_data_collector(self):
        config = self.createTestPath("local/snake_oil/snake_oil.ert")
        with ErtTestContext("python/enkf/export/gen_data_collector",
                            config) as context:
            ert = context.getErt()

            with self.assertRaises(KeyError):
                data = GenDataCollector.loadGenData(ert, "default_0", "RFT_XX",
                                                    199)

            with self.assertRaises(ValueError):
                data = GenDataCollector.loadGenData(ert, "default_0",
                                                    "SNAKE_OIL_OPR_DIFF", 198)

            data1 = GenDataCollector.loadGenData(ert, "default_0",
                                                 "SNAKE_OIL_OPR_DIFF", 199)

            self.assertFloatEqual(data1[0][0], -0.008206)
            self.assertFloatEqual(data1[24][1], -0.119255)
            self.assertFloatEqual(data1[24][1000], -0.258516)
예제 #6
0
    def test_gen_data_collector(self):
        config = self.createTestPath("Statoil/config/with_GEN_DATA_RFT/config")
        with ErtTestContext("python/enkf/export/gen_data_collector",
                            config) as context:
            ert = context.getErt()

            with self.assertRaises(KeyError):
                data = GenDataCollector.loadGenData(ert, "default", "RFT_XX",
                                                    5)

            with self.assertRaises(ValueError):
                data = GenDataCollector.loadGenData(ert, "default", "RFT_WI_1",
                                                    90)

            data1 = GenDataCollector.loadGenData(ert, "default", "RFT_WI_1", 9)
            data2 = GenDataCollector.loadGenData(ert, "default", "RFT_WI_2", 5)

            self.assertFloatEqual(data1[0][0], 346.088074)
            self.assertFloatEqual(data1[24][1], 364.461090)
            self.assertFloatEqual(data2[0][1], 263.419434)

            self.assertTrue(math.isnan(data2[0][0]))
예제 #7
0
    def do_print(self, line):
        keys = matchItems(line, self.fetchSupportedKeys())

        if len(keys) == 0:
            self.lastCommandFailed("Must have at least one GenData key")
            return False

        case_name = self.ert().getEnkfFsManager().getCurrentFileSystem().getCaseName()

        for key in keys:
            key, report_step = key.split("@", 1)
            report_step = int(report_step)
            data = GenDataCollector.loadGenData(self.ert(), case_name, key, report_step)
            print(data)
예제 #8
0
    def run(self, output_file, trajectory_path , case_list=None, infer_iteration=True):
        """The run method will export the RFT's for all wells and all cases.

        The successfull operation of this method hinges on two naming
        conventions:
        
          1. All the GEN_DATA RFT observations have key RFT_$WELL
          2. The trajectory files are in $trajectory_path/$WELL.txt
        
        """


        wells = set()
        obs_pattern = "RFT_*"
        enkf_obs = self.ert().getObservations()
        obs_keys = enkf_obs.getMatchingKeys(obs_pattern , obs_type = EnkfObservationImplementationType.GEN_OBS)
        
        cases = []
        if case_list is not None:
            cases = case_list.split(",")

        if case_list is None or len(cases) == 0:
            cases = [self.ert().getEnkfFsManager().getCurrentFileSystem().getCaseName()]

        data_frame = pandas.DataFrame()
        for index, case in enumerate(cases):
            case = case.strip()
            case_frame = pandas.DataFrame()
            
            if not self.ert().getEnkfFsManager().caseExists(case):
                raise UserWarning("The case '%s' does not exist!" % case)

            if not self.ert().getEnkfFsManager().caseHasData(case):
                raise UserWarning("The case '%s' does not have any data!" % case)

            if infer_iteration:
                iteration_number = self.inferIterationNumber(case)
            else:
                iteration_number = index
                
            for obs_key in obs_keys:
                well = obs_key.replace("RFT_","")
                wells.add( well )
                obs_vector = enkf_obs[obs_key]
                data_key = obs_vector.getDataKey()
                report_step = obs_vector.activeStep()
                obs_node = obs_vector.getNode( report_step )
                
                rft_data = GenDataCollector.loadGenData( self.ert() , case , data_key , report_step )
                fs = self.ert().getEnkfFsManager().getFileSystem( case )
                realizations = fs.realizationList( RealizationStateEnum.STATE_HAS_DATA )
                
                # Trajectory
                trajectory_file = os.path.join( trajectory_path , "%s.txt" % well)
                trajectory = WellTrajectory( trajectory_file )
                arg = ArgLoader.load( trajectory_file , column_names = ["utm_x" , "utm_y" , "md" , "tvd"])
                tvd_arg = arg["tvd"]
                data_size = len(tvd_arg)

                
                # Observations
                obs = numpy.empty(shape = (data_size , 2 ) , dtype=numpy.float64)
                obs.fill( numpy.nan )
                for (value,std,data_index) in obs_node:
                    obs[data_index,0] = value
                    obs[data_index,1] = std
                    

                real_data = pandas.DataFrame( index = ["Realization","Well"])
                for iens in realizations:
                    realization_frame = pandas.DataFrame( data = {"TVD" : tvd_arg , 
                                                                  "Pressure" : rft_data[iens],
                                                                  "ObsValue" : obs[:,0],
                                                                  "ObsStd"   : obs[:,1]},
                                                          columns = ["TVD" , "Pressure" , "ObsValue" , "ObsStd"])
                    
                    realization_frame["Realization"] = iens
                    realization_frame["Well"] = well
                    realization_frame["Case"] = case
                    realization_frame["Iteration"] = iteration_number

                    case_frame = pandas.concat( [case_frame , realization_frame] )
                    
                data_frame = pandas.concat([data_frame, case_frame])

        data_frame.set_index(["Realization" , "Well" , "Case" , "Iteration"] , inplace = True)
        data_frame.to_csv(output_file)
        export_info = "Exported RFT information for wells: %s to: %s " % (", ".join(list(wells)) , output_file)
        return export_info