U UeU @sddlTd{ddZd|ddZd}d d Zd d Zd~ddZdddZdddZdddZdd d!Z dd"d#Z dd*d+Z d,d,d,d,gd-d-gd.d/gfd0d1Z dd2d3Z d4d5Zd6d7Zdd8d9d:Zdd;d<ZGd=d>d>Zdd?d@ZddAdBZdCdDZdEdFZddHdIZddKdLZddMdNZdOdPZdQdRZdSdTZdUdVZdWdXZddYdZZdd[d\Z dd^d_Z!ddadbZ"ddcddZ#ddedfZ$dgdhZ%ddkdlZ&ddmdnZ'ddodpZ(ddqdrZ)ddsdtZ*ddudvZ+ddxdyZ,e-dzkrdS))*NcKsj|dkrt}t||dkr$t}|dkr2t}t|d|t||d|t|||f|dS)a add annoation to the current axes at relative location to x-axis and y-axis x: relative location in x-axis, tpycially 0-1, but can be negative or larger than 1 y: relative location in y-axis, typically 0-1, but can be negative or larger than 1 note: annotation string xm: range of x-axis; gca().xlim() is used if not given ym: range of y-axis; gca().ylim() is used if not given ax: axes; gca() is used if not given **args: all other parameters used in matploblib.plot.text are also applicable E.q., rtext(0.1,0.9,"(a)",size=10,weight='bold') -> place label at top left corner note: suggest not to rearrange the x/ylim after using this function, or place this after Nr)gcascaxlimylimtextdiff)xynotexmymaxargsrI/lfs/h1/nos/estofs/noscrub/IT-stofs.v2.1.0/ush/stofs_3d_atl/pysh/mylib.pyrtextsrcCsX|dkrtj||dd}ntj||d}t|j}|j}|dkrD|S|dkrT||fSdS)a use pd.read_excel to read Excel file fname: name of Excel file sht: name of sheet_name, or number of sheet (default is 0) fmt=0: not treat 1st line as header, return data only; fmt=1: treat 1st line as header, return header and data rN) sheet_nameheader)r)pd read_excelarraycolumnsvalues)fnameshtfmtfdrfdatarrrrs rsheet_1rowc Kshddl} |ds|d}tj|rJ|dks6|dkrJtj|dddd} ntj|d dd } t|tkspt |d s|t |gg}t |}|j d kr|d kr|dddfn|dddf}|j }|d||d |}}|t | jkr|dkrt||d}|j \}}|d krr| j|}t||gd}t|D]8}t|D](}||d |d j|||f<qDq8||krt|td|||gf}|}||krt|td|||gf}|}ntd||gd}t|D]2\}}t|D]\}}||||||f<qqtdd|D}|j| |ddd|d kr|t | jkr|dkr| j|}t|j dD]:}t|j d D]$}|||f||d |d _qqv|| | fdkst| dkr\|dk rtj|d d}| j j!f|| | dkd| }| j|}t|D]<\}}t|D](\}}||||d ||d _q.q| "dS)a use xlsxwriter to write Excel file data: can be a single data, 1D array or 2D array fname: name of Excel file sht: name of sheet_name indy: starting Row index of cell for data to be written indx: starting Column index of cell for data to be written align='row': write 1D data as a row; align='column': write 1D data as a column old_font=1: for existing sheet,keep old font styles; old_font=0: discard color,fontsize,fontweight: options for specify cell font (see openpyxl.styles.Font) fmt=0: append data to existing file, or create file if not existing fmt=1: replace mode of excel file fmt=2: only replace sheet, but keep other sheets of excel file rNz.xlsxaopenpyxlreplace)modeengineZif_sheet_existsw+)r&r'__len__rr!OcSsg|] }t|qSr)list.0irrr ]szwrite_excel..F)rrindex)NNNbold)colorsizer2)#r$endswithospathexistsr ExcelWritertypestrhasattrrndimshaper,sheetsrastypeonesarangecellfontcopyr_tilec_ enumerate DataFrameto_excellenmplcolorsto_hexstylesFontclose)datarrZindyindxralignZold_fontr3fontsize fontweightrr$fiddsnynxdata0Zny0Znx0sidfontskr/dataiZdataiidfcfrrr write_excel+s`   (     *  $ &  &rccCsnt|d}i}|D]R}|d}t|dkr6q|d}|d}|dkrTq|d}|||<q|S)z7 read yaml file and return key-value dict r:r"rrr+)open readlinesstripsplitrL)rlinesparamlineslinekeyvaluerrr read_yamlos    rpmpi4pyx5672r01:00:00 screen.outrkflexgg0028c  Cs||} |dkrd||tj| <|dkr>d|||||} n|dkr\d|| ||||} n|dkr|d|| | ||||} nv|d krd || | || ||} nV|d krd || ||||||| } |d krd|| ||||||| } ntd|n|dkr|dkrd|||} n|dkrJd|| ||} | dkrd||} n|d kr|d|| ||} | dkrd||} nn|dkrd|||} | dkrd| } nB|d krd|||} |dkrd|||} ntd|| S)a get command for batch jobs on sciclone/ches/viz3 code: job script bdir: current working directory jname: job name qname: partition name (needed on some cluster/project) qnode: hpc node name nnode,ppn,wtime: request node number, core per node, and walltime fmt=0: command for submitting batch jobs; fmt=1: command for run parallel jobs rz{} {})femtoZcyclopsz=sbatch --export=ALL -J {} -N {} --ntasks-per-node {} -t {} {})ZfronterazCsbatch --export=ALL -J {} -p {} -N {} --ntasks-per-node {} -t {} {})ZmistralzPsbatch --export=ALL -J {} -p {} --account={} -N {} --ntasks-per-node {} -t {} {})Z stampede2z& {}z& {}Z run_schismzibrun ./{} >& {}zDmpiexec -envall -genv job_on_node 1 -genv bdir '{}' -n {} ./{} >& {}zhsrun --export=ALL,job_on_node=1,bdir={} -l --propagate=STACK,CORE -l --cpu_bind=verbose,cores ./{} >& {}zmodule unload python3;z3mvp2run -v -e job_on_node=1 -e bdir='{}' ./{} >& {}ryz6mvp2run -v -a -e job_on_node=1 -e bdir='{}' ./{} >& {}zunknow qnode: {},tag=2)formatr6environsysexit)codebdirZjnameqnodennodeppnZwtimeZscroutrZenameqnameZaccountZnprocZscmdrrrget_hpc_commandsJ           r epsg:4326Fc , Cst|} || } || } t|}|| k|| k} t|| }t} || _ddtt|D| _ t|dkrz| St|}t|}g}d}t||}| ||g||krq||}t|||}qg}d}t||}| ||g||krq||}t|||}qt |D]\}\}}t |D]\}\}}|||}|||}|||||f}t|} || } || } || k|| k} t|| }t|dkrq.t d |d|t|t|t|t}|dt||||}t|tt|jD]} |j| }!tt|!D]r}"|!|"jdddf}#|!|"jdddf}$|"dkrt|#tf}%t|$tf}&nt|%|#tf}%t|&|$tf}&q6t||| kdd}'| j |'t|%|&fqq.qtt|D]}"t| j |"| j |"<q|dk r|t |D]Z\}"}(t})d|)_| j |"|)_ t||)_|(dkr`d ||(n d ||( }*t|*|)q d }+|rtt |D]2\}"}(| j |"j\}%}&t|%|&|+|"d d dqt || S)a compute contour lines Input: x: array for x coordinates (ndx) y: array for y coordinates (ndy) z: matrix of data (ndy,ndx) levels: values of contour lines to be extracted (nx,ny): when ndx(ndy)>nx(ny), subdivide the domain to speed up Output: fname: when fname is not None, write contours in shapefiles prj: projection names of shapefiles show_contour: plot contours cSsg|]}gqSrrr-rrrr0sz#compute_contour..rz'extracting contours in subdomain: {}/{}rFNPOLYLINEz{}_{}z{}_m{}Zkrgbmcy?)r3lw)!isnanminmaxrsortzdatalevelsrBrLxyappendrIprintrzfigure set_visiblecontourrR collections get_pathsverticesrFNaNnonzeroextendrHr: get_prj_fileprjwrite_shapefile_dataTplotlegend),r r zrrrZ show_contourr[rZfpnzminzmaxfpzSndxZndyixsi1i2Ziysmix1ix2niy1iy2ZsxiZsyiZsziZ levels_subZhfPr_pr/xiiyiixiyisindcviccnamecsrrrcompute_contours        ,   $   $ rc'Csh|}|}|drJt|ddgd}tt|j}tt|j} n:|drzt}t|d} t | d} t | d} | \} }t |}| \}}t |}t | d}|}|} t | d}| | dkrB|d krB||d }||d }||t| |_||t| | d||_||_n td ||j|d ks||j|d ks||j| d ks||j| d krF|d kr|d krtt|t}|S|dkrzxrat<0 or xrat>1zyrat<0 or yrat>1)#r5loadzabsrrmeanrrrfrreadlinerhrifloatrRlowerrBrr|r}rrzerosrLnanrr@r<loadtxtelevflipudrfloorsumr)'r r rrrZxi0Zyi0rdxdyrXncolsnrowsxnxllynylldxyrrrlon1lon2lat1lat2rsindprridxZidysindfpsZxratZyratrZdp1Zdp2dprrrload_bathymetry s      8          (    ""       ,4     rcKs|dkrtdt|ddgdgdt|d|||gd|gd d |D]D\}}|d krpd ||}n d ||}t||gd|gd d qRdS)zX function to rewrite the inputs in job-submit scripts (e.g.run_mpi_template.py) Nzplease specify qnoderz#qnodezqnode=)r% startswithzqnode='{}'; nnode={}; ppn={} z #qnode='{}'#)r%rnote_delimiter)ZicmbZifsrstacksz{}={}z{}='{}'z{}=)r|r}rewriterzitems)rrrrrrnroZfstrrrr rewrite_inputs $ rcCstj|r(t|d}|}|ndSg} |D]H} | } d} |dk r`|D]} | | krNd} qN|dk r|D]} | | rld} ql|dk r|D]} | | rd} q|}d}|dk r | dkr | }||r|dd}q||kr| |}||d}nd}| dkr`|dk r4t |dkr.q4n.t |dkrR|d d|} n | j |} nq4| dst| d} | | q4|dk r|D]$} | ds| d} | | qt|d}|| |dS) a function to rewrite file in-situ based on conditions fname: file name replace: string pairs list; e.g. replace=['ON', 'OFF'] include: list of strings included; e.g. include=['USE_ICM'] startswith: list of strings startswith; e.g. startswith=['#USE_ICM'] endswith: list of strings endswith; e.g. endwith=['*.csv'] append: list of lines; e.g. ['add 1st line','add 2nd line'] note_delimiter: keep inline note after delimiter (ignore delimiters in the beginning) rdNrrr+  r()r6r7r8rfrgrRrhrr5findrLrstripr%r writelines)rr%includerr5rrrXrjZslinesrlrmZiflagr/ndr r]rrrrsd              rcCs\|dkrX|ds|d}t|d}t|d}t|d}|\}}t|}|\}} t| } t|d} t|d} t|dd} || dkr| dkr|| d }| | d } t } || t || _ | | t ||d| | _ | d | _| | _t|| d S) z fname: name of source DEM file sname: name of file to be saved fmt=0: convert DEM file in *.asc format to *.npz format rz.ascrdrrrrrr"float32N)r5rfrrrhrirrrRrrrBrrr@rrsavez)rsnamerrXrrrrrrrrrrrrrconvert_dem_formats.      rr"br_g皙?c  s|dkrttdddd<}|dkr0tddd}|dkrDtddd}|ttd| fd d |D_td td td d td td ddddd_ fdd |D_ tdtd| fdd |D_ t t tdddft tdddfd| d_tddddddd_tdt| tt} g_|D]}|d}| |}t|d|dk|dk}t|dkrqtt ||||d|d}t|d|}t|t|kdd}td||d||d ||d!d"d#j|qttd$d%d&|ddd'd(_|dk r|dk rt ddd)d*d+d,d-_g_t|D]T\}||tdd||} t | d.dd+d |d-}j|qtt|gd/td!d0tjd1 d2tjd3 d2tjd4 d2tjd5 d2d6}tt| |g| |gd7t_!tj"_#fd8d9}|_$| dk rڈj!j%d!d0_&t'| d:rڇfd;d t| DS)=a( plot taylor diagram, and return handles Input: R: correlation coefficient STD: normalized standard dievaiton (or standard dievation) std_max: limit of std axis ticks_R, ticks_STD, ticks_RMSD: ticks for R, STD, and RMSD cR,cSTD,cRMSD: colors for R, STD, and RMSD lw_inner, lw_outer: line widths for inner and outer lines npt: number of pts for lines labels: when labels!=None, add legend note: after changing markers' properties, call self.hl.legend() to update legends N皙?g?ffffff?Gz?rrc s2g|]*}t|td|dddqS)rr"--lsrr3)rsqrtr-)cRlw_innerrrrr0sz'plot_taylor_diagram..g ףp= ?- correlation r2i)rVrWr3rotationc sPg|]H}td|dtd|ddtt|ddddqS)g)\(?rr"{}d)rVr3)rrrzrrr-)rsmrrr0 sr"c s6g|].}|krtt|t|ddqS)rr)rcossinr-)cSTDr rirrrr0$sr-rggffffff?zstandard deviationZrg333333?gRQ?rr)r3rVrg{Gz?g)\(?RMSD)r3rVrWrzk. r_obs)msr3labelzr.)yticksxticks)rVrightFtopleftbottomgMbP?)rrc[s|jjf||_dSN)harhl)selfrrrr update_legendJsz*plot_taylor_diagram..update_legendr)cs(g|] \}}j|d|qSr)r( get_textsset_text)r.r/Zlstrrrrr0Qs)rr)(rrBrlinspaceZhp_RrrpirZht_RZht_R2Zhp_STDrrFZhp_STD2Zht_STDZhp_RMSDrrrrrrzrZht_RMSDZhp_obshprIsetprr spinesrr'axesrr*rr(r<)RSTDZstd_maxZticks_RZ ticks_STDZ ticks_RMSDrrZcRMSDr Zlw_outernptlabelsrr/rrrr(Zxiiir]r1rar*r)rrrr rrrrplot_taylor_diagramsr   @<    *   $    r9rg?c Ksx|\}}}}|\}} d||| d|d| } d|||d|d|} |d|| | | g} t| ||f|S)a return subplot position. Based on and calling get_subplot_position, but using the margin as input. Inut: margin=[left,right,up,down]: distance from left, right, up, and bottom edge for other arguments, see get_subplot_position Sample function call: [ps,pc]=get_subplot_position2(margin=[0.05,0.05,0.1,0.1],dxy=[0.00,0.00],ds=[3,4],dc=[0.01,0.005]) ps=reshape(ps,(12,4)) #to make 3D dimension array to 2 dimension for imon in arange(12)+1: axes(position=ps[imon-1]) rr)get_subplot_position) marginrrYrr$r"updownZrownZcolnZxspanZyspanp0rrrget_subplot_position2Ts   rAc s|\|\|\}tfddt|D}|dkr|\}} t|d} d| dd<|dkrd| ttt|t|<t|D]V} tD]H} | | | fdkr| | | |g| | | f<qq|dkrt|dtD]v} t|D]f} t|| | fdt gt g|dkr| | | fdkrt| | | fdt gt gqq|dkr|| gS|SdS)a return subplot position Input: p0=[x0,y0,xm,ym]: upper left subplot position dxy=[dx,dy]: space between subplots ds=[ny,nx]: subplot structure dc=[xmc,dxc]: add colorbar position with width of xmc, and distance dxc from axes sindc=[:nplot]: indices of subplot colorbars fsize=[fw,fh]: plot out subplot in figure(figsize=fsize) c s.g|]&fddtDqS)cs0g|](}|gqSrrr-)rrr_x0r y0r rrr0usz3get_subplot_position...rBr.rrr[rBr rCr )r_rr0usz(get_subplot_position..Nr*r)figsize)position) rrBrr@ravel setdiff1dprodrr4r!r ) r@rrYdcrrGrZpsZxmcZdxcpcr_r/rrFrr<gs: &   8      r<cCs8t|d|dr |}nt||ddf}|S)zu constructe data loop along the first dimension. if xi[0,...]!=xi[-1,...], then,add xi[0,...] in the end )r.).N.) array_equalrIrF)rrrrrclose_data_loopsrRc Cstt||kd}g}ggg}}}t|dkrP|d|dg}||n|d||dg}||tt|dD]T}|||d|||dg}||||||||dg} || q~||dd|dg}||t|}t|}t|dd} |t| | kdd} t|dkrdt|dd}|t||kdd}t} ||| | |||f\| _| _ | _ | _ | _ | _ | _| S)a analyze time series to find the locations where differences are larger than dx: (xi[i+1]-xi[i]>dx) return: bind: locations of differences>dx sections: continous sections where all differences are smaller than dx gaps: gap sections where differences are larger than dx slen,glen: lens for each section or gap msection,mgap: maximum section/gap rrOraxis)rrrLrrBrrrbindsectionsmsectionslengapsmgapglen) rrrrVrYr[rZsxrZgxrXrWrrrrfind_css2         .r]rcst|dkr|d}t|tr8t|}dkrt|}nt|drt|dtt|ddBrvtfdd|D}q|}|ddkr|dt|dd|d<td|dd|d<t j |}dkrt j |}n t d|S)z usage: datenum(*args,fmt=[0,1]) datenum(2001,1,1,10,23,0) or datenum([[2001,1,1],[2002,1,5]]) datenum('2001-01-01, 10:23:00') or datenum(['2001-01-1','2002-01-05']) fmt=0: output num; fmt==1: output date rrr)csg|]}t|dqS)r^datenumr-r^rrr0szdatenum..rzunknown input format)rL isinstancer; datestr2numnum2dater<rrrdatetimerMdatesdate2numr|r})rrdnumdargsrr^rr`s$       r`csd}dkrddkrddkr,dd}dkr8d d}|d krv|dkrVtd |dkrhd d g}qtd d }n:t|dkr|ddkrd}t|d|dd}nd}|dkr܈d krd|dkrdd|D}n|dkrd krd|dkr|tdd|D}nh|dkrdd kr,d|dkr|ttt|ddtt|dddd}n|dkr|d kr|dfdd|D}|dkrdd|D}||gS)u return temporal ticks and labels for plot purpose fmt: format of xtick and xticklabel 0: year; 1: month; 2: day; 3: user-defined xts: time aranges or time arrays e.g. [2000,2010],[datenum(2000,1,1),datenum(2010,1,1)],[*arange(730120,730420)] str: format of label Year: %y=01; %-y=1; %Y=2000 Month: %m=01; %-m=1; %B=January; %b=Jan Day: %d=01; %-d=1 Hour: %H=09; %-H=9; %I=[00,12]; %-I=1 Minute: %M=09; %-M=9; Second: %S=09; %-S=9 AM/PM: %p=[AM,PM] %c='Fri Jan 25 04:05:02 2008' %x='01/25/08' %X='04:05:02' Week: %a=MON; %A=Monday; %w=[0,6] Week of year: %U=[00,53]; %W=[00,53] Day of year: %j=045; %-j=45 1: 2008-02-03 2: 2008-02-03, 04:05:00 3: J,F,M,A,J,J,... (Months) 4: 03/15 (mm/dd) rrz%Y-%m-%dr"z%Y-%m-%d, %H:%M:%Sr:z%br;z%m/%dNzmust provide xts for fmt=3iig@z%YcSsg|]}t|ddqSr+r_r-rrrr0szget_xtick..cs"g|]fddtdDqS)csg|]}t|ddqSr+r_r.r_r/rrr0sz(get_xtick...rrDrErrjrr0sz%-dcsg|]}t|qSr)rcstrftimer-r;rrr0!scSsg|] }|dqSrrr-rrrr0"s) r|r}rBrLrrIr`rr)rZxtsr;Zftitxlsrrlr get_xticksX         .   rpc@seZdZdZddZdS)rzY self-defined data structure by Zhengui Wang. Attributes are used to store data cCsdSr&r)r)rrr__init__+szzdata.__init__N)__name__ __module__ __qualname____doc__rqrrrrr'src CsT|drd}|dd}|dr4d}|dd}|dkrD|d}|dkrt|j}d|krn|dg}|D]\}t|j|drvddl}z||j||j|<Wqvtd || |YqvXqvt ||}d |}|D]}|d ||}q|d }t |n<|dkrPt|dr.|` t|d }t||tj|dS)z save data as self-defined python format fmt=0: save data as *.npz (small filesize, reads slower) fmt=1: save data as *.pkl (large filesize, reads faster) if fname endswith *.npz or *.pkl, then fmt is reset to match fname .npzrN.pklrVINFO__call__zfunction {} not savedzsavez_compressed("{}" z ,{}=data.{})wb)r5r,__dict__keysremover< cloudpickledumpsrrzrrJexecryrfpickledumpHIGHEST_PROTOCOLrR) rrSrrZrvarsvarirsave_strrXrrrr.sB            rcCs|drt|dd}|dkr&|n|}t}g}|D]f}||}|jtdkrZ|d}dt|krddl}z||}WnYq8YnXtd |d q8nV|d rddl}t}t |d } || } t | j |_ | ntd |g} |j D]} |j | } d| }t| trDdtt| t| }n*t| tjr`d| j}ndt| }t| drdt| jnd}| |||qt| |_|S)zh load self-defined data "fname.npz" or "fname.pkl" svars: list of variables to be read rvT) allow_pickleNr*rzcloudpickle.cloudpicklerzvdata.z=datairxrbzunknown format: {}z{}: z{}{}z ndarray{}rdtypez ,dtype={}r+)r5loadr~rrr;rloadsrrfdcopyr}rErRr|r}rzrar,r:rLnpndarrayr>r<rrry)rrr\Zkeys0Zvdatarykeyir`rrXrSfsr/rf0f1f2rrrrUsJ            rcCs@|jdt|kr|j}t|j||j|}||}||gS)z perform least square fit usage: CC,fit_data=least_square_fit(X,Y) X: data maxtrix (npt,n) Y: data to be fitted (npt) where CC(n) is coefficient, fit_data is data fitted r)r>rLrinv)XYZCCfyrrrleast_square_fits rcCs^|j}t|}t|d|dd|}t|d|d}||td|d}|||fS)z Perform FFT for a time series, with a time interval specified usage: period,afx,pfx=mfft(xi,dt) input: xi: time series dt: time interval output: period[period],afx[amplitude],pfx[phase] rr"g@)r4fftranglerB)rdtNfxZafxpfxperiodrrrmffts rTcCsdddl}|j||j|j|d}|\}}|dkr<|d}|dkrN|d}t}||_||_|S)z Capture the command output from the system usage: S=command_outputs('ls') print(S.stderr) print(S.stdout) # normally this is the results rN)stdoutstderrshellzutf-8) subprocessPopenPIPESTDOUT communicatedecoderrr)r~rrrrroutrrrcommand_outputss    rrc&Cs|dkr"tj||d}n|dkrx|dddfd|dddf}|dddfd|dddf}t|t|}g}g}g} g} tt|} t| dkrqFt|| || d} t| }| |} | |} t|t| } | || d| || d| | | | d| | d| | | d} qg}tt|D]}t|||} | |}||}|}| |k}t |dkrqn||}q~| |d|k}t |d}||}|dddf}|dddf}t||} | j dd}| ||qVt gd}t gd}tt| D]&}t|| |f}t|||f}qrrrzrsqueeze)&ptsZpts0methodrrrr@Zps0rMrYindsinumdistZsNZinds0rZdsipsiZdsmfpind0Zp0iZpsiiZp0iiZindipindZpind0indrZn0i0rr r rBrCr/Zdistirrrnear_ptss $$        H"    rc% Cs|jdkr*|dddf}|dddf}|jd}|j\}}|dkr|dkr|jdd}|jdd} |jdd} |jdd} g} t|D].} || df}|| df}t||k|| k|| k|| kd}t|}|dkr| dqt|}t|D]}t t|||||f|t |d||ff}t t|||||f|t |d||ff}t ||}|dk}d||<qt|dkd}t|dkr| dq| ||dqt | } n|dkr8g} t|D]B}t jt |dd|f|dd|ff|}| |qt | jd} n|dkrPt||g} |dddfdddf}|dddfdddf}t|D]}||ddfdddf}||ddfdddf}t||g}td|dD]>}||||ddfdddf}||||ddfdddf}|||d|ddfdddf}|||d|ddfdddf} |||||||||| ||||||dk}!||||| |||| |||||||dk}"|!|"}#||#d||#<q|ddk||k||kB}d| |<q|dkrt| dd}$d|$| t||$fdk<|$} n$|dkr|dkr| dddf} | S)a check whether points are inside polygons usage: sind=inside_polygon(pts,px,py): pts[npt,2]: xy of points px[npt] or px[npt,nploy]: x coordiations of polygons py[npt] or py[npt,nploy]: y coordiations of polygons (npt is number of points, nploy is number of polygons) fmt=0: return flags "index[npt,nploy]" for whether points are inside polygons (1 means Yes, 0 means No) fmt=1: only return the indices "index[npt]" of polygons that pts resides in (if a point is inside multiple polygons, only one indice is returned; -1 mean pt outside of all Polygons) method=0: use mpl.path.Path method=1: use ray method explicitly note: For method=1, the computation time is proportional to npt**2 of the polygons. If the geometry of polygons are too complex, dividing them to subregions will increase efficiency. rNrr:rSrOr")r=r>rrrBrrLrrArHmodsignarrMr7Pathcontains_pointsrrargmax)%rpxpyrrr7nvZnpyZpx1Zpx2Zpy1Zpy2rr/ZpxiZpyirZisumrrrarearZsindix1y1x2y2rx3y3Zx4Zy4fp1fp2Zfp12Zsindmrrrinside_polygon(s|    (  00      2   $$((DD   rcCs|jdkrP|d|d|d|d|d|d|d|dd}nN|jdkr|d|d|d|d|d|d|d|dd}t|}|S)z` compute signed area for triangles along the last dimension (x[...,0:3],y[...,0:3]) rrr").r).r").r)r=rr)r r rrrrrs  F D rcCsX|jdkr|dddf}|jdkr4|dddf}t||j}||j}t||S)z) perform matrix division B/A rN)r=rrr)ABA2B2rrrmdivides   rc Cs|j}|jddd}||}t|dd}|d}t|}tt|||}d||<d||d<d||d<d ||d ||d <d|||d <d|||d <d|||d<tt|jd |j}||}t t |dd|} | S) zd low pass filter for 1D (data[time]) or nD (data[time,...]) array along the first dimension rrSrPgzG?gQ?rg~jt?r"gr:r;r) r>rrrArrr=r@rrealifft) rSZdelta_tZcutoff_frYmdatarrfiltr_Zlfdatarrrlpfilts$   rcCst|ddkr|d}t|dd}|}|t|j}td|dD]}||ddf|d| df||ddf<|d| df||ddf|d| df<|d|dfd|d|df<|| dd|| d<qJ||}|S)z smooth average (on the 1st dimension): xi[time,...]: time series N: window size (if N is even, then N=N+1) r"rrN.)rrrErAr>rB)rrnzrZSNZnmoveZSXrrrsmooths.0 rc Cstdtddtdtd|d}tdtdt|tdt|t|tdt|}d d tt|}|S) z calculate daytime length based on latitutde and day_of_year lat: latitude, doy: (1-365), sunrise=12-daytimelength/2, sunset=12+daytimelength/2 gd]Fx?g?r"g%T?g"u?g7d?r )arcsinrarctantanrr0arccos)rdoyrrrrrrdaytime_lengths,@rcCsl|dkrt}t}|dkr8|jjjd||fn0|dkrV|jjj||fn|jjj||dS)zd Move figure (f=gcf()) to upper left corner to pixel (x, y) e.g. move_figure(0,0,gcf()) NTkAggz+%d+%dWXAgg) gcf matplotlib get_backendcanvasmanagerwindowZ wm_geometryZ SetPositionmove)r r fbackendrrr move_figuresrc  Csxddlm} m} m}|dkr>| |}|j}|j}|j}|j}n|dkrh| |}|j}|j}|j}|j }n|dkrt |}|j d}|dddf}|dddf}|dddf}nt|dkrt |}|j d}|dddf}|dddf}|dddf}n&|dks|dkr(t d|||}|}d}|dkrJd} |dkrXd} d ||fkrnd}d }|dkr|d kr|dkrt d |||dks| dkrt d ||d t|t| td }|d t|}n@|dkr~|d kr~|dkr$t d |||dkr6t|}| dkrHt|} |||td t| td }||td }n| dkr||}}t|t|B}tt|t}tt|t}t||||||\||<||<| dkr||}}tt||dktt||dkBr4t d|dkr||dkrXt d|||_||_|j|d||dn|dkr|dkr||_||_n,|}d|||_||_||_||_||_ ||n|dks|dkrlt|dp}t|D]`}|dkr,|d|||||||dkr|d|d||||||qW5QRXn||gSdS)a tranfrom projection of files: proj(fname0,fmt0,prj0,fname1,fmt1,prj1,x,y,lon0,lat0,order0,order1) fname: file name fmt: 0: SCHISM gr3 file; 1: SCHISM bp file; 2: xyz file; 3: xyz file with line number prj: projection name (e.g. 'epsg:26918', 'epsg:4326','cpp'), or projection string (e.g. prj0=get_prj_file('epsg:4326')) lon0,lat0: center for transformation between lon&lat and x&y; if lon0=None or lat0=None, then x0=mean(lon), and y0=mean(lat) order=0 for projected coordinate; order=1 for lat&lon (if prj='epsg:4326', order=1 is applied automatically') tranform data directly: px,py=proj(prj0='epsg:26918',prj1='epsg:4326',x=px,y=py) function used: lat,lon=Transformer.from_crs('epsg:26918','epsg:4326').transform(x,y) x,y=Transformer.from_crs('epsg:4326','epsg:26918').transform(lat,lon) #x1,y1=transform(Proj(proj0),Proj(proj1),x,y); #not used anymore r)read_schism_hgridread_schism_bpfile schism_bpfilerr"Nr:z%unknown format of input files: {}, {}rZcppgTXAz"projection wrong: prj0={}, prj1={}z(need lon0 and lat0 for cpp=>ll transformr z!nan found in tranformation: x1,y1z{} should have gr3 formatz!coordinate transformed: {}=>{})Infozcoordinate transformed: {}=>{}r(z {} {} {} z {} {} {} {} ) schism_filerrrrr r rZnstarrr>r|r}rzrr0rrrrBrLr Transformerfrom_crs transformrZ write_hgridr Z write_bpfilerfwrite)Zfname0Zfmt0prj0Zfname1Zfmt1prj1r r Zlon0Zlat0Zorder0order1rrrgdrrZicppZrearthrrrrXr/rrrprojs       $   $ ( *          6r epsg:26918cCst||||d\}}||gS)z convert projection of points from prj1 to prj2 x,y: coordinate of pts prj1: name of original projection prj2: name of target projection )rrr r )r)r r rZprj2rrrrrproj_ptsBsr%D:\Work\Database\projection\prj_filesc Cstjt}|dkr,td|}|j|S|dkrHtd|}|jS|dkrt|}t}|D]^}t d|}|szqdt | d} t d||d } | } | |d| <W5QRXqd|Std d S) a return projection name or entire database (dict) fmt=0: get one projection fmt=1: return dict of projection database fmt=-1: process *.prj files from prj_dir #-------online method----------------- #function to generate .prj file information using spatialreference.org #def getWKT_PRJ (epsg_code): # import urllib # # access projection information # wkt = urllib.urlopen("http://spatialreference.org/ref/epsg/{0}/prettywkt/".format(epsg_code)) # # remove spaces between charachters # remove_spaces = wkt.read().replace(" ","") # # place all the text on one line # output = remove_spaces.replace(" ", "") # return output rz {}/prj.npzrrOzepsg.(\d+).prj{}/{}rdzepsg:{}z unknow fmtN)r6r7dirname__file__rrzrlistdirdictrematchrgroupsrfrrhr|r}) prjnamerZprj_dirrrfnamesrrr5Zprj_numrXrlrrrrLs(     rcCsddlm}|dr"|dd|dkr.|}tj|d}t}|D]Z}|dr\qLt||}t |j t j st dd|D}|d kr|d }td |qLt||dS) z convert MATLAB file to zdata examples: 1. convert_matfile('wqdata.mat') 2. convert_matfile('wqdata') 3. convert_matfile('wqdata','sfdata') r)ioz.matNrw__cSs$g|]}t|dkr|dndqS)rr+)rLr-rrrr0sz#convert_matfile..)ZDoyrinzS.{}=squeeze(valuei))scipyr r5rZloadmatrr~rr issubdtyperrnumberrrrzr)Z name_matfileZ name_saver CrrZvalueirrrconvert_matfiles"     rc Cs*|}|}t|}t|}t}||}t|} t|} t||d|_t||_tt||_t|d|_ t||_dt |dt t||t||d|_ |dkrt j ||\} |_| |_| |_ttt||d|jt||||d|j|jg|_|S)z compute statistics between two time series x1, x2 must have the same dimension x1: model; x2: obs fmt=1: compute pvalue using scipy.stats.pearsonr #import matlab.engine #eng=matlab.engine.start_matlab() )rrr"r)rrstdcorrcoefr5ZMErZMAErrrrrstatsZpearsonrpvaluestd1std2rZtaylor) Zxi_modelZxi_obsrrrZmx1Zmx2rrrrr#rrrget_stats(   2Rrc sddl}||t}j|_j|_g|_t|jD]@}t |j }t |j dd}|j t||tddq.rcsg|]}t|qSr)r:recordr.rrrrr0sr*. {}/{}.prjrd)% shapefileReaderrZ numRecordsnrecZ shapeTypeNamer:rrBrr>pointspartsrinsertrrrLrattnamerecordsrr@attvalueZatttyper6r7rabspathbasenamerirzr8rfrrhr) rshprr/ZxyiZpartistypeZsvaluerrbnamer rXrrrread_shapefile_datas2$$  "r/rc sddl}jdkrBjjtdkr4tdtqjjd}n@jdksVjdkrxjjtdkrrtj}qd}n td t d r|j krtd t| |2}d|_ t d rj jtdkrfd dttjD}nJj jdkrtj dg}n*j jdkr>fddttjD}tt|D]}||tjtjtjtjtjfkr|j|dn||tjtjtjtjfkr|j|d||nN||tjtjtjtjfkr|j|ddntd ||tqJn|dd|!t|D]RjdkrRj} |j"| njdkrjjtdkr|j} nj} t#| d} |$| nXjdkrjjtdkrˆj} nj} t#| d} dd| dDg} |%| t d r*j jtdkr,fddtt|D} nFj jdkrHj g} n*j jdkrrfddtt|D} |j!| q*t&j'(|)dd} t&j'*t&j'+|} t drt,d | | d}|-j.W5QRXW5QRXdS)a9 write shapefile fname: file name S: data to be outputed example of S: S.type=='POINT' S.xy=c_[slon[:],slat[:]] S.prj=get_prj_file('epsg:4326') S.attname=['station'] S.attvalue=station[:] note: only works for geometry: POINT, POLYLINE, POLYGON rNZPOINTr*zS.xy has a dtype="O" for POINTrZPOLYGONrz unknow typer#znrec inconsistentr'csg|]}tj|dqSrmr:r)rr.rrr0<sz(write_shapefile_data..r"csg|]}tj|dqSrmr1rr.rrr0AsrFrrzattribute type not included: {}fieldcSsg|] }|qSrrrirrrr0escsg|]}j|qSrr)rrr/rrr0kscsg|]}j|qSrr4rr5rrr0psrrr r()/r!r:rrrr|r}r>rLr<r#WriterZ autoBalancer)rBr'r=rrint8int16int32int64r3rfloat16rfloat64Zstr0r;str_string_rzrpointdelete_shapefile_nanrlpolyr6r7r+rirr*rfrr)rrZ float_lenZ float_decimalr,r#Wr-rZvalivaliiZattir.rrXrr5rrs       "              rc Cs|jdkrZd}|jd}t|dr(d}t|dr<|d}|||}tt|d}nd|jdkrd}|jd}t|drd}t|dr|d}|||}tt|dddfd}t|dkr|dkrt|}|g}ng}|d|d}|dkrt|}||tt|dD]F}||d}||d}|||}|dkr\t|}||q"||ddd}|dkrt|}|||S)z> delete nan (head and tail), and get ind for the rest rrrOr")rr)rOrN)r=r>rrrLrRrrB) rZilooprrrrrrrrrrr@zsN                  r@cs`t||dkrS|dkrRt}j|_g|_ddjD}||_g|_g|_|D].}|jj|j |jj| qX|jd |j|jd |j }||_ |D]}td ||qˆj}t||_|D]T}|dkrt}j|j} | |_fd d| D|_j|d d |_j| |_ j| D]$} j|| } td | q\|dkrtt|j|_tt|j|_ttt|j} |j| |_d ||jj} nL|d kr*tj|d d }|dkr|tt|j}d ||j} |j| td |q|Stdd S)a read netcdf files, and return its values and attributes fname: file name fmt=0: reorgnaized Dataset with format of zdata fmt=1: return netcdf.Dateset(fname) fmt=2: reorgnaized Dataset (*npz format), ignore attributes order=1: only works for med=2; change dimension order order=0: variable dimension order read not changed for python format order=1: variable dimension order read reversed follwoing in matlab/fortran format r)rr"cSsg|]}|qSrrr-rrrr0szReadNC..z dimname: {}zdim: {}zF.{}=C.getncattr("{}")rcsg|]}j|jqSr) dimensionsr4)r.jrrrr0sNz fi.{}=ncattriz{}:{}r"zF.{}=fir)Datasetr file_formatryrDdimnamedims dim_unlimitedrr4 isunlimitedrzncattrsattrsr variablesrvarsval getncattrr,rrBr= transposer>fliprRr|r})rrorderr2ncdimsr/rLncvarsfiZdimirEZncattrinmZvinforrrReadNCsb         rYcCs|dkrt|d|jd}|d|j|}|D]}td||q4dd|jD}|D]8}|j|dkr||d q^|||j|j q^d d|j D}|d kr(|D]n} | | |j | j |j | j} |j | D]} | | |j |  | q|j | d d |j | d d <qn|dkr|D]} | | |j | j t|j | j} |j | D]} | | |j |  | qjttt|j | d d } |j | d d | |j | d d <q6|n |d krt|d|jd}|d|jt|d r0|jD]}td||qtt|jD]X}t|d rZ|j|} nd} | dkr|||j|d n||j||j|q>|d kr|jD]p} td| }| | |jj |j} t|d r|jD] }td|} | || q|j|j | d d <qn|dkr|jD]} td| }| | |jj t|j} t|d r|jD] }td|} | || qht|jdkrttt|j} |j| |j | d d <n|j|j | d d <q,|d S)aZ write zdata to netcdf file fname: file name data: soure data fmt=0, data has zdata() format fmt=1, data has netcdf.Dataset format order=0: variable dimension order written not changed for python format order=1: variable dimension order written reversed follwoing in matlab/fortran format rw)rzrGzfid.setncattr('{}',data.{})cSsg|]}|qSrrr-rrrr0szWriteNC..TNcSsg|]}|qSrrr-rrrr0srrMrJFzdata.{}zvi.{}r")rFrG setncattrrLrrzrDrKcreateDimensionr4rNcreateVariablerrQrrBr=rRrRr<rMrangerLrIrJrHrOevalrP)rrSrrTrXrLr/rUrVrvidZattrirXZdim_flagrrErrrWriteNCsz  $ "*               rac Kst|ds|dkr,tddddddd d g}nh|d krZtddddddd d d d ddddg}n:|dkrtddddddddddd d d d dddddddg}t||fd|i|}t|j|jd}t|D]J\}} ||j|d t|j|d ||dd|j |d }q|S)a; construct time series using harmonics: used to fill data gap, or extrapolation [oti,oyi,dt]: observed (time, value, time interval) mti: time to interpolate/extrapolate tidal_names=0/1/2: tidal names options; tidal_names=['O1','K1','Q1','P1','M2','S2',]: list of tidal consituent names r)rZO1K1ZQ1ZP1M2ZS2K2N2rZM3M4M6ZM7M8ZM10r"SAZSSAZMMMSFZN4ZS4ZS6 tidal_namesQ) r<rharmonic_analysisrr> amplituderIrfreqphase) ZotiZoyirZmtirkrHZmyir_tnamerrr harmonic_fitEs &2Drsc Cshddl}|dkrd}|dkr d}|dkr,d}dtjt} |dkrddl} | ddg} | d kr|d d | Dd}n6| d krd d | Dd}nt d| |dkrt d|dkrd| }nt |t sXtd| } tt| j| j} t|d}|dt||D]$}|d|| |q&||}t|d}t|D](\}}|d|||d|qj||||||gt}tdd t|dDj\|_|_|_ t|j!d|_t|j !d|_ t"dtdd t|ddddD!df|_t#|t#|tj$|rdt#||S)a harmonic analyze time series data: time series dt: time step (day) t0: starting time of time series (day); normally use datenum (e.g. datenum(2010,0,0)) tidal_names: 1) path of tidal_const.dat, or 2) names of tidal consituents code: path of executable (tidal_analyze, or tidal_analyze.exe) for HA analysis [tname,fname,sname]: temporary names for tidal_const, time series, and HA results rNz!.temporary_tidal_const_for_HA.datz!.temporary_time_series_for_HA.datz'.temporary_tidal_consituents_for_HA.datz!{}/../pyScripts/Harmonic_AnalysiszD:\Work\Harmonic_Analysisz~/bin/Harmonic_AnalysiswindowscSs(g|] }tjd|rd|qS)z{}/tidal_analyze.exer6r7r8rzr-rrrr0vsz%harmonic_analysis..linuxcSs(g|] }tjd|rd|qS)z{}/tidal_analyzerur-rrrr0xszOperating System unknow: {}z(exectuable "tidal_analyze" was not foundz{}/tidal_const.datz{}/tide_fac_const.npzr(z{} z{} {} z{:12.1f} {:12.7f} rlcSsg|]}|qSr)rhrir-rrrr0srdrcSsg|] }|qSr)rhr-rrrr0sr")%rrzr6r7rrplatformsystemrrr|r}rar;rrzipnamerorfrrLupperrRrIcallrrrgrZ tidal_namernrpr@rFrr8)rSrt0rkr~rrrrrZsdirrwZbdirsrZtdictrXr/r`rrrrrm^sX      " "*6  rm./HYCOMc8 Csdddddgg}dddd d gg}t|}t|}|jd krR|d d d f}|d d d f} |d d d f} t| | f} |jd dkr|d d df} t| | | f} t}|d d d f|_|d d d f|_ |jd dkr|d d df|_ t}|D]}||}||}t }g}g}t ||d D]z}t |}t |d d}t|trdd|d |d|d}d|d |d|d}tjd||sq2tjd||s̐q2t|d|td||}td||d}td|d td|d t|j|_|jdk}t|j|_|jdk}t|j|<t|j|<nzd||d|d}tjd||sq2t|td||}td|t|j|_|jdk}t|j|<t|j jt|j jd}t|jj}t|dd}t|j j} t!|t| dk|t| dkd }!t!| t| dk| t| dkd }"|!}#|#t"|!}$|"}%|%t"|"}&||#|$}| |%|&} |dkrt t"|D]}'t#|j|'|%|&|#|$f}(|d kr^t$j%j&| |f|(td})|)| }*t'|*}t(|d krt$j%)| |d d f|*|| |d d fd|*|<nd|d krt*|| \}+},t'|(+}-|++|-}+|,+|-},|(+|-}(t$j%)t|,|+f|(| d}*|,||'|,|*qƐq2t|j-j}.t!|.| dk|.| dkd }/|/}0|0t"|/}1|.|0|1}.t t"|D]f}'|,||'t#|j|'|0|1|%|&|#|$f}(t$j%j&|.| |f|(td})|)| }*t'|*}t(|d krt$j%)| |d d f|*|| |d d fd|*|<t|trt#|j|'|0|1|%|&|#|$f}2t$j%j&|.| |f|2td})|)| }3t'|3}t(|d kr~t$j%)| |d d f|3|| |d d fd|3|<|,t.t/|*d t/|3d fn |,|*qBq2t|}t|j0}||_ |jdkr(g}4t |jd D](}5t%j1|||5dd})|4,|)|qt|4}4td |qg}4g}6t |jd D]J}5t%1|||5d f})t%1|||5d f}7|4,|)||6,|7|q>t|4}4t|6}6td |d td!|d q|S)"a$ extract Hycom time series at stations ti: time seires; xyz=c_[loni,lati,depi]; vind: list of index for variables to be extracted. [0,1,2,3] for ['elev','temp','salt','uv'] hdir: directory for hycom data method=0: linear interpolation; method=1: nearest interpolation Zsurf_elZ water_tempsalinityZwater_uZwater_vrtempsaltZUxZUyrNrr:r"gllF?zHycom_{}_{}_{}.ncz %Y%m%dZ%H%M00rz; zp.val=C.{}.valzp.val2=C2.{}.valiъrihr) fill_valuenearestir extrapolatez S.{}=dataiz S.{}=data2i)2rrceilrr=rHr>rr r rtimerBrcrar,rzrkr6r7r8rrYrrrPZval2rrb time_originrrrrrLrr interpolateRegularGridInterpolatorrrgriddatameshgridrIrdepthrF expand_dimsrinterp1d)8TimexyzZvindZhdirrZVarZVarNameZStartTZEndTZloniZlatiZbxyZdepiZbxyzrrr/rZvarnameir}ZT0ZData0tit1t2rZfname2rC2rrZcloniZclatiZind_lonZind_latZi1_lonZi2_lonZi1_latZi2_latrrCrrZcloniiZclatiirZcdepiZind_depZi1_depZi2_depZval2iiZv2ir`r_Zdata2ifd2rrr get_hycoms             ((     8   (  "6 "6   r__main__)NNN)rr) r rrrr!rNNN) rqrrrrrsrtrrkrurv)NrFrr)Nr)Nrr)NNNNNN)r) NNr"NNNrr_rrr"rN)NNN)rNN)r)N)T)rr)rr)rrN) NNNNNNNNNNrr)rr)rrr)N)r)r0r)r)rr)rr)r)rNNNNN)r~r).pylibrrrcrprrrrrrr9rAr<rRr]r`rprrrrrrrrrrrrrrrrrrrr/rr@rYrarsrmrrrrrrrs   D 7 V ~  I  P  $" E ' =  a Y  %  T a  , i & C b  8