示例#1
0
    def prepare_run(self):
        self.logger.info(
            '----------------------------------------------------------')
        self.logger.info('\tRunning: %s' % (self.exe_dirs))
        self.logger.info('\ttemplate: %s' % (self.param_tmp))
        self.logger.info('\trootdir: %s' % (self.rootdir))
        self.logger.info(
            '----------------------------------------------------------')
        self._set_environment()

        #----------------------- Load horizontal grid objects ----------
        self.logger.info('\tReading: %s' % (self.hfile))
        self.hgrid = HorizontalGrid(self.hfile,
                                    format='gr3',
                                    epsg=self.epsg,
                                    logger=self.logger)
        self.hgrid.copy_to_root(self.rootdir)

        #----------------------- Load vertical grid objects ----------
        vgrid_reader = VerticalGrid(logger=self.logger)
        if 'vfile' not in self.vgrid_config:
            self.vgrid_config['vfile'] = join(self.rootdir, 'vgrid.in')

        if not os.path.isfile(self.vgrid_config['vfile']):
            self.logger.info('\tCreating: %s' % (self.vgrid_config['vfile']))
            vgrid_reader.write(**self.vgrid_config)

        self.vgrid = vgrid_reader.load(self.vgrid_config['vfile'])

        lat0 = sum(self.hgrid.latitude) / len(self.hgrid.latitude)
        self.logger.info('\tModel starts: %s' % (self.timing["time start"]))
        self.logger.info('\tModel ends: %s' % (self.timing["time end"]))
        if isinstance(self.timing["time start"], str):
            t0 = dateutil.parser.parse(self.timing["time start"])
        else:
            t0 = self.timing["time start"]
        if isinstance(self.timing["time end"], str):
            t1 = dateutil.parser.parse(self.timing["time end"])
        else:
            t1 = self.timing["time end"]

        #  #----------------------- Download Initial and Boundary fields ----------
        if self.input_files != None:
            dwnl = download_data(t0, t1, logger=self.logger)
            for file in self.input_files.keys():
                dwnl.get_input_data(self.input_files[file])

            self.logger.info(
                '----------------------------------------------------------')
            #----------------------- Write command file (param.in) ------------------
        cfg = ModelConfig(hydro=self.hydro_config,
                          t0=t0,
                          t1=t1,
                          logger=self.logger)
        cfg.make_config(self.param_tmp, join(self.rootdir, 'param.nml'),
                        'hydro')

        # #----------------------- Set Boundary Conditions (bctides.in) -----------
        # # Store boundary arrays in each obc bctype object (Ex: self.obc['btype']['7']['iettype'])
        #t0+(t1-t0)/2 mid run ????
        if not os.path.isfile(join(self.rootdir, 'bctides.in')):
            bcinput = BCinputs(obc=self.obc,
                               hgrid=self.hgrid,
                               lat0=lat0,
                               t0=t0,
                               t0ref=t0 + (t1 - t0) / 2,
                               logger=self.logger)
            bcinput.make_bctides(join(self.rootdir, 'bctides.in'))

    #  # ------------------- Create Ocean boundary forcing -----------------
        if self.forcings:
            for key in self.forcings.keys():
                if not os.path.isfile(join(self.rootdir, key)):
                    Obf = OpenBoundaries(obc=self.forcings[key],
                                         hgrid=self.hgrid,
                                         vgrid=self.vgrid,
                                         t0=t0,
                                         t1=t1,
                                         logger=self.logger)
                    if 'tidal' in self.forcings[key]:
                        Obf.add_tide(self.forcings[key]['tidal'])

                    if 'residual' in self.forcings[key]:
                        Obf.add_res(self.forcings[key]['residual'])

                    Obf.make_boundary(join(self.rootdir, key),
                                      self.forcings[key].get('dt', 3600))

    #  # ------------------- Create Oceanic initial conditions ---------------------
        if self.ic:
            for key in self.ic:
                filename = os.path.join(self.rootdir, key)
                if not os.path.isfile(filename):
                    ic = InitialConditions(filename,hgrid=self.hgrid,t0=t0,value=self.ic[key].get('value',None),\
                     ncfile=self.ic[key].get('filename',None),\
                     var=self.ic[key].get('var',None),\
                     shapefile=self.ic[key].get('shapefile',None),
                     strength=self.ic[key].get('strength',None),
                     bnd=self.ic[key].get('bnd',None),
                     distance=self.ic[key].get('distance',None),
                     logger=self.logger)

    # #------------------------- Check/Prepare for hotstart --------------------
        if self.hotstart and not os.path.isfile(
                os.path.join(self.rootdir, 'hotstart.nc')):
            hot = HotStart(os.path.join(self.rootdir, 'hotstart.nc'),
                           config=self.hotstart,
                           hgrid=self.hgrid,
                           vgrid=self.vgrid,
                           t0=t0,
                           logger=self.logger)
            hot.set_hotstart()

        # ------------------- Create Atmospheric forcing --------------------
        if self.meteo and not os.path.isfile(
                os.path.join(self.rootdir, 'sflux', 'sflux_inputs.txt')):

            atm = Meteo(os.path.join(self.rootdir, 'sflux'),
                        t0=t0,
                        t1=t1,
                        dt=self.meteo.pop('dt'),
                        logger=self.logger)
            for key in range(1, len(self.meteo.keys()) + 1):
                filename = self.meteo[key].pop('filename')
                atm.add_dataset(filename, self.meteo[key])

            atm.make_meteo()

        if self.meteo and not os.path.isfile(
                os.path.join(self.rootdir, 'windrot_geo2proj.gr3')):
            ## Create the GR3 files
            filename = os.path.join(self.rootdir, 'windrot_geo2proj.gr3')
            ic = InitialConditions(filename,hgrid=self.hgrid,t0=t0,value=get_convergence(self.hgrid.latitude,self.hgrid.longitude,self.epsg),\
              logger=self.logger)

        if self.stations and not os.path.isfile(
                os.path.join(self.rootdir, 'station.in')):
            outputs = self.stations.pop('outputs')
            st = Station(os.path.join(self.rootdir, 'station.in'),
                         self.hgrid,
                         outputs,
                         logger=self.logger)
            for key in self.stations:
                st.add_station(self.stations[key], name=key)

            st.write_station()

        # ------------------- Create Wave boundary forcing -----------------
        if self.wave:

            h0 = cfg.config['hydro']['h0']
            deltc = cfg.config['hydro']['dt'] * cfg.config['hydro']['nstep_wwm']

            wave = Wave(root=self.rootdir,
                        hgrid=self.hgrid,
                        wwm=self.wave['config'],
                        t0=t0,
                        t1=t1,
                        deltc=deltc,
                        h0=h0,
                        logger=self.logger)
            wave.make_wave(self.wave_tmp,
                           os.path.join(self.rootdir, 'wwminput.nml'))
            wave.make_forcing(self.wave['config'].get('FILEWAVE',
                                                      'bndfiles.dat'),
                              ww3=self.wave.get('ww3', None))

        self.logger.info('FINISHED')