#!/usr/bin/env python3 #generate bctides.in's tide harmonics from pylib import * #--------------------------------------------------------------------- #input #--------------------------------------------------------------------- tnames=['O1','K1','Q1','P1','M2','S2','K2','N2'] StartT=[2021,4,1,0] #year,month,day,hour nday=145 #number of days ibnds=[1,] #order of open boundaries (starts from 1) flags=[[5,5,4,4],] #SCHISM bnd flags for each boundary Z0=0.0 #add Z0 constant if Z0!=0.0 grd='../hgrid.ll' #hgrid.ll (includes bndinfo), or grid.npz (include lon,lat) bdir=r'/sciclone/data10/wangzg/FES2014' #FES2014 database #--------------------------------------------------------------------- #read bndinfo, amp, freq, nodal factor and tear #--------------------------------------------------------------------- #read grid information if grd.endswith('.npz'): gd=loadz(grd).hgrid; gd.x=gd.lon; gd.y=gd.lat else: gd=read_schism_hgrid(grd) #get tidal amplitude and frequency amp=[]; freq=[]; ts=loadz('{}/tide_fac_const/tide_fac_const.npz'.format(bdir)) for tname in tnames: sind=nonzero(ts.name==tname.upper())[0][0] amp.append(ts.amp[sind]); freq.append(ts.freq[sind]) #get nodal factor tdir='{}/tide_fac_improved'.format(bdir) fid=open('./tide_fac.in','w+'); fid.write('{}\n{} {} {} {}\n0\n'.format(nday,*StartT[::-1])); fid.close() os.system('ifort -o tide_fac_improved {}/tf_main.f90 {}/tf_selfe.f90; ./tide_fac_improved 0)[0]; idx[sind]=idx[sind]-1 idy=floor((yi-lat[0])/dy).astype('int'); sind=nonzero((lat[idy]-yi)>0)[0]; idy[sind]=idy[sind]-1 xrat=(xi-lon[idx])/(lon[idx+1]-lon[idx]); yrat=(yi-lat[idy])/(lat[idy+1]-lat[idy]) if sum((xrat>1)|(xrat<0)|(yrat>1)|(yrat<0))!=0: sys.exit('xrat or yrat >1 or <0') #interp for amp,pha apii=[] for k in arange(2): if k==0: v0=c_[amp0[idy,idx],amp0[idy,idx+1],amp0[idy+1,idx],amp0[idy+1,idx+1]].T; vm=100 if k==1: v0=c_[pha0[idy,idx],pha0[idy,idx+1],pha0[idy+1,idx],pha0[idy+1,idx+1]].T; vm=370 vmax=v0.max(axis=0); vmin=v0.min(axis=0) if k==1: #deal with phase jump for kk in nonzero(abs(vmax-vmin)>180)[0]: fpn=abs(v0[:,kk]-vmax[kk])>180; v0[fpn,kk]=v0[fpn,kk]+360 v1=v0[0]*(1-xrat)+v0[1]*xrat; v2=v0[2]*(1-xrat)+v0[3]*xrat; apiii=v1*(1-yrat)+v2*yrat sind=nonzero((vmax>vm)*(vmin<=vm)*(vmin>=0))[0]; apiii[sind]=vmin[sind] if sum((vmax>vm)*((vmin>vm)|(vmin<0)))!=0: sys.exit('All junks for amp or pha') apii.append(apiii) api.append(apii) ap.append(api) ap=array(ap).transpose([1,0,3,2]) #write tidal amp and pha for elev if Z0!=0: fid.write('Z0\n'); [fid.write('{} 0.0\n'.format(Z0)) for i in arange(nobn)] for m,tname in enumerate(tnames): fid.write('{}\n'.format(tname.lower())) for k in arange(nobn): fid.write('{:8.6f} {:.6f}\n'.format(*ap[0,m,k])) #write tidal amp and pha for uv if Z0!=0: fid.write('Z0\n'); [fid.write('0.0 0.0 0.0 0.0\n') for i in arange(nobn)] for m,tname in enumerate(tnames): fid.write('{}\n'.format(tname.lower())) for k in arange(nobn): fid.write('{:8.6f} {:.6f} {:8.6f} {:.6f}\n'.format(*ap[1,m,k],*ap[2,m,k])) fid.close()