def READ_BBIO_DIURNALCYCLE(DATA_DIR, nx, ny, \ MONTH, DAY, YYYY, HOUR,\ CO2_DIR='CO2_200508//BBIO_DIURNALCYCLE', \ flnmpref='nep', tracer=2,category='CO2-SRCE'): # 3/4 only 2x25 for now... ext2d=bp.get_name_ext_2d() extres=bp.get_res_ext() DOY=tm.day_of_year(YYYY, MONTH,DAY) # if (DOY>59 and mod(YYYY,4)==0): # DOY=DOY+1for ireg in self.regs: SDOY=r'%3.3d' % DOY FILENAME = DATA_DIR.strip()+'/'+CO2_DIR+'/'+flnmpref.strip()+'.'+ext2d.strip()+'.'+extres.strip()+"."+SDOY # print 'read data from ', FILENAME tau0=tm.get_tau(1985,MONTH,DAY, HOUR) tau0=tau0/(3600.0) data, dunit, ios=bp.read_bpch2(FILENAME, category, tracer,tau0, \ nx, ny, 1) if (ios==0): data=squeeze(data) return data,dunit else: print('error in read data ', ios) print(FILENAME) return None, ""
def READ_BBIO_DAILYAVERAGE(DATA_DIR, nx, ny, \ MONTH, DAY, YYYY, \ CO2_DIR='CO2_200508/BBIO_DAILYAVG', \ flnmpref='/CO2.daily', tracer=3,category='CO2-SRCE'): # 3/4 only 2x25 for now... ext2d=bp.get_name_ext_2d() extres=bp.get_res_ext() DOY=tm.day_of_year(YYYY, MONTH,DAY) if (DOY>59 and mod(YYYY,4)>0): DOY=DOY+1 SDOY=r'%3.3d' % DOY FILENAME = DATA_DIR.strip()+'/'+CO2_DIR+'/'+flnmpref.strip()+'.'+ext2d.strip()+'.'+extres.strip()+"."+SDOY # print 'read data from ', FILENAME tau0=tm.get_tau(2000,MONTH,DAY) tau0=tau0/(3600.0) data, dunit, ios=bp.read_bpch2(FILENAME, category, tracer,tau0, \ nx, ny, 1) if (ios==0): data=squeeze(data) return data,dunit else: print('error in read data ', ios) print(FILENAME) return None, ""
def gen_input_geos(run_step,\ YYYY,\ DOY,\ member_start =1,\ member_end = 40,\ tmpfile="input.geos.temp",\ newfile="input.geos" ,\ temp_path = './temp/',\ run_path='./',\ data_path='./',\ out_path='./Config_files',\ diagn_path='./Diagn_files',\ n_regs = 20,\ n_sous = 2,\ sous_name = ['CH4_TAG_AN','CH4_TAG_NA'],\ temporal_res = 30,\ **keywords \ ): """ create the new input to drive the ensemble run YYYY: years of the time serier DOY: doys of the time serier em_doy: the date need emission temp_path: the path of input.geos.temp n_regs: the number of regions n_sous: the number of emission sources(defualt incloude anthr and nature) sous_name: the name of emission sources temporal_res: ensemble run temperal resolution (unit: days) """ ntime = size(YYYY) if ('time_start' in keywords): ts = keywords['time_start'] syyyy = ts[0:4] yst = int(syyyy) dst = ts[4:7] dst = int(dst) # mmst=int(smm) # sdd=ts[6:8] # ddst=int(sdd) # dst=tm.day_of_year(yst, mmst, ddst) else: yst = YYYY[0] dst = DOY[0] # list for start and ending simulation time tst = tm.doy_to_utc(dst, sec=0, yyyy=yst) tst = tst.replace('-', '') tst = tst.replace(':', '') print(tst) # if (em_step==None): # iday0=DOY[0] # for iday in DOY[1:]: # if (iday>iday0): # em_step=iday-iday0 # break # else: # iday0=iday if ('time_end' in keywords): te = keywords['time_end'] syyyy = te[0:4] yed = int(syyyy) smm = te[4:6] mmst = int(smm) sdd = te[6:8] ddst = int(sdd) ded = tm.day_of_year(yst, mmst, ddst) else: yed = YYYY[1] #-1 ded = DOY[1] #-1 # the endtime should be + timestep # yed, ded=tm.next_doy(yed, ded, em_step) tend = tm.doy_to_utc(ded, sec=0, yyyy=yed) tend = tend.replace('-', '') tend = tend.replace(':', '') print(tend) # the number of tracter # n_regs = gcdf.nregs # divided regions # n_sous = gcdf.nemis # emission sources # sous_name = gcdf.eminm diag_species = ' ' for i_spc in range(n_sous * n_regs + 1): diag_species = diag_species + str(i_spc + 1) + ' ' * 2 diag_species = diag_species + '513' enafix = r'ST%3.3d.EN%4.4d-EN%4.4d' % (run_step, member_start, member_end) temp_res_d = r'%08d' % (temporal_res) input_file = open(temp_path + tmpfile, 'r') output_file = open(out_path + newfile, 'w') ts = input_file.read().split( '------------------------+------------------------------------------------------' ) for t in ts: lines = t.strip('\n').split('\n') if lines[0] == '%%% SIMULATION MENU %%% :': for line in lines: line = line.replace('$RUNPATH', run_path) line = line.replace('$DATAPATH', data_path) if (line.split(':')[0].strip(' ') == 'Start YYYYMMDD, hhmmss'): output_file.write(line.split(':')[0] + ': ' + tst + '\n') elif (line.split(':')[0].strip(' ') == 'End YYYYMMDD, hhmmss' ): output_file.write(line.split(':')[0] + ': ' + tend + '\n') else: output_file.write(line + '\n') elif lines[0] == '%%% CH4 MENU %%% :': output_file.write(lines[0] + '\n') for line in lines: if (line.split(':')[0].strip(' ') == 'Use TCCON obs operator?' ): output_file.write(line + '\n') if (line.split(':')[0].strip(' ') == 'Use GOSAT obs operator?' ): output_file.write(line + '\n') if (line.split(':')[0].strip(' ') == 'Ensemble Temporal Res'): output_file.write( line.split(':')[0] + ': ' + str(temp_res_d) + ' ' + '0' * 6 + '\n') if (line.split(':')[0].strip(' ') == 'The Number of Regions'): output_file.write( line.split(':')[0] + ': ' + str(n_regs) + '\n') if (line.split(':')[0].strip(' ') == 'The Number of Sources'): output_file.write( line.split(':')[0] + ': ' + str(n_sous) + '\n') if (line.split(':')[0].strip(' ') == 'CH4 Sources Entries --->' ): output_file.write(line + '\n') if (len(sous_name) == n_sous): for i_sous in range(n_sous): output_file.write('Sources name : ' + sous_name[i_sous] + '\n') elif lines[0] == '%%% ADVECTED SPECIES MENU %%%:': output_file.write(lines[0] + '\n') output_file.write('Type of simulation : 9' + '\n') output_file.write('Species Entries ------->: Name' + '\n') output_file.write('Species name : CH4' + '\n') for i_sous in range(n_sous): for i_regs in range(n_regs): output_file.write('Species name : ' + sous_name[i_sous] + str(i_regs + 1) + '\n') elif 'ND51' in lines[0]: for line in lines: if (line.split(':')[0].strip(' ') == 'Tracers to include'): output_file.write( line.split(':')[0] + ': ' + diag_species + '\n') else: line = line.replace('$DATAPATH', diagn_path + '/ND51') line = line.replace('STYYY.ENXXXX-ENXXXX', enafix) output_file.write(line + '\n') #output_file.write(line+'\n') else: for line in lines: line = line.replace('$DATAPATH', diagn_path) line = line.replace('STYYY.ENXXXX-ENXXXX', enafix) output_file.write(line + '\n') output_file.write( '------------------------+------------------------------------------------------' + '\n') print('reach the end') output_file.close() input_file.close()
# observation related # obs_path=run_path+'/oco_obs/' inv_path = run_path + '/oco_inv/' # inversion directory oco_orbit_path = run_path + '/gosat_orbit/' # OCO orbit oco_ak_path = run_path + '/gosat_ak/' # OCO averaging kernel # for multiple observation view_type = 'new_iss' # ??? view_mode = "glint" # 'glint', 'nadir' or 'n16g16' obs_path = run_path + '/' + view_type + '_obs/' # observation directory def_input_file = run_path + '/input.geos' # GEOS-Chem model input file # starting time for geos chem simulation st_yyyy, st_mm, st_dd = 2009, 1, 1 st_doy = tm.day_of_year(st_yyyy, st_mm, st_dd) # day of year # time resultion in day use_fixed_mod_err = True # ??? temporal_resolution = 32 # temporal resolution for inversions in days # ??? the ending time for geos chem simulation inv_lag_window = 4 # inversion lag window = temporal_resolution*n_inv_window ntime_geos_chem = inv_lag_window # 2*inv_lag_window if used the moving window # the last day of geos-chem simulation is given by ntime * temporal_resolution inv_ntime = inv_lag_window # spatial resolution for land and ocean n_land_lat_div, n_land_lon_div = 3, 3
def gen_prior(self, timestep, ntime, yyyy0, mm0, dd0, hh0=0, mi0=0, sec0=0, \ update_state=True, errset=None, do_debug=False): """ construct a prior surface flux used for a time period starting with yyyy0, mm0, dd0 """ tau0=tm.get_tau(yyyy0, mm0, dd0, hh0, mi0, sec0) self.ntime=ntime self.timestep=timestep self.prior=zeros([self.nreg, self.ntime], float) self.err=zeros([self.nreg, self.ntime], float) for itime in range(self.ntime): tau1=tau0+timestep self.tau0.append(tau0) self.tau1.append(tau1) tau=0.5*(tau0+tau1) date_new=tm.tai85_to_utc(tau0) yyyy, mm, dd, hh, mi, sec=tm.utc_to_time_array(date_new) # print yyyy, mm, dd, hh doy=tm.day_of_year(yyyy, mm, dd) self.yyyy.append(yyyy) self.doy.append(doy) stt=EMISSCO2(yyyy,mm, dd, hh, do_debug=False) stv=self.map_to_st(stt) # for test only # if (itime in [0, 2, 4,6,8]): # stv[3]=1.80*stv[3] # stv[5]=1.80*stv[5] # stv=1.8*stv self.prior[:,itime]=stv if (itime==1 and do_debug): subplot(3,1,1) gpl.plot_map(stt, self.lon, self.lat, use_pcolor=1) subplot(3,1,2) stt2=self.st_to_map(stv) gpl.plot_map(stt2, self.lon, self.lat, use_pcolor=1) subplot(3,1,3) gpl.plot_map(self.reg_map, self.lon, self.lat, use_pcolor=1) show() if (errset==None): # err_fact=sqrt(365.0*24*3600.0/self.timestep) err_factor=5.0 self.err[1:,itime]=err_factor*self.def_err[1:] self.err[0, itime]=self.def_err[0]*stv[0] # if (itime==0): # print self.err[:,0] # print self.prior[:,0] elif (size(errset)==1): self.err[:,itime]=errset*stv[:] else: self.err[:,itime]=errset[:] tau0=tau1 self.construct_err_cov() if (update_state): self.st=array(self.prior)
def convert_geos_chem_field(yyyy, mm, dd, \ step,\ em_st,\ em_end,\ modtype=5,\ datapath="../enkf_new_2010/enkf_output/" \ ): # read in the GEOS-Chem model data sdate = r'%4.4d%2.2d%2.2d' % (yyyy, mm, dd) figdoy = tm.day_of_year(yyyy, mm, dd) # sdoy=r'%3.3d' % (doy) sem = r'ST%3.3d.EN%4.4d-EN%4.4d' % (step, em_st, em_end) full_flnm = datapath + "/" + "ts_satellite" + "." + sem + "." + sdate + ".bpch" ncflnm = datapath + "/" + "ts_satellite" + "." + sdate + ".nc" ftraceinfo = datapath + "/" + "tracerinfo" + "." + sem + ".dat" fdiaginfo = datapath + "/" + "diaginfo" + "." + sem + ".dat" # print 'Read tracer data from', full_flnm # print ftraceinfo # print fdiaginfo bpch2_ts=brw.bpch2_file_rw(full_flnm, "r", \ do_read=1, ftracerinfo=ftraceinfo,\ fdiaginfo=fdiaginfo) # print 'tracer number', bpch2_ts.ntracers # bpch2_ts.print_datainfo() # get the total co2 # CO2 profile # extract co2 data set categorys = None tracers = None tranames = ['CO2'] taus = None data_list = None data_list, founded = bpch2_ts.get_data(categorys, tracers, taus, tranames) # print len(data_list) bpdata = data_list[0] rlat = bpdata.grid.get_lat() rlon = bpdata.grid.get_lon() rz = bpdata.grid.get_z() all_data = list() for bpdata in data_list: all_data.append(bpdata.data) all_data = npy.array(all_data) # print npy.shape(all_data) # print 'save' co2 = all_data categorys = None tracers = None tranames = ['PSURF'] taus = None data_list, founded = bpch2_ts.get_data(categorys, tracers, taus, tranames) for bpdata in data_list: tn = bpdata.get_attr(['name']) gpname = tn[0].strip() gp = bpdata.data if (gpname == 'PSURF'): sp = array(gp) elif (gpname == 'AVGW'): h2o = array(gp) h2o = array(co2[0, :, :, :]) h2o[:, :, :] = 1.0e-8 # write to netcdf return rlon, rlat, rz, co2, h2o, sp
def convert_geos_chem_field(yyyy, mm, dd, \ modtype=5,\ datapath="./enkf_output_g5" \ ): # read in the GEOS-Chem model data sdate = r'%4.4d%2.2d%2.2d' % (yyyy, mm, dd) figdoy = tm.day_of_year(yyyy, mm, dd) # sdoy=r'%3.3d' % (doy) em_st = 1 em_end = 2 sem = r'EN%4.4d-EN%4.4d' % (em_st, em_end) full_flnm = datapath + "/" + "ts_satellite" + "." + sem + "." + sdate + ".bpch" ncflnm = datapath + "/" + "ts_satellite" + "." + sdate + ".nc" ftraceinfo = datapath + "/" + "tracerinfo" + "." + sem + ".dat" fdiaginfo = datapath + "/" + "diaginfo" + "." + sem + ".dat" print 'Read tracer data from', full_flnm print ftraceinfo print fdiaginfo bpch2_ts=brw.bpch2_file_rw(full_flnm, "r", \ do_read=1, ftracerinfo=ftraceinfo,\ fdiaginfo=fdiaginfo) print 'tracer number', bpch2_ts.ntracers # bpch2_ts.print_datainfo() # get the total co2 # CO2 profile categorys = None tracers = None tranames = ['CO2'] taus = None data_list = None data_list, founded = bpch2_ts.get_data(categorys, tracers, taus, tranames) print founded, len(data_list) # how change tracer number # # for example, we choose northern american region 3 # bpdata=data_list[3] # the 100 ppm backgroundfrom tracer '1' # # bpdata2=data_list[1] # co2=bpdata.data-bpdata2.data # or simply # co2=bpdata.data-100.0e-6 # the following is a special case when tracer one is coming from posteriori flux adjustment bpdata = data_list[0] bpdata2 = data_list[1] # co2=bpdata.data+bpdata2.data-100.0e-6 rlat = bpdata.grid.get_lat() rlon = bpdata.grid.get_lon() rz = bpdata.grid.get_z() categorys = None tracers = None tranames = ['PSURF', 'AVGW'] taus = None data_list, founded = bpch2_ts.get_data(categorys, tracers, taus, tranames) for bpdata in data_list: tn = bpdata.get_attr(['name']) gpname = tn[0].strip() gp = bpdata.data if (gpname == 'PSURF'): sp = array(gp) levels = rz[:] levels = array(levels) levels = levels + 1 levels = levels.astype(int) pres = pm.get_pres_mod_2d(sp, levels, 5, 1) elif (gpname == 'AVGW'): h2o = array(gp) # write to netcdf return figdoy, rlon, rlat, rz, co2, pres, sp
nusd_data = len(data_list) for idata in range(0, nusd_data): bpdata = data_list[idata] gp_list.append(bpdata.data) return rlon, rlat, rz, t, sp, gp_list # add the standard one if (__name__ == '__main__'): yyyy = 2006 for mm in range(1, 13): doy_st = tm.day_of_year(yyyy, mm, 1) if (mm < 12): doy_end = tm.day_of_year(yyyy, mm + 1, 1) doy_end = doy_end - 1 else: doy_end = tm.day_of_year(yyyy, mm, 31) doy_end = doy_end sdate = r'%4.4d%2.2d' % (yyyy, mm) ndays = doy_end - doy_st + 1 em_st, em_end = 1, 2 datapath = "/home/lfeng/local_disk_2/tag_co2/run4_nep_cp/run_" + str( yyyy) + "_new/"
def convert_geos_chem_field(yyyy, mm, dd, \ step,\ em_st,\ em_end,\ modtype=5,\ datapath="../enkf_new_2010/enkf_output/" \ ): # read in the GEOS-Chem model data sdate = r'%4.4d%2.2d%2.2d' % (yyyy, mm, dd) figdoy = tm.day_of_year(yyyy, mm, dd) # sdoy=r'%3.3d' % (doy) sem = r'ST%3.3d.EN%4.4d-EN%4.4d' % (step, em_st, em_end) full_flnm = datapath + "/" + "ts_satellite" + "." + sem + "." + sdate + ".bpch" ncflnm = datapath + "/" + "ts_satellite" + "." + sdate + ".nc" ftraceinfo = datapath + "/" + "tracerinfo" + "." + sem + ".dat" fdiaginfo = datapath + "/" + "diaginfo" + "." + sem + ".dat" print 'Read tracer data from', full_flnm print ftraceinfo print fdiaginfo bpch2_ts=brw.bpch2_file_rw(full_flnm, "r", \ do_read=1, ftracerinfo=ftraceinfo,\ fdiaginfo=fdiaginfo) print 'tracer number', bpch2_ts.ntracers # bpch2_ts.print_datainfo() # get the total co2 # CO2 profile # extract co2 data set categorys = None tracers = None tranames = ['CO2'] taus = None data_list = None data_list, founded = bpch2_ts.get_data(categorys, tracers, taus, tranames) all_data = list() for bpdata in data_list: all_data.append(bpdata.data) all_data = npy.array(all_data) print npy.shape(all_data) print 'save' all_data = 1.0e10 * all_data all_data = all_data - 100.0e4 all_data = all_data.astype(integer) fd = gzip.open('test2.bin', 'wb') fd.write(all_data) npy.save('test_npy', all_data) print 'Done 1' svt.save_array(all_data) print 'Done 2'
def create_new_input_file(run_step,\ YYYY,\ DOY,\ pbuse,\ pb_start=1,\ member_start=1, \ member_end=12, \ co2flnm='CO2_EMISSION_EN',\ tmpfile="input.geos.temp", \ newfile="input.geos.new" , \ em_step=None, \ em_doy=None,\ em_yyyy=None,\ em_pbuse=None,\ do_bk_run=4,\ data_path=gcdf.data_path,\ run_path=gcdf.run_path,\ **keywords \ ): """ create the new input to drive the ensemble run YYYY: years of the time serier DOY: doys of the time serier em_doy: the date need emission """ ntime = size(YYYY) if ('time_start' in keywords): ts = keywords['time_start'] syyyy = ts[0:4] yst = int(syyyy) dst = ts[4:7] dst = int(dst) # mmst=int(smm) # sdd=ts[6:8] # ddst=int(sdd) # dst=tm.day_of_year(yst, mmst, ddst) else: yst = YYYY[0] dst = DOY[0] tst = tm.doy_to_utc(dst, sec=0, yyyy=yst) tst = tst.replace('-', '') tst = tst.replace(':', '') print(tst) if (em_step == None): iday0 = DOY[0] for iday in DOY[1:]: if (iday > iday0): em_step = iday - iday0 break else: iday0 = iday if ('time_end' in keywords): te = keywords['time_end'] syyyy = te[0:4] yed = int(syyyy) smm = te[4:6] mmst = int(smm) sdd = te[6:8] ddst = int(sdd) ded = tm.day_of_year(yst, mmst, ddst) else: yed = YYYY[1] #-1 ded = DOY[1] #-1 # the endtime should be + timestep # yed, ded=tm.next_doy(yed, ded, em_step) tend = tm.doy_to_utc(ded, sec=0, yyyy=yed) tend = tend.replace('-', '') tend = tend.replace(':', '') print(tend) fin = open(tmpfile, "r") # open a temporary input.geos lines = fin.readlines() print(len(lines)) fin.close() fout = open(newfile, "w") # write to new input.geos file section_start = 0 colwidth = 25 line_count = 0 ntracer = member_end - member_start + 1 # enafix=r'EN%4.4d-EN%4.4d' % (member_start, member_end) enafix = r'ST%3.3d.EN%4.4d-EN%4.4d' % (run_step, member_start, member_end) for line in lines: if ("SIMULATION MENU" in line): section_start = 1 line_count = 0 fout.write(line) elif ("TRACER MENU" in line): section_start = 2 line_count = 0 fout.write(line) elif ("ND51 MENU" in line): section_start = 3 line_count = 0 fout.write(line) elif ("OUTPUT MENU" in line): section_start = 10 line_count = 0 fout.write(line) elif ("ENSEMBLE MENU" in line): section_start = 4 line_count = 0 fout.write(line) elif ("DIAGNOSTIC MENU" in line): section_start = 5 line_count = 0 fout.write(line) elif ("GAMAP MENU" in line): section_start = 6 line_count = 0 fout.write(line) elif ("PROD & LOSS MENU" in line): section_start = 7 line_count = 0 fout.write(line) elif ("ND50 MENU" in line): section_start = 8 line_count = 0 fout.write(line) elif (section_start > 0): line_count = line_count + 1 line_head = line[0:colwidth] line_left = line[colwidth:] if (section_start == 1): if (line_count == 1): new_line = line_head + " " + tst + " " fout.write(new_line + "\n") elif (line_count == 2): line_head = line[0:colwidth] new_line = line_head + " " + tend + " " fout.write(new_line + "\n") elif (line_count == 3): print(line_left) line_left = line_left.replace('$RUNPATH', run_path) new_line = line_head + line_left fout.write(new_line) elif (line_count == 4): print(line_left) line_left = line_left.replace('STYYY.ENXXXX-ENXXXX', enafix) new_line = line_head + line_left fout.write(new_line) elif (line_count == 6): line_left = line_left.replace('$DATAPATH', data_path) line_left = line_left.replace('STYYY.ENXXXX-ENXXXX', enafix) new_line = line_head + line_left fout.write(new_line) elif (line_count == 13): line_left = line_left.replace('$RUNPATH', run_path) new_line = line_head + line_left fout.write(new_line) elif (line[0:2] == '--'): line_count = 0 section_start = 0 fout.write(line) else: fout.write(line) elif (section_start == 2): # tracer menu if (line_count == 1): fout.write(line) elif (line_count == 2): line_head = line[0:colwidth] snum = r'%4d' % (ntracer) new_line = line_head + " " + snum + " " + "\n" fout.write(new_line) elif (line_count == 3): fout.write(line) elif (line_count == 4): line_head = line[0:colwidth] tracer_no = line[colwidth:colwidth + 5] line_left = line[colwidth + 5:] tracer_id = 1 tracers = list() for itracer in range(member_end - member_start + 1): st1 = r'Tracer #%3.3d ENSEM' % (itracer + member_start) lst1 = len(st1) new_head = st1[:] + ' ' * (colwidth - 1 - lst1) + ":" st1 = r'%5d' % (tracer_id) lst1 = len(st1) new_tracer_no = (5 - lst1) * ' ' + st1 new_line = new_head + new_tracer_no + line_left fout.write(new_line) tracers.append(tracer_id) tracer_id = tracer_id + 1 elif (line[0:2] == '--'): line_count = 0 section_start = 0 fout.write(line) else: pass elif (section_start == 3): # ND51 menu if (line_count == 1): fout.write(line) elif (line_count == 2): line_left = line_left.replace('$DATAPATH', data_path) line_left = line_left.replace('STYYY.ENXXXX-ENXXXX', enafix) new_line = line_head + line_left fout.write(new_line) elif (line_count == 4): line_left = "" for itracer in [1, member_end - member_start + 1]: stracer = r' %d' % (itracer) line_left = line_left + stracer line_left = line_left + ' ' + '199' # 196 198 199 200 201 output other information new_line = line_head + line_left + ' \n' print(new_line) # tx=raw_input() fout.write(new_line) elif (line[0:2] == '--'): line_count = 0 section_start = 0 fout.write(line) else: fout.write(line) elif (section_start == 4): #ensemble menu if (line_count == 1): st1 = r' %d ' % member_start new_line = line_head + st1 + ' \n' fout.write(new_line) elif (line_count == 2): st1 = r' %d ' % member_end new_line = line_head + st1 + ' \n' fout.write(new_line) elif (line_count == 3): st1 = r' %d ' % do_bk_run new_line = line_head + st1 + ' \n' fout.write(new_line) elif (line_count == 4): st1 = r' %d ' % ntime new_line = line_head + st1 + ' \n' fout.write(new_line) elif (line_count == 5): st1 = "" if (em_doy == None): em_doy = DOY for doy in em_doy: sdoy = r'%d' % doy st1 = st1 + ' ' + sdoy st1 = st1 + ' ' new_line = line_head + st1 + ' \n' fout.write(new_line) elif (line_count == 6): st1 = "" if (em_yyyy == None): for yyyy in YYYY: syyyy = r'%d' % yyyy st1 = st1 + ' ' + syyyy else: for yyyy in em_yyyy: syyyy = r'%d' % yyyy st1 = st1 + ' ' + syyyy st1 = st1 + ' ' new_line = line_head + st1 + ' \n' fout.write(new_line) elif (line_count == 7): st1 = r' %d ' % pb_start new_line = line_head + st1 + ' \n' fout.write(new_line) elif (line_count == 8): st1 = "" if (em_pbuse == None): for pbuse in pbuse: spbuse = r'%d' % pbuse st1 = st1 + ' ' + spbuse else: for pbuse in em_pbuse: spbuse = r'%d' % pbuse st1 = st1 + ' ' + spbuse st1 = st1 + ' ' new_line = line_head + st1 + ' \n' fout.write(new_line) elif (line_count == 9): # 'flnm' new_line = line_head + ' ' + co2flnm.strip() + '\n' fout.write(new_line) elif (line[0:2] == '--'): line_count = 0 section_start = 0 fout.write(line) elif (section_start == 47): #P/L menu line_head = line[0:colwidth] tracer_no = line[colwidth:colwidth + 5] line_left = line[colwidth + 5:] tracer_id = 1 tracers = list() if (line_count <= 3): # print line_count, line fout.write(line) elif (line_count == 4): st1 = r'%d' % (member_end - member_start + 1 + 5) new_line = line_head + ' ' + st1 + ' \n' fout.write(new_line) elif (line_count == 5): fout.write(line) for itracer in range(1, member_end - member_start + 1 + 5): st1 = r'Prod/Loss Family #%d' % (itracer + member_start) lst1 = len(st1) new_head = st1[:] + ' ' * (colwidth - 1 - lst1) + ":" st1 = r'%5d' % (tracer_id) lst1 = len(st1) new_tracer_no = (5 - lst1) * ' ' + st1 line_left = 'PCO: CO%3.3d' % (itracer) new_line = new_head + ' ' + line_left + '\n' fout.write(new_line) elif (line[0:2] == '--'): line_count = 0 section_start = 0 fout.write(line) else: pass elif (section_start == 5): #diagnostic menu if (line_count == 1): line_left = line_left.replace('$DATAPATH', data_path) line_left = line_left.replace('STYYY.ENXXXX-ENXXXX', enafix) new_line = line_head + line_left fout.write(new_line) elif (line[0:2] == '--'): line_count = 0 section_start = 0 fout.write(line) else: fout.write(line) elif (section_start == 6): #gamap menu if (line_count == 1): line_left = line_left.replace('$DATAPATH', data_path) line_left = line_left.replace('STYYY.ENXXXX-ENXXXX', enafix) new_line = line_head + line_left fout.write(new_line) elif (line_count == 2): line_left = line_left.replace('$DATAPATH', data_path) line_left = line_left.replace('STYYY.ENXXXX-ENXXXX', enafix) new_line = line_head + line_left fout.write(new_line) elif (line[0:2] == '--'): line_count = 0 section_start = 0 fout.write(line) else: fout.write(line) elif (section_start == 8): # ND50 menu if (line_count == 1): fout.write(line) elif (line_count == 2): line_left = line_left.replace('$DATAPATH', data_path) line_left = line_left.replace('STYYY.ENXXXX-ENXXXX', enafix) new_line = line_head + line_left fout.write(new_line) elif (line_count == 4): line_left = "" for itracer in [1, member_end - member_start + 1]: stracer = r' %d' % (itracer) line_left = line_left + stracer line_left = line_left + ' ' + '399' # output other information new_line = line_head + line_left + ' \n' fout.write(new_line) elif (line[0:2] == '--'): line_count = 0 section_start = 0 fout.write(line) else: fout.write(line) elif (section_start == 10): #output menu if (line_count == 1): id_cnt = 0 yyyy_list = list() mm_list = list() dd_list = list() for idoy in DOY: cyyyy, cmm, cdd = tm.doy_to_time_array( idoy, YYYY[id_cnt]) yyyy_list.append(cyyyy) mm_list.append(cmm) dd_list.append(cdd) id_cnt = id_cnt + 1 yyyy_list = array(yyyy_list) mm_list = array(mm_list) dd_list = array(dd_list) if ((line_count >= 1) and (line_count < 13)): line_left = line_left.replace('3', '0') sel_mm = where(mm_list == line_count) # print size(sel_mm), sel_mm if (size(sel_mm) > 0): if (size(sel_mm) == 1): sel_mm = [squeeze(sel_mm)] else: sel_mm = squeeze(sel_mm) for isel in sel_mm: sel_dd = dd_list[isel] ispace = 0 # skip the line for ichar in line_left: if (ichar != ' '): break else: ispace = ispace + 1 sel_dd = sel_dd + ispace print(line_left) if (sel_dd >= len(line_left)): sel_dd = len(line_left) - 1 if (sel_dd == 1): tline_1 = '3' else: tline_1 = line_left[0:sel_dd - 1] tline_1 = tline_1 + '3' tline_1 = tline_1 + line_left[sel_dd:] line_left = tline_1 new_line = line_head + line_left fout.write(new_line) elif (line[0:2] == '--'): # the section end line line_count = 0 section_start = 0 fout.write(line) else: fout.write(line) else: fout.write(line) fout.close() print('reach the end')